可以说我们有一个锯齿状的形状:
沿着它移动的两个生物是轮廓。
然后,我们通过拉出角落,完全平滑的形状。
我们得到这个:
现在很容易看到橙色正在顺时针和绿色CCW。 我怎么能告诉他们正在移动的方向,而不是平滑的形状?
新图片
画一条线到无穷远,并计算你穿过形状的次数(偶数或奇数),不包括生物所在的部分。 然后检查该生物是在该行的左边还是右边。
在这个例子中,我们穿过两次(甚至是)的形状,我们走到左边。 结果是立即从这个表:
# 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似乎已经解决了这个问题,但这是我的解决scheme:
计算你的形状覆盖的面积,意义
area = 0 foreach (edge in shape) area += edge.begin.x * edge.end.y - edge.begin.y * edge.end.x
使用上面计算的面积,可以很容易地判断形状本身是否是顺时针的。 只有在面积小于零的情况下才是顺时针的。
检查对象是否以顶点顺序或相反方向移动。