判断线面相交问题

来源:互联网 发布:bytefence是什么软件 编辑:程序博客网 时间:2024/04/29 18:05

题目来源呢,是 UVA191考题。

题目链接


怎么说呢,题目意思还算简洁,数据也限定在正整数不然若是浮点数用上了double误差允许范围内判等 或是 坐标出现负数,那代码就还有的改咯。


另外,参考了一下大牛的解法,贴上地址~

判断两线段是否相交



#include <iostream>#include <cstdio>using namespace std;struct point{//点结构体    int  x,y;    point(int a=0,int b=0){        x=a; y=b;}//给点赋坐标值};int direction(point p1,point p2,point p3){//二维矩阵    return ( (p2.x-p1.x)*(p3.y-p1.y) - (p3.x-p1.x)*(p2.y-p1.y));}//返回的是向量p1p2与p1p3叉积结果bool checkPointOnLine(point p1,point p2,point p3){//利用坐标大小判断p3是否在线段p1p2    if( p3.x< min(p1.x,p2.x) || p3.x> max(p1.x,p2.x) || p3.y< min(p1.y,p2.y) || p3.y> max(p1.y,p2.y))        return false;    else        return true;}//reue的条件为 (p3.x>= min(p1.x,p2.x) &&  p3.x<= max(p1.x,p2.x) && p3.y>=min(p1.y,p2.y) && p3.y<= max(p1.y,p2.y))bool checkIntersection(point p1,point p2,point p3, point p4){//线在矩形外,判断相交    int  d1,d2,d3,d4;    d1 = direction(p3,p4,p1);//p3p4 and p3p1    d2 = direction(p3,p4,p2);//p3p4 and p3p2//根据叉积几何意义判断两条线段相交知:若d1与d2异号则点p1、p2分居在向量p3p4两侧,即是p1p2与p3p4相交    d3 = direction(p1,p2,p3);//p1p2 and p1p3    d4 = direction(p1,p2,p4);//p1p2 and p1p4//同理,异号时p3、p4分居向量p1p2    //cout << d1 << " " << d2 <<" " << d3 << " " << d4 << endl;    if((d1*d2<0) && (d3*d4<0))        return true;//Intersecting!    else if((d1 == 0)&&( checkPointOnLine(p3,p4,p1)))//这一行代码说明p3p4与p1p2相交,至少有交点p1(其实已经共线了),以下同理        return true;    else if((d2 == 0)&&( checkPointOnLine(p3,p4,p2)))        return true;    else if((d3 == 0)&&( checkPointOnLine(p1,p2,p3)))        return true;    else if((d4 == 0)&&( checkPointOnLine(p1,p2,p4)))        return true;    else        return false; } //线段(pa,pb)在矩形p1p3的内部,必相交 bool segmentInRectangle(point p1,point p3,point pa,point pb){//p1、p3表示矩形的上下两个端点(由于题目说此两点不分顺序故需先判断后取大小)    if( (min(p1.x,p3.x) <= pa.x && pa.x <= max(p1.x,p3.x)) &&        (min(p1.y,p3.y) <= pa.y && pa.y <= max(p1.y,p3.y)) &&        (min(p1.x,p3.x) <= pb.x && pb.x <= max(p1.x,p3.x)) &&        (min(p1.y,p3.y) <= pb.y && pb.y <= max(p1.y,p3.y))  )       return true;    else        return false;}inline void gameOver(){        point pa,pb;//线段端点        point p1,p3;//输入的矩形两个对角端点        point p2,p4;//矩形的另外两对角端点        int xa,ya,xb,yb,x1,y1,x3,y3;        scanf("%d%d %d%d %d%d %d%d",&xa,&ya,&xb,&yb,&x1,&y1,&x3,&y3);        pa = point(xa,ya);  pb = point(xb,yb);        p1 = point(x1,y1);  p3 = point(x3,y3);        p2 = point(x1,y3);  p4 = point(x3,y1);        if( segmentInRectangle(p1,p3,pa,pb) ||           checkIntersection(p1,p2,pa,pb) ||           checkIntersection(p3,p4,pa,pb) ||           checkIntersection(p3,p2,pa,pb) ||           checkIntersection(p1,p4,pa,pb) ) printf("T\n");        else            printf("F\n");}int main(){    int n;    scanf("%d",&n);    while(n--){        gameOver();    }    return 0;}


待更,持续更新中……


0 0
原创粉丝点击