Performance 查找三角形2D中任意点的最快方法

Performance 查找三角形2D中任意点的最快方法,performance,algorithm,Performance,Algorithm,我需要一种最快的方法来找到二维三角网边内的任何点。有什么帮助吗?三个顶点的平均值——质心是三角形内部的一个点,计算速度可能与其他顶点一样快 在顶点共线的退化情况下,它仅位于边上。在这种情况下,三角形中的每个点都位于一条边上,因此没有解。或者:您可以首先计算三角形的曲面。 然后进行第二次计算,点将三角形分为其他三个三角形。如果这三个子三角形的曲面大于,则点位于三角形区域之外。明白我的意思吗?顶点A、B、C 载体 AB=B-A AC=C-A p=A+t*AB+u*AC t、 有随机数吗?在[0..1

我需要一种最快的方法来找到二维三角网边内的任何点。有什么帮助吗?

三个顶点的平均值——质心是三角形内部的一个点,计算速度可能与其他顶点一样快


在顶点共线的退化情况下,它仅位于边上。在这种情况下,三角形中的每个点都位于一条边上,因此没有解。

或者:您可以首先计算三角形的曲面。 然后进行第二次计算,点将三角形分为其他三个三角形。如果这三个子三角形的曲面大于,则点位于三角形区域之外。明白我的意思吗?

顶点A、B、C

载体

AB=B-A

AC=C-A

p=A+t*AB+u*AC


t、 有随机数吗?在[0..1]范围内,t+u如果三角形表示为点,则必须考虑每个坐标,因此Steve Jessop的答案几乎是最优的

请注意,您实际上需要做的就是从一个点开始,并以有限的数量将其撞向另外两个点。这就是平均值的作用,但有一个非常具体的方式

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

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

xm = (x0 + (x1 + x2) / 2) / 2
ym = (y0 + (y1 + y2) / 2) / 2
如果变量是整数,编译器应该将除法优化为位移位,如果调度正确,在ARM中基本上是自由的。如果变量是浮点数或双倍数,编译器应将其优化为简单的指数递减。众所周知,浮点除法速度相对较慢

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


为了提供一些直觉来解释为什么这样做:首先,我们找到由x1,y1和x2,y2组成的线段的中点。然后我们找到由该点形成的线段与x0,y0之间的中点。如果你画了一个三角形的图并这样做了,那么很明显这是可行的。

你的意思是:给定一个有点a、B、C和点D的三角形。点D在三角形a、B、C中吗?其他一切都很简单。你的三角形是如何表达的?作为平面上的点、一对向量等…?吹毛求疵,但最快的方法可能是预先计算该点,而不必计算。@awoodland:或者更好的方法是,首先选择三角形,使原点是它内部的点,而不是边上的点。+1。通常,如果v1、v2和v3是顶点,则w1+w2+w3=1,0