标签:-- reason input 直接 mem not 链接 name nta
题目链接:http://poj.org/problem?id=1269
Time Limit: 1000MS Memory Limit: 10000K
Description
Input
Output
Sample Input
5 0 0 4 4 0 4 4 0 5 0 7 6 1 0 2 3 5 0 7 6 3 -6 4 -3 2 0 2 27 1 5 18 5 0 3 4 0 1 2 2 5
Sample Output
INTERSECTING LINES OUTPUT POINT 2.00 2.00 NONE LINE POINT 2.00 5.00 POINT 1.07 2.20 END OF OUTPUT
题意:
给出四个点的坐标,分别用来表示两条直线,求两条直线的关系是共线还是平行还是相交,若是相交则给出交点坐标(保留小数点后两位)。
题解:
直接套用模板中的点到直线距离以及求直线交点的函数模板即可。
AC代码:
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; //--------------------------------------计算几何模板 - st-------------------------------------- const double eps = 1e-6; const double M_PI = 3.14159265358979323846; struct Point{ double x,y; Point(double tx=0,double ty=0):x(tx),y(ty){} }; typedef Point Vctor; //向量的加减乘除 Vctor operator + (Vctor A,Vctor B){return Vctor(A.x+B.x,A.y+B.y);} Vctor operator - (Point A,Point B){return Vctor(A.x-B.x,A.y-B.y);} Vctor operator * (Vctor A,double p){return Vctor(A.x*p,A.y*p);} Vctor operator / (Vctor A,double p){return Vctor(A.x/p,A.y/p);} bool operator < (Point A,Point B){return A.x < B.x || (A.x == B.x && A.y < B.y);} struct Line{ Point p; Vctor v; Line(Point p=Point(0,0),Vctor v=Vctor(0,0)):p(p),v(v){} Point point(double t){return p + v*t;} //获得直线上的距离p点t个单位长度的点 }; struct Circle{ Point c; double r; Circle(Point tc=Point(0,0),double tr=0):c(tc),r(tr){} Point point(double a){return Point( c.x + cos(a)*r , c.y + sin(a)*r);} }; int dcmp(double x) { if(fabs(x)<eps) return 0; else return (x<0)?(-1):(1); } bool operator == (Point A,Point B){return dcmp(A.x-B.x)==0 && dcmp(A.y-B.y)==0;} //向量的点积,长度,夹角 double Dot(Vctor A,Vctor B){return A.x*B.x+A.y*B.y;} double Length(Vctor A){return sqrt(Dot(A,A));} double Angle(Vctor A,Vctor B){return acos(Dot(A,B)/Length(A)/Length(B));} //叉积,三角形面积 double Cross(Vctor A,Vctor B){return A.x*B.y-A.y*B.x;} double TriangleArea(Point A,Point B,Point C){return Cross(B-A,C-A);} //向量的旋转,求向量的单位法线(即左转90度,然后长度归一) Vctor Rotate(Vctor A,double rad){return Vctor( A.x*cos(rad) - A.y*sin(rad) , A.x*sin(rad) + A.y*cos(rad) );} Vctor Normal(Vctor A) { double L = Length(A); return Vctor(-A.y/L, A.x/L); } //直线的交点 Point getLineIntersection(Line L1,Line L2) { Vctor u = L1.p-L2.p; double t = Cross(L2.v,u)/Cross(L1.v,L2.v); return L1.p + L1.v*t; } //点到直线的距离 double DistanceToLine(Point P,Line L) { return fabs(Cross(P-L.p,L.v))/Length(L.v); } //--------------------------------------计算几何模板 - ed-------------------------------------- double x[5],y[5]; Line L1,L2; int CheckTwoLines(Line L1,Line L2)//1-共线,2-平行,3-相交 { if(dcmp( L1.v.x * L2.v.y - L2.v.x * L1.v.y ) == 0 ) //两直线的方向向量平行 { if( DistanceToLine(L1.p,L2) < eps ) //直线1上的点也在直线2上 return 1; else return 2; } else return 3; } int main() { int t; scanf("%d",&t); printf("INTERSECTING LINES OUTPUT\n"); while(t--) { for(int i=1;i<=4;i++) scanf("%lf%lf",x+i,y+i); L1=Line(Point(x[1],y[1]),Point(x[2],y[2])-Point(x[1],y[1])); L2=Line(Point(x[3],y[3]),Point(x[4],y[4])-Point(x[3],y[3])); int relation=CheckTwoLines(L1,L2); if(relation==1) printf("LINE\n"); else if(relation==2) printf("NONE\n"); else { Point ans=getLineIntersection(L1,L2); printf("POINT %.2f %.2f\n",ans.x,ans.y); //此处使用G++时用 %.2f 输出,使用C++时用 %.2lf 输出 } } printf("END OF OUTPUT\n"); }
POJ 1269 - Intersecting Lines - [平面几何模板题]
标签:-- reason input 直接 mem not 链接 name nta
原文地址:http://www.cnblogs.com/dilthey/p/7800897.html