在给定x,y坐标的情况下,六边形内有6个等边三角形,如何确定坐标所在的等边三角形?

时间:2012-09-29 15:25:15

标签: algorithm geometry polygon

我正在3D虚拟世界中创建一个游戏。我用6个等边三角形创建了一个六边形,编号为t1,t2,t3,t4,t5,t6。

给定六边形内的x,y坐标,我可以使用什么公式来确定该点所在的三角形?

4 个答案:

答案 0 :(得分:2)

您可以将(x,y)坐标转换为极坐标。

你的六边形中有6个等边三角形,所以每个“三角边界”用Pi / 3弧度分开。因此,当你有θ角度时,你可以猜出你所在的三角形。

答案 1 :(得分:2)

如果您知道该点位于六边形内部,并且您知道三角形的方向,则可以计算该点相对于中心的角度:

atan2((y-yc)/(x-xc)).

如果x == xc角度为+90或-90度(PI / 2或-PI / 2弧度),具体取决于y。

(如果您没有atan2,则需要手动检查象限:参见

http://en.wikipedia.org/wiki/Polar_coordinate_system#Converting_between_polar_and_Cartesian_coordinates

三角形内部测试(A,B和C是三角形的顶点,表示为(x,y)):

// Compute vectors        
v0 = C - A             // Which means v0[x] = C[x] - A[x], v0[y] = C[y] - A[y]
v1 = B - A             // etc.
v2 = P - A

// Compute dot products
dot00 = dot(v0, v0)    // dot(a,b) is a[x]*b[x]+a[y]*b[y]
dot01 = dot(v0, v1)
dot02 = dot(v0, v2)
dot11 = dot(v1, v1)
dot12 = dot(v1, v2)

// Compute barycentric coordinates (faster using inverse, but clearer this way)

denom = (dot00 * dot11 - dot01 * dot01)
u = (dot11 * dot02 - dot01 * dot12) / Denom
v = (dot00 * dot12 - dot01 * dot02) / Denom

// Check if point is in triangle
return (u >= 0) && (v >= 0) && (u + v < 1)

from http://www.blackpawn.com/texts/pointinpoly/default.html

请记住,通过保存计算可以节省50-66%的时间:所有三角形都有两个共同的顶点。此外,你只能测试五个,当然: - )

答案 2 :(得分:0)

你可以通过检查点是否位于形成一个三角形的线的同一侧来做到这一点。继续检查你的六个三角形,找到适合的三角形。

求出形成三角形的线的方程,并在每个方程中检查点的坐标(确保每个方程的'x'具有相同的符号)。如果结果值具有2个相同且1个不同的符号,则该点位于三角形内。

实际上,在你的情况下,你将有9个方程线。如果将原点取在六边形的中心,则线的方程将非常简单。只需找到这9个值并搜索满足前面提到的条件的3个这样的值。这三个值的父方程构成三角形。

答案 3 :(得分:0)

直观地说,该点应位于三角形内部,其顶点平均接近该点。

中心顶点可以忽略,因为它由所有三角形共享。

如果你有重新排列的顶点按距离点的距离排序(总共6个,因为它们被相邻的三角形共享),你要找的三角形是在列表中首先找到最远的顶点的三角形。顺序。