判断是否规范相交模板

判断线段相交--模板

计算几何的常用的函数

题目:Area,

规范相交:两条线段恰有一个不是端点的公共点。

即如果一条线段的一个端点恰在另一条线段上则不视为相交;如果两条线段部分重合,也不视为相交。

非规范相交:两条线段存在公共部分。(上述两种情况都可视为非规范相交)

其中a~f是非规范相交; g,h是不相交; a~c有唯一的交点;d~f有无数个交点。


判断线段是否相交,如果是规范相交则求出交点坐标p并返回1,如果是非规范相交则直接返回2,否则返回0;

代码:

 

复制代码
    
    
int segcross(Point a, Point b, Point c, Point d, Point &p) // 判断线段相交 { double s1, s2, s3,s4; int d1, d2, d3, d4; d1 = dblcmp(s1 = xmult(a,b,c)); d2 = dblcmp(s2 = xmult(a,b,d)); d3 = dblcmp(s3 = xmult(c,d,a)); d4 = dblcmp(s4 = xmult(c,d,b)); // 若规范相交则求交点的代码 // d1^d2==-2相当于d1*d2<0; // 跨立实验 if ((d1 ^ d2) ==- 2 && (d3 ^ d4) ==- 2 ) // "(d1^d2)"这个小括号是必须的,否则会错 { p.x = (c.x * s2 - d.x * s1) / (s2 - s1); p.y = (c.y * s2 - d.y * s1) / (s2 - s1); return 1 ; } // 判断非规范相交 // d1==0, 则证明a,b,c三点共线; // 如果dblcmp(dmult(c,a,b))<0, 则说明点c在点a,b的中间; // 如果dblcmp(dmult(c,a,b))==0,则说明点c与线段ab的端点a,或者b重合。 // 如果dblcmp(dmult(c,a,b))==0,则说明点c在线段ab的外面。 if (d1 == 0 && dblcmp(dmult(c,a,b)) <= 0 || d2 == 0 && dblcmp(dmult(d,a,b)) <= 0 || d3 == 0 && dblcmp(dmult(a,c,d)) <= 0 || d4 == 0 && dblcmp(dmult(b,c,d)) <= 0 ) { return 2 ; } return 0 ; }
判断多边形是否相交可以使用以下两种方法: 1. Ray Casting Algorithm(射线法):对于任意两个多边形,分别对其中一个多边形的每个顶点作一条水平向右的射线,统计与另一个多边形的交点数,如果是奇数则说明两个多边形相交,偶数则不相交。该算法时间复杂度为O(n^2),其中n为多边形的顶点数。 2. Separating Axis Theorem(分离轴定理):对于两个凸多边形,找出两个多边形所有可能的分离轴,即两个多边形所围成的区域不相交的轴。如果找到了一个分离轴,则两个多边形不相交。如果没有找到,则两个多边形相交。该算法时间复杂度为O(n),其中n为多边形的边数。 以下是使用第二种方法的Python代码示例: ```python def project_polygon_onto_axis(polygon, axis): # 投影多边形到指定轴上 min_proj = float('inf') max_proj = -float('inf') for point in polygon: proj = np.dot(point, axis) / np.dot(axis, axis) min_proj = min(min_proj, proj) max_proj = max(max_proj, proj) return (min_proj, max_proj) def check_intersection(p1, p2): # 判断两个凸多边形是否相交 for axis in np.concatenate((p1, p2)): axis = np.array([-axis[1], axis[0]]) # 得到垂直于当前边的轴 min_proj1, max_proj1 = project_polygon_onto_axis(p1, axis) min_proj2, max_proj2 = project_polygon_onto_axis(p2, axis) if max_proj1 < min_proj2 or max_proj2 < min_proj1: return False # 找到了一个分离轴,两个多边形不相交 return True # 没有找到分离轴,两个多边形相交 # 示例:判断两个凸多边形是否相交 p1 = np.array([[0, 0], [0, 1], [1, 1], [1, 0]]) p2 = np.array([[0.5, -0.5], [0.5, 0.5], [1.5, 0.5], [1.5, -0.5]]) print(check_intersection(p1, p2)) # 输出True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值