Uva 378 Intersecting Lines

题目与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;
}

猜你喜欢

转载自www.cnblogs.com/lxy8584099/p/10418739.html