题目与POJ 1269 相同 不过POJ一直WA
新的姿势 求两直线的交点
a,b,c,d c1=cross(a,b,c),c2=cross(a,b,d)
x=(c2*c.x-c1*d.x)/(c2-c1) y=(c2*c.y-c1*d.y)/(c2-c1)
(c2计算式子里面没有涉及c 所以是c2*c.x c1没有涉及d 所以是c1*d.x)
/* 给你了两条线段,要你求他们是平行还是重合还是有交点,如果有交点就输出交点。 */ #include<cstdio> #define db double using namespace std; const db eps=1e-10; struct Point { db x,y; Point(){} Point(db _x,db _y){x=_x,y=_y;} }; Point operator - (Point A,Point B) {return Point(A.x-B.x,A.y-B.y);} db operator ^ (Point A,Point B) {return A.x*B.y-A.y*B.x;} db cross(Point a,Point b,Point c) {return (b-a)^(c-a);} int sign(db x) // 正数返回1 负数返回-1 否则就返回0(x无限接近0或者等于0) { if(x>eps) return 1; if(x<-eps) return -1; return 0; } void work(Point a,Point b,Point c,Point d) // 写成int函数么有返回值一直re不知道原因。。 { db c1=cross(a,b,c),c2=cross(a,b,d); if(!sign(c1)&&!sign(c2)) puts("LINE"); // 重合 else if(!sign(c1-c2)) puts("NONE"); // 平行 else { double x=(c2*c.x-c1*d.x)/(c2-c1),y=(c2*c.y-c1*d.y)/(c2-c1); // https://blog.csdn.net/u014068781/article/details/24591295 x,y由来解析。。现在靠背 printf("POINT %.2lf %.2lf\n",x,y); } } int main() { int n;scanf("%d",&n); puts("INTERSECTING LINES OUTPUT"); for(int i=1;i<=n;i++) { db x,y; Point a,b,c,d; scanf("%lf%lf",&x,&y); a=Point(x,y); scanf("%lf%lf",&x,&y); b=Point(x,y); scanf("%lf%lf",&x,&y); c=Point(x,y); scanf("%lf%lf",&x,&y); d=Point(x,y); work(a,b,c,d); } puts("END OF OUTPUT"); return 0; }