Answers:
画一条线到无穷远处,计算出您穿过形状的次数(偶数或奇数),而不计算生物所在的线段。然后检查该生物是在该行的左边还是右边。
在此示例中,我们将形状交叉两次(均匀),然后转到左侧。该结果直接来自此表:
# Crosses | even | odd
Direction | |
-------------+-------+------
left | CCW | CW
right | CW | CCW
用伪代码:
x, y = position of creature
vx, vy = direction of creature movement
crossings = 0
for each x1, y1, x2, y2 in shape segments:
if (x1 < x and x <= x2) or (x2 < x and x <= x1):
if y - y1 > (x - x1) * (y2 - y1) / (x2 - x1):
++crossings
if (crossings & 1) == (vx < 0):
return CW
else
return CCW
您需要知道定义多边形的方式,顶点围绕多边形的方式。
如果您不知道,可以通过计算多边形的面积来解决:
float Polygon::area() {
float result = 0.0f;
for(int a = 0; a < vertexCount; a ++) {
int b = (a+1) % vertexCount;
result += vertices[a].x * vertices[b].y;
result -= vertices[a].y * vertices[b].x;
}
return result * .5f;
}
结果的符号(正或负)将告诉您它是顺时针还是逆时针。您需要尝试一下,看看它适合您的方向,因为这取决于您的坐标系。
如果形状是顺时针:
如果形状是逆时针:
看来Trevor已经解决了这个问题,但这是我的解决方案:
计算形状覆盖的面积,这意味着
area = 0
foreach (edge in shape)
area += edge.begin.x * edge.end.y - edge.begin.y * edge.end.x
使用如上所述计算的面积,您可以轻松判断形状本身是否为顺时针方向。仅当面积小于零时才是顺时针方向。
检查对象是否以与顶点有序相同的方向或相反的方向移动。