답변:
무한대로 선을 그리고 생물체가있는 선분을 세지 않고 모양을 교차하는 횟수 (짝수 또는 홀수)를 세십시오. 그런 다음 생물이 해당 라인의 왼쪽 또는 오른쪽으로 가고 있는지 확인하십시오.
이 예에서는 도형을 두 번 교차하므로 왼쪽으로갑니다. 결과는이 테이블에서 즉시 나타납니다.
# 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
모양 데이터 구조에서 사용할 수있는 정보에 따라 다르지만 모양의 윤곽선을 따라 CW를 이동하는 생물체는 항상 오른쪽에 모양의 내부를 가지며 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
위와 같이 계산 된 영역을 사용하면 모양 자체가 시계 방향인지 여부를 쉽게 알 수 있습니다. 면적이 0 미만인 경우에만 시계 방향입니다.
객체가 꼭짓점이 같은 방향으로 또는 반대 방향으로 움직이는 지 확인하십시오.