找到三角形2D中任何点的最快方法

时间:2012-04-03 15:54:55

标签: performance algorithm

我需要一种最快的方法来在2D中找到三角形(而不是边缘)内的任何点。有什么帮助吗?

4 个答案:

答案 0 :(得分:5)

三个顶点(质心)的“平均值”是三角形内的一个点,可能与其他任何一个一样快。

它只位于退化情况下的边缘,其中顶点是共线的。在这种情况下,三角形中的每个点都位于边缘,因此没有解决方案。

答案 1 :(得分:2)

如果你的三角形表示为点,你将不得不考虑每个坐标,所以Steve Jessop的答案几乎是最优的。

请注意,您实际需要做的就是从一个点开始,然后向有限的两个点开始。这是平均完成的,但是以非常具体的方式。

加法很快。根据平台和编译器的不同,划分可能会很慢。

例如,在现代ARM内核上,我会在平均值上选择此版本:

xm = (x0 + (x1 + x2) / 2) / 2
ym = (y0 + (y1 + y2) / 2) / 2

如果变量是整数,编译器应该优化分区到位移位,如果调度正确,则在ARM中基本上是免费的。如果变量是浮点数或双精度数,则编译器应将它们优化为简单的指数递减。已知浮点除法相对较慢。

最终,测试并看到。除非您正在进行相对较低级别的代码优化,否则您可能不会看到差异。另一方面,如果你在一个紧密的内循环中使用它,你可能会。

提供一些关于其工作原理的直觉:首先,我们找到由(x1, y1)(x2, y2)形成的线段的中点。然后我们找到由 点和(x0, y0)形成的线段之间的中点。如果你绘制一个三角形的图表并执行此操作,则立即清楚地知道这是有效的。

答案 2 :(得分:1)

顶点A,B,C

载体

AB = B-A

AC = C-A

P = A + t * AB + u * AC

t,u - 范围[0..1]中的任何数字(随机?)和t + u <= 1

答案 3 :(得分:0)

或:您可以先计算三角形的表面。 然后你做第二次计算,你的点在三个其他三角形中划分三角形。如果这三个子三角形的表面比较大,那么你的点就在三角形区域之外。看看我的意思?