Floating point 我可以使用什么样的线多边形剪裁算法来确保生成的端点始终位于多边形内?

Floating point 我可以使用什么样的线多边形剪裁算法来确保生成的端点始终位于多边形内?,floating-point,geometry,numerical-methods,clipping,point-in-polygon,Floating Point,Geometry,Numerical Methods,Clipping,Point In Polygon,我有一个二维平面,被分割成n边的凸多边形。我使用for polygon inclusion来确保一个点属于一个且仅属于一个多边形 假设pnpoly(O)==true,那么pnpoly(p')将始终为true,我是否可以使用算法将线段PO剪裁到平面中的给定多边形 我当前的clipToPoly实现对多边形的线段和每条边进行了一次直线相交测试,然后使用交点(如中所述),但这并不总是产生一个满足PNPOLY的点 函数clippointoply(p,o,poly){ 变量i,j,n=多边形长度, q、

我有一个二维平面,被分割成n边的凸多边形。我使用for polygon inclusion来确保一个点属于一个且仅属于一个多边形

假设
pnpoly(O)==true
,那么pnpoly(p')将始终为true,我是否可以使用算法将线段PO剪裁到平面中的给定多边形

我当前的clipToPoly实现对多边形的线段和每条边进行了一次直线相交测试,然后使用交点(如中所述),但这并不总是产生一个满足PNPOLY的点

函数clippointoply(p,o,poly){
变量i,j,n=多边形长度,
q、 r={},s={},pq={},
rxs,t,u;
功能交叉2(v,w){
返回v.x*w.y-v.y*w.x;
}
对于(i=0,j=n-1;i
以下是我对PNPOLY的实现:

函数pnpoly(p,poly){ 变量i,j,e0,e1, n=多边形长度, 内=假; 对于(i=0,j=n-1;ip.y)!==(p1.y>p.y))&& ((p.x<(p1.x-p0.x)*(p.y-p0.y)/(p1.y-p0.y)+p0.x))){ 内部=!内部; } } 返回内部; };
我认为我对简单性的模拟了解不够,或者在使用浮点数正确处理边缘情况时,如何处理PNPOLY的半开集

例如:

poly: [(1,1), (-1,1), (-1,-1), (1,-1)]
p: (5,5)
o: (0,0)
p' = (1,1)
poly: [-995.9592341908675, -88.48705014724577
       -1040.5031753180106, -176.53192722405026
       -549.9211095905894, -330.8462151682281
       -653.7143990581328, -211.59193148034612]
p: -1032.3773586525654, -208.3586379393678
o: -957.4172402148379, -202.6668958854324
这失败了,因为根据PNPOLY(它位于集合的开放侧)没有包括(1,1),但是clipToPoly没有考虑到这一点。我想如果我知道它在集合的一个开放端,我可以用一个ε来推动它,但我更喜欢一个更稳定的解决方案

另一个例子:

poly: [(1,1), (-1,1), (-1,-1), (1,-1)]
p: (5,5)
o: (0,0)
p' = (1,1)
poly: [-995.9592341908675, -88.48705014724577
       -1040.5031753180106, -176.53192722405026
       -549.9211095905894, -330.8462151682281
       -653.7143990581328, -211.59193148034612]
p: -1032.3773586525654, -208.3586379393678
o: -957.4172402148379, -202.6668958854324
在这种情况下,clipToPoly会失败,因为O非常接近多边形的边缘,它甚至不会检测到由于浮点不精确而产生的交点

t: 1.0000000000000002 u: 0.8306380503739466

有没有办法使clipToPoly的浮点不精确性与PNPOLY的浮点不精确性相匹配,从而使两者一致?

您可以尝试所有计算的精确算法:


另一个选项(如果适用)-创建新多边形ABCDEP',并且始终包含点。

我无法创建新多边形,因为这会破坏凸面细分,使相邻多边形凹。关于精确的算术,我不一定需要任意精度,我只需要我的浮点错误在剪裁和多边形包含测试之间保持一致。@JDS-这个问题在