博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断线段相交模板
阅读量:6132 次
发布时间:2019-06-21

本文共 1342 字,大约阅读时间需要 4 分钟。

1 /* 2 部分重合,端点重合,点边重合都会返回true 3 */ 4 struct PT{ 5     double x,y;//点的坐标 6     PT(double x = 0, double y = 0) : x(x), y(y){} 7     //bool operator 8 };//线段的2个端点,MAX表示线段条数的上限 9 10 double Min(double a,double b){11     return a
b?a:b;16 }17 18 double Dir(PT p1,PT p2,PT p0){
//判断线段p0p2相对于线段p0p1的位置19 //向量p0p1叉乘向量p0p2,转化为行列式进行计算20 //结果若大于0,则p0p2沿顺时钟方向旋转可得到与p0p1同方向的向量21 //结果若小于0,则p0p2沿逆时钟方向旋转可得到与p0p1同方向的向量22 //结果若等于0,则p0p2与p0p1共线23 return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);24 }25 26 int OnSgm(PT p1,PT p2,PT p0){27 double minx,maxx,miny,maxy;28 minx=Min(p1.x,p2.x);29 maxx=Max(p1.x,p2.x);30 miny=Min(p1.y,p2.y);31 maxy=Max(p1.y,p2.y);32 return minx<=p0.x&&p0.x<=maxx&&miny<=p0.y&&p0.y<=maxy;33 }34 35 bool Intersect(PT p1,PT p2,PT p3,PT p4){
//两线段相交有两种情况36 double d1,d2,d3,d4;37 d1=Dir(p4,p1,p3);38 d2=Dir(p4,p2,p3);39 d3=Dir(p2,p3,p1);40 d4=Dir(p2,p4,p1);41 if(d1*d2<0&&d3*d4<0)//两线段互相跨过42 return 1;43 //一条直线有一个端点在另外一条直线上44 if(d1==0&&OnSgm(p3,p4,p1))45 return 1;46 if(d2==0&&OnSgm(p3,p4,p2))47 return 1;48 if(d3==0&&OnSgm(p1,p2,p3))49 return 1;50 if(d4==0&&OnSgm(p1,p2,p4))51 return 1;52 return 0;//两线段不相交返回false53 }

 

转载于:https://www.cnblogs.com/tooyoungtoosimple/p/4756268.html

你可能感兴趣的文章
java学习:jdbc连接示例
查看>>
PHP执行批量mysql语句
查看>>
Extjs4.1.x 框架搭建 采用Application动态按需加载MVC各模块
查看>>
Silverlight 如何手动打包xap
查看>>
建筑电气暖通给排水协作流程
查看>>
JavaScript面向对象编程深入分析(2)
查看>>
linux 编码转换
查看>>
POJ-2287 Tian Ji -- The Horse Racing 贪心规则在动态规划中的应用 Or 纯贪心
查看>>
Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月7日-1月14日)
查看>>
关于C#导出 文本文件
查看>>
使用native 查询时,对特殊字符的处理。
查看>>
maclean liu的oracle学习经历--长篇连载
查看>>
ECSHOP调用指定分类的文章列表
查看>>
分享:动态库的链接和链接选项-L,-rpath-link,-rpath
查看>>
单例模式
查看>>
Activity之间传递大数据问题
查看>>
困知,勉行----阿里云服务观
查看>>
rsyslog升级--input支持通配符测试
查看>>
阿里云企业邮箱 在Foxmail 7.0上POP3/IMAP协议设置方法
查看>>
[Weex Tips] 合理使用 Weex 的生命周期
查看>>