POJ1269 Intersecting Lines 计算几何

几何题。

题目大意:给你4个点,问你其确定的两条直线间的位置关系:平行,相交或是重合,如果相交,求出交点坐标。

因为数据只有上述三种情况,故我们可以先确定这两天直线是否平行或重合,如果不是,直接求出他们交点的坐标即可

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct node
{
    double x,y;
}point;
typedef struct line
{
    point start,end;
}segment;
double multi(point p1,point p2,point p0)
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
bool is_px(point p1,point p2,point p3,point p4)
{
    if((p1.x-p2.x)*(p3.y-p4.y)==(p3.x-p4.x)*(p1.y-p2.y))
      return true;
    return false;
}
point intersection(segment u,segment v)
{
    point p;
    p.x=(multi(v.end,u.end,u.start)*v.start.x-multi(v.start,u.end,u.start)*v.end.x)/(multi(v.end,u.end,u.start)-multi(v.start,u.end,u.start));
    p.y=(multi(v.end,u.end,u.start)*v.start.y-multi(v.start,u.end,u.start)*v.end.y)/(multi(v.end,u.end,u.start)-multi(v.start,u.end,u.start));
    return p;
}
int main()
{
    segment u,v;
    int t;
    int x1,x2,x3,x4;
    int y1,y2,y3,y4;
    scanf("%d",&t);
    printf("INTERSECTING LINES OUTPUT\n");
    while(t--)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        scanf("%d%d%d%d",&x3,&y3,&x4,&y4);
        u.start.x=x1;u.start.y=y1;
        u.end.x=x2;u.end.y=y2;
        v.start.x=x3;v.start.y=y3;
        v.end.x=x4;v.end.y=y4;
        if(multi(u.start,u.end,v.start)==0&&multi(u.start,u.end,v.end)==0)
          puts("LINE");
        else if(is_px(u.start,u.end,v.start,v.end)) puts("NONE");
        else
        {
            point p=intersection(u,v);
            printf("POINT %.2lf %.2lf\n",p.x,p.y);
        }
    }
    printf("END OF OUTPUT\n");
    return 0;
}


你可能感兴趣的:(POJ1269 Intersecting Lines 计算几何)