0

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

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

4

4 回答 4

2

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

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

于 2012-09-29T15:36:53.503 回答
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

Point-inside-triangle 测试(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% 的时间:所有三角形都有两个共同的顶点。当然,您也只能测试其中的五个:-)

于 2012-09-29T15:38:58.500 回答
0

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

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

实际上,在您的情况下,您将有 9 个直线方程。如果你在你的六边形的中心取原点,这条线的方程会很容易。只需找到这 9 个值并搜索满足上述条件的 3 个这样的值。这三个值的父方程构成了三角形。

于 2012-09-29T15:38:04.277 回答
0

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

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

如果您有剩余的顶点按到该点的距离排序(总共 6 个,因为它们由相邻的三角形共享),那么您要查找的三角形是在按升序遍历的列表中首先找到最远顶点的三角形。

于 2012-09-29T16:08:45.913 回答