线段是否相交
2015-09-29 17:02
127 查看
给定两条线段,判断是否相交
#include<iostream> #include<algorithm>//use sort #include<cmath>//use fabs using namespace std; struct Point//点坐标 { double x; double y; }; struct Line//线段属性 { double k; double b; Point p1; Point p2; }; void IsIntersect(Line &line1, Line &line2); int main() { Line l1, l2; cin >> l1.p1.x >> l1.p1.y; cin >> l1.p2.x >> l1.p2.y; cin >> l2.p1.x >> l2.p1.y; cin >> l2.p2.x >> l2.p2.y; IsIntersect(l1, l2); return 0; } void GetLine(Line &line)//求出线段的k和b { //不考虑两点横坐标相等 line.k = (line.p1.y - line.p2.y) / (line.p1.x - line.p2.x); line.b = line.p1.y - line.k*line.p1.x; } bool JudgeIsIntersect(Line &line,double &pointY)//判断斜率存在的线段的两个纵坐标与直线交点的纵坐标,如果相交,那么交点的纵坐标是在line2两点纵坐标的中间 { if (line.p1.y >= line.p2.y) { if (pointY <= line.p1.y&&pointY >= line.p2.y) return true; else return false; } if (line.p1.y < line.p2.y) { if (pointY <= line.p2.y&&pointY >= line.p1.y) return true; else return false; } } void IsIntersect(Line &line1, Line &line2) { //两个变量判断斜率是否存在 double line1X = line1.p1.x - line1.p2.x; double line2X = line2.p1.x - line2.p2.x; /* 分四种情况 1.line1,line2斜率都不存在 2.line1斜率不存在,line2存在 3.line1存在,line2的斜率不存在 4.line1,line2的斜率都存在 */ //1. //line1,line2斜率都不存在 if (line1X == 0 && line2X == 0) { if (line1.p1.x == line2.p1.x)//共线:分为两个,相交(重合)与不相交 { //如何判断是重合呢还是没有相交呢? //两条线段,四个点,一条直线上,取两条线段横坐标之和即fabs(line1.p1.x - line1.p2.x) + fabs(line2.p1.x - line2.p2.x) //这四个横坐标,有最大也有最小,那么最大到最小的距离double length = a[4] - a[0] //通过比较这两个数值即可判断 double a[4] = { line1.p1.y,line1.p2.y,line2.p1.y,line2.p2.y }; sort(a, a + 4); double length = a[3] - a[0]; double lengthSum = fabs(line1.p1.y - line1.p2.y) + fabs(line2.p1.y - line2.p2.y); if (length > lengthSum) cout << "不相交\n"; else cout << "相交\n"; } else cout << "不想交\n"; } //2. //line1斜率不存在,line2存在 else if (line1X == 0 && line2X != 0) { GetLine(line2); double intersectionY = line2.k*line1.p1.x + line2.b;//直线交点的纵坐标,如果相交,那么交点的纵坐标是在line2两点纵坐标的中间 if (JudgeIsIntersect(line2, intersectionY)) cout << "相交\n"; else cout << "不相交\n"; } //3. //line1存在,line2的斜率不存在 else if (line1X != 0 && line2X == 0) { GetLine(line1); double intersectionY = line1.k*line2.p1.x + line1.b; if (JudgeIsIntersect(line1, intersectionY)) cout << "相交\n"; else cout << "不相交\n"; } //4. //line1,line2的斜率都存在 else { GetLine(line1); GetLine(line2); if (line1.k == line2.k)//斜率相同 { if (line1.b == line2.b)//共线:分为两个,相交(重合)与不相交 { double a[4] = { line1.p1.x,line1.p2.x,line2.p1.x,line2.p2.x }; sort(a, a + 4); double length = a[3] - a[0]; double lengthSum = fabs(line1.p1.x - line1.p2.x) + fabs(line2.p1.x - line2.p2.x); if (length > lengthSum) cout << "不相交\n"; else cout << "相交\n"; } else cout << "不相交\n"; } else//斜率不同 { double intersectionX = (line2.b - line1.b) / (line1.k - line2.k); double line1XLength = fabs(line1.p1.x - line1.p2.x); double line1Length = fabs(line1.p1.x - intersectionX) + fabs(line1.p2.x - intersectionX); double line2XLength = fabs(line2.p1.x - line2.p2.x); double line2Length = fabs(line2.p1.x - intersectionX) + fabs(line2.p2.x - intersectionX); if ((line1XLength == line1Length) && (line2XLength == line2Length)) cout << "相交\n"; else cout << "不相交\n"; } } }
相关文章推荐
- Python 列表的清空
- AIX系统文件编辑
- C++使用OLE高速读写EXCEL的源码
- 深入理解C语言的函数调用过程 【转】
- iOS 里面 NSTimer 防止 循环引用
- 归档
- 使用truss、strace或ltrace诊断软件的“疑难杂症”
- grunt-contrib-uglify压缩插件的常用配置属性
- TCP/IP协议族
- 删除文件夹(目录)
- 连接虚拟机中的Linux服务器:putty和WinSCP使用
- PXE DHCP TFTP NFS自动化部署Linux系统
- 判断字符串是否是数字
- 10046事件:获取最完整的sql执行计划
- js,javascript--跨域问题
- isKindOfClass 与 isMemberOfClass 的区别
- window.location.href的用法
- java取奇偶数的基本练习
- 清除缓存和数据库的工具类
- 读取当前所在目录(文件夹)(C/C++源程序)