在研究三角形点测试的各种方法(2D情况)时,我发现使用重心坐标的方法是最常用的方法。 async documentation是StackOverflow的答案,可以解释它。
为什么这种方法最受欢迎?它可能与减少计算量有关,但数值稳定性呢?这种算法是否更适合于“同一侧”技术,适用于该点特别靠近边界的情况?
答案 0 :(得分:2)
如果你解决了它:
p = p0 + (p1 - p0) * s + (p2 - p0) * t
s = <0.0,1.0>
t = <0.0,1.0>
s+t<=1.0
在解决这个系统时:
p.a = p0.a + (p1.a - p0.a) * s + (p2.a - p0.a) * t
p.b = p0.b + (p1.b - p0.b) * s + (p2.b - p0.b) * t
----------------------------------------------------
你有两个代数选项:
I. t = (p.a - p0.a - (p1.a - p0.a) * s) / (p2.a - p0.a)
II. p.b = p0.b + (p1.b - p0.b) * s + (p2.b - p0.b) * t
----------------------------------------------------
II. p.b = p0.b + (p1.b - p0.b) * s + (p2.b - p0.b) * (p.a - p0.a - (p1.a - p0.a) * s) / (p2.a - p0.a)
II. s = (p.b-p0.b) / ( (p1.b-p0.b) + ( (p2.b-p0.b)*(p.a-p0.a-(p1.a-p0.a)/(p2.a-p0.a) ) )
...
和
I. s = (p.a - p0.a - (p2.a - p0.a) * t) / (p1.a - p0.a)
II. p.b = p0.b + (p1.b - p0.b) * s + (p2.b - p0.b) * t
----------------------------------------------------
...
这为您提供了2个代数解决方案选项。为了确保稳定性,你应该用足够大的数量来划分。因此,您应该选择轴(a,b
- &gt; x,y
)和点顺序,这样您就不会将零或小幅度数除以。
为避免这种情况,您可以使用矩阵方法
p.a = p0.a + (p1.a - p0.a) * s + (p2.a - p0.a) * t
p.b = p0.b + (p1.b - p0.b) * s + (p2.b - p0.b) * t
--------------------------------------------------
|p.a| | (p1.a - p0.a) , (p2.a - p0.a) , p0.a | | s |
|p.b| = | (p1.b - p0.b) , (p2.b - p0.b) , p0.b | * | t |
| 1 | | 0 , 0 , 1 | | 1 |
--------------------------------------------------------
| s | | (p1.a - p0.a) , (p2.a - p0.a) , p0.a | | p.a |
| t | = inverse | (p1.b - p0.b) , (p2.b - p0.b) , p0.b | * | p.b |
| 1 | | 0 , 0 , 1 | | 1 |
------------------------------------------------------------------
此外,您还可以获得更多轴顺序,点顺序选项,以便逆矩阵可计算。如果使用亚决定因素方法进行逆矩阵解,则唯一重要的是最终除法步骤。所以你可以选择订单,直到你有非零行列式。