判断两线段相交

来源:互联网 发布:不出于户 以知天下 编辑:程序博客网 时间:2024/05/01 20:53



#include <iostream>using namespace std;struct Point//点的定义{    double x,y;};typedef struct line//向量定义{    Point start,end;}vector;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 cross(vector v1,vector v2)//相交与否{    if(max(v1.start.x,v1.end.x)>=min(v2.start.x,v2.end.x)&&       max(v2.start.x,v2.end.x)>=min(v1.start.x,v1.end.x)&&       max(v1.start.y,v1.end.y)>=min(v2.start.y,v2.end.y)&&       multi(v2.start,v1.end,v1.start)*multi(v1.end,v2.end,v1.start)>=0&&       multi(v1.start,v2.end,v2.start)*multi(v2.end,v1.end,v2.start)>=0)        return true;    return false;}int main(){    int n;    double x1,x2,x3,x4,y1,y2,y3,y4;    while(cin>>n&&n!=0)    {        while(n--)        {            cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;//4个点,两条线段            vector v1,v2;            v1.start.x=x1;            v1.start.y=y1;            v1.end.x=x2;            v1.end.y=y2;            v2.start.x=x3;            v2.start.y=y3;            v2.end.x=x4;            v2.end.y=y4;            if(cross(v1,v2))                cout<<"YES"<<endl;            else                cout<<"no"<<endl;        }    }    return 0;}


0 0
原创粉丝点击