연결된 경로에서 객체가 CW 또는 CCW를 움직이는 지 어떻게 알 수 있습니까?


19

들쭉날쭉 한 모양이 있다고 가정 해 봅시다.

모양 0

그리고 두 생물이 그 윤곽을 따라 움직입니다.

그런 다음 모서리를 당겨 모양을 완전히 매끄럽게 만듭니다.

우리는 이것을 얻습니다 :

부드러운

오렌지가 CW와 녹색 CCW를 움직이고 있음을 쉽게 알 수 있습니다. 모양을 부드럽게하지 않고 이동 방향을 어떻게 알 수 있습니까?

새로운 이미지

여기에 이미지 설명을 입력하십시오


여기 내 2 센트입니다 : i.imgur.com/zrBdw.png
Kendall Frey

답변:


27

무한대로 선을 그리고 생물체가있는 선분을 세지 않고 모양을 교차하는 횟수 (짝수 또는 홀수)를 세십시오. 그런 다음 생물이 해당 라인의 왼쪽 또는 오른쪽으로 가고 있는지 확인하십시오.

예

이 예에서는 도형을 두 번 교차하므로 왼쪽으로갑니다. 결과는이 테이블에서 즉시 나타납니다.

   # 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

움직이는 선 생물을 포함합니까?
Ali1S232

@Gajoo : 아니요. 따라서 6 번 줄에서> = 대신>가 표시됩니다. 그러나 줄을 포함하고 테이블 내용을 반대로 할 수 있습니다.
sam hocevar

1
나는이 방법에 근거한 답과 내가 준 답을 던졌다. 여기에 두 가지 접근 방식이 모두 표시되어 다행입니다. 이것은 개념적으로 단순하고 매우 우아하지만, 선분 교차 테스트를 수행해야하는데, 이는 견고 해지기 까다로울 수 있습니다.
Trevor Powell

@TrevorPowell True입니다. 가장 먼 가장자리를 찾는 것은 혼란 스러울 수 있습니다. 가장자리의 가장 먼 정점을 기준으로 먼저 확인한 다음 모양의 중심과 두 가장자리의 중심 (정점을 공유하는 두 개의 중심)을 통해 선을 그리고 선 중 하나가 다른 가장자리와 교차하는지 확인합니다. 이 가장자리 중 하나를 건너면 무한대. 그것은 잘 작동했다
wolfdawn

5

모양 데이터 구조에서 사용할 수있는 정보에 따라 다르지만 모양의 윤곽선을 따라 CW를 이동하는 생물체는 항상 오른쪽에 모양의 내부를 가지며 CCW를 이동하는 생물체는 모양의 내부를 가지게됩니다 그 왼쪽.


훨씬 간단한 해결책이자 저의 첫 생각입니다.
증폭 91

도형의 안쪽 방향을 어떻게 알 수 있습니까? 모양의 가장자리를 따라 움직이는 것은 왼쪽이나 오른쪽에 있다는 것을 의미합니다. 그것이 어떤 방식인지 어떻게 알 수 있습니까?
Ali1S232

매우 우아한 솔루션이지만 일반적으로 사실은 아닙니다. 도넛을 테이블에 평평하게하여 2 차원 모양을 만든다고 상상해보십시오. 이 도형의 가장자리를 따라 걷거나 왼쪽의 도형 내부를 유지하고 시작 위치에 따라 시계 방향 또는 시계 반대 방향 랩을 만들 수 있습니다.
Marcks Thomas

4
  1. 모양의 중심점을 계산하십시오.
  2. 중앙에서 모양의 가장 먼 가장자리를 선택하십시오.
    • (가장 먼 가장자리를 선택하면 모양의 반전 된 오목 부분에서 시작하지 않으므로 전체 모양에 대해 시계 방향 / 반 시계 방향으로 뒤로 결정됩니다)
  3. 해당 가장자리를 따라 어떤 방향이 시계 방향인지 확인
    • (이를 간단히 구현하려면 모양의 중심에서 선택한 가장자리의 각 끝까지 각도를 비교해야합니다. 각도 차이의 부호는 시계 방향과 시계 반대 방향을 나타냅니다)
  4. 2 단계에서 선택한 모서리부터 시작하여 모서리의 목록을 작성하여 모양의 모든 모서리를 반복합니다. 각 모서리에 대해 두 정점을 시계 방향으로 저장합니다.
    • (시간이 지나도 모양이 변하지 않으면 나중에 사용할 수 있도록이 가장자리 목록을 저장할 수 있으므로 프레임마다 처음 네 단계를 수행 할 필요가 없습니다)
    • (이미 에지 목록이있을 수 있습니다. 그렇다면이 시계 방향 정점 순서를 동일한 목록에 저장할 수 있습니다.)
  5. 엔터티가 시계 방향 또는 반 시계 방향으로 움직이는 지 확인하려면
    • 엔터티가 어느 가장자리를 따라 이동하고 있는지 확인합니다.
    • 4 단계에서 다시 결정한 에지의 시계 방향 시작 정점에서 벡터에 대한 개체의 이동 방향의 내적을 수행합니다.
    • 내적의 결과가 0보다 큰 값이면 엔터티가 시계 방향으로 이동합니다. 0보다 작 으면 시계 반대 방향을 의미합니다.

매우 영리한 답변
wolfdawn

작은 질문이 있습니까? 6-> 7 또는 9-> 10 (0 기준)에서 이동하는 것이 시계 방향으로 움직이는 지 어떻게 알 수 있습니까? 당신의 대답에 따라 그의 모양의 정점이 가장 왼쪽 점 CWW에서 시작하여 번호가 매겨진다고 가정합니다.
Ali1S232

가장 먼 가장자리부터 시작하여 그 가장자리에서 시계 방향이 어떤 방향인지 알아냅니다. 가장자리 A가 정점 'a'에서 'b'로 시계 방향이라고 가정 해 봅시다. 그런 다음 가장자리 B (정점 'b'와 'c'가있는)로 이동하면 B가 'b'에서 'c'로 시계 방향임을 알 수 있습니다. 마찬가지로 가장자리 C는 'c'에서 'd'로 시계 방향이됩니다. 한쪽 가장자리에서 올바른 시계 방향 (1 ~ 3 단계)을 알고 나면 모양 가장자리 주위의 시계 방향으로 계속해서 가장자리의 실제 위치를 보지 않고도 모든 가장자리에 대해 올바른 '시계 방향'을 추론 할 수 있습니다. 오목 함은 괜찮습니다.
Trevor Powell

가장자리 A가 'a'에서 'b'로 시계 방향인지 아니면 'b'에서 'a'로 시계 방향인지 어떻게 알 수 있습니까? 나는 당신이 그 부분을 놓쳤다 고 생각합니다.
Ali1S232

@Gajoo 3 단계에서 괄호로 묶은 지점입니다. 실제로 전체 프로세스의 중요한 단계이므로 괄호로 묶어서는 안됩니다.
Trevor Powell

2

다각형이 어느 방향으로 정의되는지, 정점이 어떻게 둥글게되는지 알아야합니다.

이것을 모르면 다각형의 면적을 계산하여 해결할 수 있습니다.

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;
}

기호 결과 (양 또는 음)가 시계 방향 또는 반 시계 방향인지를 알려줍니다의. 좌표계에 따라 달라지기 때문에 어느 방향으로 회전하는지 확인하려면이 작업을 시도해야합니다.

모양이 시계 방향 인 경우 :

  • 가는 생물 앞으로 모양의 둘레는 것입니다 시계 방향으로 하고,
  • 도형의 뒤로 돌아가는 생물 은 반 시계 방향으로 갑니다.

모양이 시계 반대 방향 인 경우 :

  • 가는 생물 앞으로 모양의 둘레는 것입니다 반 시계 방향으로 하고,
  • 도형의 뒤로 돌아가는 생물 은 시계 방향으로 가고 있습니다.

0

Trevor가 이미이 질문을 다룬 것처럼 보이지만 여기에 내 해결책이 있습니다.

  1. 모양이 차지하는 면적을 계산하십시오.

    area = 0
    foreach (edge in shape)
        area += edge.begin.x * edge.end.y - edge.begin.y * edge.end.x
  2. 위와 같이 계산 된 영역을 사용하면 모양 자체가 시계 방향인지 여부를 쉽게 알 수 있습니다. 면적이 0 미만인 경우에만 시계 방향입니다.

  3. 객체가 꼭짓점이 같은 방향으로 또는 반대 방향으로 움직이는 지 확인하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.