C语言-判断线段是否与矩形范围有交集
来源:互联网 发布:手机里相片裁剪软件 编辑:程序博客网 时间:2024/05/03 04:13
原文地址:http://blog.csdn.net/hbuxiaoshe/article/details/5833094
判断线段AB是否与矩形范围有交集
这里的矩形指的是边与坐标轴平行的矩形,可用x和y上最大最小值表示。
判断是否相交,先快速排斥,再做跨立,通过向量的叉积判断矩形的四个顶点是否在线段的两侧,是说明有交集。
(如果判断与矩形的边是否有交集的话,可判断线段是否与矩形的每条边是否有交集,线段与线段的交集判断。)
这里在介绍另外一种方法,降维的方法:
例如,有线段AB和矩形MN,如图所示:
通过M和N点的y坐标计算直线AB上的D和C点,B和C点中取y值小的点B,A和D点中取y值大的点D,
最后确定了线段BD在x轴上的投影GH,矩形在x轴上的投影EF,判断EF和GH是否有交集。
C语言代码如下:
/* * 判断区间[x1, x2]和区间[x3, x4](x4可能小于x3)是否有交集,有返回1,无0 */int IntervalOverlap(double x1, double x2, double x3, double x4){double t;if (x3 > x4){t = x3;x3 = x4;x4 = t;}if (x3 > x2 || x4 < x1)return 0;elsereturn 1;}/* * 判断矩形r和线段AB是否有交集,有返回1,无0 */int RSIntersection(Rectangle r, Point A, Point B){if (A.y == B.y)// 线段平行于x轴{if (A.y <= r.ymax && A.y >= r.ymin){return IntervalOverlap(r.xmin, r.xmax, A.x, B.x);}else{return 0;}}// AB两点交换,让B点的y坐标最大Point t;if (A.y > B.y){t = A;A = B;B = t;}// 在线段AB上确定点C和D// 两点确定一条直线: (x-x1)/(x2-x1)=(y-y1)/(y2-y1)double k = (B.x - A.x)/(B.y - A.y);Point C, D;if (A.y < r.ymin){C.y = r.ymin;C.x = k * (C.y - A.y) + A.x;}elseC = A;if (B.y > r.ymax){D.y = r.ymax;D.x = k * (D.y - A.y) + A.x;}elseD = B;if (D.y >= C.y)// y维上有交集{return IntervalOverlap(r.xmin, r.xmax, D.x, C.x);}else{return 0;}}
0 0
- C语言-判断线段是否与矩形范围有交集
- C语言平面几何6-判断线段是否与矩形范围有交集
- C语言平面几何6-判断线段是否与矩形范围有交集
- C语言平面几何12-向量方法判断线段与矩形是否有交集
- C语言平面几何12-向量方法判断线段与矩形是否有交集
- 判断两个矩形是否有交集
- 判断两个矩形是否有交集
- vc 如何判断2个矩形是否有交集
- vc 如何判断2个矩形是否有交集
- poj1410判断线段与矩形是否相交(判断线段相交)
- C语言 判断两个矩形是否相交
- 判断两个矩形是否存在交集
- 如何判断两个矩形是否存在交集
- POJ 1410 Intersection (判断线段与矩形是否相交)
- POJ 1410 Intersection (判断线段是否与矩形相交)
- POJ 1410 Intersection(判断线段与矩形是否相交)
- UVA 191 || Intersection (判断线段是否与矩形相交
- poj 1410 Intersection 【判断线段 与矩形面是否相交】
- 今天再大的事,到了明天就是小事;
- 高级格式化与低级格式化
- SSM -1.1
- 移动互联网安全专用数字证书
- LINUX下设置字节对齐问题
- C语言-判断线段是否与矩形范围有交集
- PHP Web 安全
- UIWebView与JavaScript的交互
- 搭建Java版WebService
- 【Linux】Linux中的网桥设置
- 人生就像蒲公英,看似自由,却身不由己。
- 数据结构:循环队列(C语言实现)
- 诺基亚通信、中移动、Ooredoo在ITU世界电信展联合演示TDD-FDD载波聚合4.1Gbps速度
- 计算一段字符串的长度是否超出规定字数,两个英文字符占一个长度。