线段相交之精粹和交点问题
来源:互联网 发布:淘宝网卖情趣用品 编辑:程序博客网 时间: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
- 线段相交之精粹和交点问题
- ArcEngine空间分析之线段相交分析求交点
- ArcEngine空间分析之线段相交分析求交点
- 求线段相交交点坐标
- 判断线段是否相交...并求出交点。
- [poj 1039]Pipes[线段相交求交点]
- POJ1039Pipe【线段相交判断+求交点】
- 判断两线段是否相交求交点
- 判断线段相交并求交点
- 判断两线段相交,并求交点
- 计算几何之线段相交问题模板
- 判断线段是否相交的函数和求直线交点的函数
- POJ 1039 Pipe(直线和线段相交判断,求交点)
- uva 303 pipe (求线段交点,判断线段相交)
- 【计算几何初步-线段相交】【HDU1089】线段交点
- HDOJ1086 线段相交问题
- poj 2074 Line of Sight(视线问题,求直线与线段的交点及判断相交)
- C++ 实现两线段是否相交、相交情况、若相交求出交点坐标
- ReactNative 第四节 实例开发
- C++对象的内存分布和虚函数表
- VC父窗口和子窗口
- iOS UICollectionView小结 + 选中效果
- JAVA——高级for循环
- 线段相交之精粹和交点问题
- 删除360天擎(企业版)---不知道密码情况下
- 有关zipalign的一些问题
- android中Activity中的WindowManager与Window
- 解决更改JAVA_HOME后jdk版本没有更改问题
- [unity]在unity中创建圆锥体
- docker相关文章
- 查看和修改shell
- #RadioButton自定义图标