线段相交之精粹和交点问题

来源:互联网 发布:淘宝网卖情趣用品 编辑:程序博客网 时间:2024/05/14 02:48

博主今天听了一句话,感觉好有内涵。。。“待你征服宇宙,给我一个地球可好” 。。。。

/*线段相交  2016/5/16*/#include <iostream>#include <cstdio>#include <cstdlib>#define def 1e-6//点struct Point{  double x;double y;};//直线struct Line{   Point v1;   Point v2;};//判断点在pi-pj在线段的那一侧int direction(Point* pi,Point* pj,Point* pk){    Point p1,p2;    p1.x = pk->x - pi->x;    p1.y = pk->y - pi->y;    p2.x = pj->x - pi->x;    p2.y = pj->y - pi->y;    double cross = p1.x*p2.y - p2.x*p1.y;    if(cross > def)        return 1;    else if(cross < -def)        return -1;    else        return 0;}//判断点是否在pi和pj为对角点的矩形里bool onSegment(Point* pi,Point* pj,Point* pk){    double minx,miny,maxx,maxy;    if(pi->x > pj->x)    {        minx = pj->x; maxx = pi->x;    }    else    {        minx = pi->x; maxx = pj->x;    }    if(pi->y > pj->y)    {        miny = pj->y; maxy = pi->y;    }    else    {        miny = pi->y; maxy = pj->y;    }    return (minx <= pk->x)&&(maxx >= pk->x)&&(miny <=pk->y)&&(maxy >= pk->y);}//判断线段相交bool segmentIntersect(Point* p1,Point* p2,Point* p3,Point* p4){    int d1 = direction(p3,p4,p1);    int d2 = direction(p3,p4,p2);    int d3 = direction(p1,p2,p3);    int d4 = direction(p1,p2,p4);    if(d1*d2 < 0&&d3*d4 < 0)        return true;    if(!d1 && onSegment(p3,p4,p1))        return true;    if(!d2 && onSegment(p3,p4,p2))        return true;    if(!d3 && onSegment(p1,p2,p3))        return true;    if(!d4 && onSegment(p1,p2,p4))        return true;    return false;}/*求直线交点ax + by + c = 0若1、ax + by = e2、cx + dy = f交点坐标(x,y)coll = ad - bc;   //判断共线 coll = 0x = (ed - bf)/coll;y = (af - ec)/coll;已知直线上两点求直线的一般式方程已知直线上的两点P1(X1,Y1) P2(X2,Y2), P1 P2两点不重合。则直线的一般式方程AX+BY+C=0中,A B C分别等于:A = Y2 - Y1B = X1 - X2C = X2*Y1 - X1*Y2*///判断共线bool segmentCollineation(double a ,double b,double c,double d){    double coll = a*d -b*c;    if(coll< def && coll > -def)       return true;    return false;}//求交点void segmentCrossover(Point* p1,Point* p2,Point* p3, Point* p4){    double a,b,c,d,e,f;    a = p2->y - p1->y; b = p1->x - p2->x; e = -(p2->x * p1->y - p1->x * p2->y);    c = p4->y - p3->y; d = p3->x - p4->x; f = -(p4->x * p3->y - p3->x * p4->y);    printf("a = %.3lf  b = %.3lf e = %.3lf\nc = %.3lf  d = %.3lf  f = %.3lf\n",a,b,e,c,d,f);    if(segmentCollineation(a,b,c,d))    {        printf("直线共线\n");        if(p1->x == p3->x && p1->y == p3->y)            printf("交点坐标为p1和p3的重合点(%.3lf,%.3lf)\n",p1->x,p1->y);        if(p1->x == p4->x && p1->y == p4->y)            printf("交点坐标为p1和p4的重合点(%.3lf,%.3lf)\n",p1->x,p1->y);        if(p2->x == p3->x && p2->y == p3->y)            printf("交点坐标为p2和p3的重合点(%.3lf,%.3lf)\n",p2->x,p2->y);        if(p2->x == p4->x && p2->y == p4->y)            printf("交点坐标为p2和p4的重合点(%.3lf,%.3lf)\n",p2->x,p2->y);    }    else    {        Point p0; //交点        double coll = a*d - b*c;        p0.x = (e*d - b*f)/coll;        p0.y = (a*f - e*c)/coll;        printf("交点坐标为p0(%.3lf,%.3lf)\n",p0.x,p0.y);    }}int main(){    Point p1,p2,p3,p4;   p1.x = 0;p1.y = 0;   p2.x = 1; p2.y = 1;   p3.x = 1; p3.y = 1;   p4.x = 4; p4.y = 4;   if(segmentIntersect(&p1,&p2,&p3,&p4))   segmentCrossover(&p1,&p2,&p3,&p4);   return 0;}


1 0
原创粉丝点击