poj 1269 计算几何

题意:此题要处理给定的四个点,前两个点,后两个点分别构成一条直线,判断这两条直线是否重合,平行,相交,若相交,给出交点。

解题思路:可以用向量叉积判断是否重合和平行

重合:设第一个点和第二个点构成向量分别和第一个点和第三个点构成向量,和第四个点构成向量叉积为0

平行: 设第一个点和第二个点构成向量和第三个点和第四个点构成向量叉积为0

相交: 两点确定一条直线后得到两条直线,根据二元方程得到交点

#include<iostream>
#include<cstdio>
using namespace std;

typedef struct//点坐标 
{
    int x,y;
}Point;

typedef struct//线性方程ax + by + c = 0 
{
    int a,b,c;
}Line;

int line(int x1,int y1,int x2,int y2)//计算两个向量叉积的值,若 == 0,则表示共线 
{
    return x1*y2 - x2*y1;
}

Line lineform(int x1,int y1,int x2,int y2)//两点构成一条直线 
{
    Line temp;
    temp.a = y2 - y1;
    temp.b = x1 - x2;
    temp.c = x2*y1 - x1*y2;
    return temp;     
} 

double x,y;
void lineintersect(Line l1,Line l2)//两个直线方程联立得到交点坐标 
{
    double d = l1.a*l2.b - l2.a*l1.b;
    x = (l2.c*l1.b - l1.c*l2.b) / d;
    y = (l2.a*l1.c - l1.a*l2.c) / d;
}

int main()
{
    int num;
    Point p1,p2,p3,p4;
    Line l1,l2;
    cin>>num;
    cout<<"INTERSECTING LINES OUTPUT"<<endl;
    while(num--)
    {
        cin>>p1.x>>p1.y>>p2.x>>p2.y>>p3.x>>p3.y>>p4.x>>p4.y;
        if(line(p2.x-p1.x,p2.y - p1.y,p3.x - p1.x,p3.y - p1.y) == 0 && line(p2.x-p1.x,p2.y - p1.y,p4.x - p1.x,p4.y - p1.y) == 0)
            cout<<"LINE"<<endl;
        else if(line(p2.x-p1.x,p2.y - p1.y,p4.x - p3.x,p4.y - p3.y) == 0)
            cout<<"NONE"<<endl;
        else
        {
            l1 = lineform(p1.x,p1.y,p2.x,p2.y);
            l2 = lineform(p3.x,p3.y,p4.x,p4.y);
            lineintersect(l1,l2);
            printf("POINT %.2lf %.2lf\n",x,y);
        }
    }
    cout<<"END OF OUTPUT"<<endl;
    return 0;
}

 

posted @ 2018-02-09 10:33  ZZUGPY  阅读(90)  评论(0编辑  收藏  举报