빠르게 움직이는 물체에 대한 육각 충돌 감지?


39

객체에는 위치와 속도 벡터가 있습니다. 일반적으로 위치가 두 물체가 충돌하는지 확인하는 데 사용됩니다. 이것은 물체가 너무 빠르게 움직여 첫 번째 충돌 검사에서 첫 번째 물체의 앞쪽에 있고 뒤에있는 물체가 매우 빠르게 움직이는 물체에 문제가됩니다. 두 번째 충돌 점검.

BoundingBox 충돌 실패

이제 선 기반 충돌 검사도 있습니다.이 검사에서는 각 객체의 이동 벡터가 다른 객체의 경계 상자와 교차하는지 확인합니다. 이것은 점의 확장으로 볼 수 있습니다. 이것은 빠르게 움직이는 물체가 실제로 작은 경우에만 작동합니다.

육각 충돌 승리

그래서 내 생각은 점을 확장하는 대신 사각형을 확장하지 않는 이유는 무엇입니까? 이것은 육각형이됩니다.

자, 지금까지는 좋았습니다. 그러나 실제로 이런 종류의 두 육각형이 교차하는지 어떻게 확인합니까? 이것들은 매우 구체적인 육각형입니다.

육각형 사양

보너스 질문 : 충돌이 발생한 정확한 위치를 계산할 수 있습니까? 이 기능은 위치 및 전력량과 같이 실제로 발생한 상황을 감지하고 충돌과 프레임 끝 사이의 시간에 어떻게 이동했는지 시뮬레이션하는 데 매우 유용합니다.


for (A 라인) for (B 라인) if (라인이 교차) 충돌-A의 경우 B의 B 또는 B의 A를 다루지 않는 것을 제외하고. 흠. =)
Jari Komppa 16:20에

4
당신은 상자에 최선을 다하고 있습니까? 그린 상자는 정확도의 손실이 적지 만 비교적 쉬운 충돌 알고리즘으로 원으로 표시 될 수 있습니다. 스윕 원 충돌 감지를 검색하십시오. 길이 / 너비 비율이 1에서 멀어지면 덜 매력적입니다.
Steve H

@SteveH 가장 유연한 솔루션을 찾고 있으므로 길이 / 너비 비율이 다소 중요합니다.
API-Beast

1
육각형이 교차한다고해서 충돌이 발생한 것은 아닙니다. 실수로 교차하는지 여부를 실수로 알릴 수 있더라도 충돌이 있는지 여부와 분명히 언제 어디서 발생하는지 확인해야합니다. 따라서 아직 보너스 질문으로 넘어갈 수 없습니다.
jrsala

2
나는 이것을 전에 시도하지는 않았지만 2d 공간의 육각형 대신 2d의 움직임을 하나의 축이 시간 인 3d 공간의 부피로 생각할 수 있습니다. 그런 다음 두 개의 3D 다면체를 (x, y, t) 좌표와 교차시킵니다. 두 개의 솔리드 객체가 교차하면 최소 t 값을 찾고 싶습니다. 모든 B 좌표를 A의 참조 프레임으로 변환하여 조금 단순화 할 수 있습니다. 나는 이것을 구현하지 않았지만 그것이 시작될 곳입니다.
amitp

답변:


34

솔루션은 실제로 예상보다 간단합니다. 트릭은 육각 기술 전에 Minkowski 빼기 를 사용 하는 것입니다.

여기에 속도 vA와가있는 직사각형 A와 B가 있습니다 vB. 참고 것을 vA하고는 vB실제로없는 속도, 그들은있는 거리를 한 프레임 동안 여행했다.

1 단계

이제 사각형 B를 점 P로 대체하고 사각형 A를 사각형 C = A + (-B)로 바꿉니다. 이는 A와 B의 차원의 합을가집니다. Minkowski 추가 속성은 점과 새 사각형 사이에 충돌이 발생한다는 상태 원래 두 사각형 사이에 충돌이 발생하는 경우에만 :

2 단계

그러나 사각형 C가 vector를 따라 이동 vA하고 점 P가 vector를 따라 이동 vB하면 참조 프레임을 간단하게 변경하면 사각형 C가 여전히 움직이고 점 P가 벡터를 따라 움직 인 것과 같다는 것을 알 수 있습니다 vB-vA.

3 단계

그런 다음 간단한 상자 세그먼트 교차 수식을 사용하여 새 참조 프레임에서 충돌이 발생하는 위치를 알 수 있습니다.

마지막 단계는 올바른 참조 프레임으로 다시 이동하는 것입니다. 원이 교차 할 때까지 점으로 이동 한 거리를 벡터 길이로 나누면 다음 과 같은 vB-vA값을 얻을 수 있습니다. 충돌은 시간에 발생 하여 프레임의 기간입니다.s0 < s < 1s * TT

madshogo의 논평 :
Mr Beast 자신의 답변 에 비해이 기술의 한 가지 큰 장점은 회전이 없으면 "Minkowski 빼기" A + (-B)모든 후속 타임 스텝에 대해 한 번 계산 될 수 있다는 것입니다 !

모든 시간 걸리는 만 알고리즘 그래서 (민코프 스키 합, 복잡도 O (MN) 여기서 m은 정점의 개수 및 N 의 정점의 개수 B는 ) 효과적으로 충돌 검출 일정 - 제작 한 번만 사용될 수있다 시간 문제!

나중에 AB 가 (쿼드 트리의) 장면의 다른 부분에 있고 더 이상 충돌하지 않는 것을 알면 합계를 버릴 수 있습니다 .

대조적으로, 비스트 씨의 방법은 각 시간 단계마다 많은 계산이 필요합니다.

또한 축 정렬 사각형의 경우 A + (-B) 는 실제로 모든 합을 꼭짓점으로 계산하는 것보다 훨씬 간단하게 계산할 수 있습니다. 다만 확장 높이 추가하여 B 의 높이 및 폭 B 의 폭 (양쪽 절반).

그러나이 모든 것은 AB 가 회전 하지 않고 볼록한 경우 에만 작동합니다 . 회전이 있거나 오목한 모양을 사용하는 경우 스윕 볼륨 / 영역을 사용해야합니다.
의견의 끝


4
그러나 다소 흥미로운 접근법처럼 보이지만 아직 100 %를 파악하지는 못합니다. 객체가 실제로 작고 두 줄 사이를 이동할 때 어떤 일이 발생합니까? i.imgur.com/hRolvAF.png
야수

-1 :이 방법으로 어떤 식 으로든 충돌이 발생하지 않습니다. 세그먼트와 압출 볼륨이 교차 하지 않는 경우 에만 발생 하지 않도록 할 수 있습니다 . 그러나 그것들이 교차하지만 충돌이 없을 가능성은 전적으로 가능합니다. 문제는 "이제 [...] 간단한 세그먼트 세그먼트 교차로를 사용하여 충돌이 발생한 위치를 결정할 수 있습니다."부분입니다.
jrsala

2
@madshogo 당신이 맞아요. 나는 이것이 문제가되지 않을 객체 크기에 비해 시간 단계가 충분히 작다고 가정했지만 일반적인 경우에는 그다지 강력하지는 않습니다. 나는 그것을 고칠 것입니다.
sam hocevar

@ SamHocevar 만약 당신이 대답을 수정할 수 있다면 좋을 것입니다.
API-Beast

1
그렇기도하고 아니기도 @LuisAlves ... 모든 논리 작품,하지만 당신은 교체해야합니다 vB-vA함께 g(t)-f(t)fg시간이 지남에 따라 A와 B의 위치입니다. 이것은 더 이상 직선이 아니므로 파라 메트릭 커브 교차 문제인 상자를 해결해야합니다.
sam hocevar

17

우선 축 정렬 사각형의 경우 Kevin Reid의 답변이 가장 좋고 알고리즘이 가장 빠릅니다.

둘째, 간단한 모양의 경우 충돌 감지를 위해 상대 속도 (아래 참조)와 분리 축 정리를 사용하십시오. 그것은 것이다 충돌이 직선 운동 (NO 회전)의 경우 발생 여부를 알려줍니다. 그리고 회전이 있다면, 정밀하게하기 위해 약간의 시간 간격이 필요합니다. 이제 질문에 대답하십시오.


일반적인 경우에 두 개의 볼록한 모양이 교차하는지 어떻게 알 수 있습니까?

육각형뿐만 아니라 모든 볼록한 모양에 작동하는 알고리즘을 제공합니다.

XY 가 두 개의 볼록한 모양 이라고 가정하십시오 . 공통점이있는 경우에만 교차합니다. 즉, x = y 와 같은 점 x X 와 점 y ∈ Y가 있습니다. 공간을 벡터 공간으로 간주하면 x-y = 0이 됩니다. 이제 우리는이 Minkowski 비즈니스에 도달합니다.

XYMinkowski 합x ∈ Xy ∈ Y에 대한 모든 x + y 의 집합입니다 .


X와 Y의 예


X, Y 및 Minkowski 합계, X + Y

가정하면 (-Y) 모두의 집합이다 -y 대한 Y ∈ Y는 다음 문단 주어진 XY 교차하는 경우에만, X + (-Y) 포함 0 원점이다 .

참고 : 왜 X-Y 대신 X + (-Y) 를 쓰 나요? 수학에서 AB 의 Minkowski 차이라는 연산이 있기 때문에 때때로 X-Y로 쓰여지 지만 x ∈ Xy ∈ Y에 대한 모든 x-y 세트 (실제 Minkowski) 와는 아무런 관련이 없습니다. 차이는 조금 더 복잡합니다).

그래서 우리는 X-Y 의 Minkowski 합을 계산하고 그 원점이 포함되어 있는지 확인 하고 싶습니다 . 원점은 다른 지점과 비교하여 특별하지 않으므로 원점이 특정 도메인 내에 있는지 확인하기 위해 주어진 지점이 해당 도메인에 속하는지 여부를 알려주는 알고리즘을 사용합니다.

XY 의 Minkowski 합은 멋진 특성을 지니고 있습니다. 즉, XY 가 볼록하면 X + Y 도 좋습니다. 그리고 점이 볼록 세트에 속하는지 찾는 것이 그 세트가 볼록하지 않은 것보다 훨씬 쉽습니다.

우리는 가능성을 모두 계산할 수없는 X - Y 에 대한 X ∈ XY ∈ Y를 같은 지점의 무한대가 있기 때문에 XY 있기 때문에, 그래서 희망, X , YX + Y는 볼록, 우리는 사용을 할 수 있습니다 정점 인 모양 XY를 정의하는 "가장 바깥 쪽"점 이며 , X + Y 의 가장 바깥 쪽 점을 가져옵니다 .

이러한 추가 지점은 X + Y 의 가장 바깥쪽에 의해 "주변" 되므로 새로 얻은 볼록한 모양을 정의하는 데 기여하지 않습니다. 우리는 그것들이 포인트 세트의 " 볼록 껍질 "을 정의하지 않는다고 말합니다 . 그래서 우리가하는 것은 원점이 볼록 껍질 안에 있는지를 알려주는 최종 알고리즘을 준비하면서 그것들을 제거하는 것입니다.


X + Y의 볼록 껍질. "내부"정점을 제거했습니다.

그러므로 우리는 얻는다

최초의 순진한 알고리즘

boolean intersect(Shape X, Shape Y) {

  SetOfVertices minkowski = new SetOfVertices();
  for (Vertice x in X) {
    for (Vertice y in Y) {
      minkowski.addVertice(x-y);
    }
  }
  return contains(convexHull(minkowski), Vector2D(0,0));

}

루프는 분명히 복잡도 O (mn) 를 가지며, 여기서 mn 은 각 모양의 꼭짓점 수입니다. minkoswki세트는 포함 백만 최대 요소. convexHull알고리즘에 따라 복잡도가 사용한 알고리즘을 , 그리고 당신이 목표로 할 수 O (K 로그 (K)) k는 점 세트의 크기, 그래서 우리의 경우 우리가 얻을 O (백만 로그 (백만)을 ) . 이 contains알고리즘은 볼록 껍질의 모서리 수 (2D) 또는면 (3D)의 수와 선형적인 복잡성을 가지므로 시작 모양에 따라 달라 지지만 O (mn) 보다 크지 않습니다 .

contains볼록한 모양 에 대한 알고리즘을 Google에 알려 드리겠습니다 . 그것은 매우 일반적인 것입니다. 시간이 있으면 여기에 둘 수도 있습니다.


하지만 충돌 감지로 인해 많은 것을 최적화 할 수 있습니다.

우리는 원래 두 단계의 몸 AB 가 시간 단계 dt 동안 회전하지 않고 움직였습니다 (사진을 보면서 알 수 있는 것부터 ). 지속 시간 dt 의 시간 단계 동안 일정한 AB 의 각각의 속도를 v Av B 라고합시다 . 우리는 다음을 얻습니다.

그리고 당신이 당신의 그림에서 지적 하듯이,이 몸체들은 그들이 움직일 때 영역 (또는 볼륨, 3D)을 스윕합니다 .

타임 스텝 후에 A 'B' 로 끝납니다 .

여기서 순진 알고리즘을 적용하려면 스윕 된 볼륨 만 계산하면됩니다. 그러나 우리는 이것을하지 않습니다.

B 의 참조 프레임 에서 B 는 움직이지 않습니다 (duh!). 그리고 Av A -v B를 계산하여 얻는 B에 대해 특정 속도 습니다 (대화를 할 수 있으며 A 의 참조 프레임에서 B 의 상대 속도를 계산할 수 있습니다 ).

상대 운동

왼쪽에서 오른쪽으로 : 기본 참조 프레임의 속도; 상대 속도; 상대 속도 계산.

관련하여 B 자신의 참조 프레임에서 움직이지 등을, 당신은 단지 볼륨을 계산해야하는 경우 → 그 동안 이동로를 통해 스윕 (DT) 의 상대 속도로 V - V의 B는 .

이렇게하면 Minkowski 합계 계산에 사용될 정점 수가 줄어 듭니다 (때로는 크게).

또 다른 가능한 최적화는 바디 중 하나에 의해 스윕 된 볼륨을 계산하는 지점에 있습니다. A라고 가정 해 봅시다. A를 구성하는 모든 정점을 변환 할 필요는 없습니다. 바깥 쪽 정상 "얼굴"스위핑 방향. 분명히 당신은 이미 사각형의 스윕 영역을 계산할 때 알았습니다. 양수 여야하는 스위핑 방향과 함께 내적을 사용하여 법선이 스위핑 방향을 향하는 지 여부를 알 수 있습니다.

교차점에 대한 귀하의 질문과 관련이없는 마지막 최적화는 우리의 경우 실제로 유용합니다. 그것은 우리가 언급 한 상대 속도와 소위 분리 축 방법을 사용합니다. 분명히 당신은 이미 그것에 대해 알고 있습니다.

질량 중심 (즉, 질량 중심과 가장 먼 정점 사이의 거리)에 대한 AB반지름다음 과 같이 알고 있다고 가정합니다 .

충돌은 가능한 경우에만 발생할 수의 경계 원 대회의 B . 우리는 여기가되지 않습니다 참조와의 거리를 계산하는 컴퓨터 말할 수있는 방법 C B를내가 다음 그림과 같이 및 확인이의 반경의 합보다 더 큰 수 있도록 와 B . 더 크면 충돌이 없습니다. 더 작 으면 충돌합니다.

이것은 다소 긴 모양에서는 잘 작동하지 않지만 정사각형이나 다른 모양의 경우 충돌을 배제 하는 매우 휴리스틱 입니다.

그러나 B에 적용된 분리 축 정리 와 A로 스윕 된 볼륨 은 충돌이 발생하는지 여부를 알려줍니다. 관련 알고리즘의 복잡성은 각 볼록한 모양의 꼭짓점 수의 합과 선형이지만 실제로 충돌을 처리 할 때 마법이 덜됩니다.

교차점을 사용 하여 충돌을 감지 하는 데 도움이 되지만 충돌 발생 여부를 알려주 는 분리 축 정리만큼 좋지 않은 새롭고 더 나은 알고리즘

boolean mayCollide(Body A, Body B) {

  Vector2D relativeVelocity = A.velocity - B.velocity;
  if (radiiHeuristic(A, B, relativeVelocity)) {
    return false; // there is a separating axis between them
  }

  Volume sweptA = sweptVolume(A, relativeVelocity);
  return contains(convexHull(minkowskiMinus(sweptA, B)), Vector2D(0,0));

}

boolean radiiHeuristic(A, B, relativeVelocity)) {
  // the code here
}

Volume convexHull(SetOfVertices s) {
  // the code here
}

boolean contains(Volume v, Vector2D p) {
  // the code here
}

SetOfVertices minkowskiMinus(Body X, Body Y) {

  SetOfVertices result = new SetOfVertices();
  for (Vertice x in X) {
    for (Vertice y in Y) {
      result.addVertice(x-y);
    }
  }
  return result;

}

2

나는 '육각형'을 사용하는 것이 그다지 도움이되지 않는다고 생각합니다. 다음은 축 정렬 사각형의 정확한 충돌을 얻는 방법에 대한 스케치입니다.

X 좌표 범위가 겹치고 Y 좌표 범위가 겹치는 경우에만 두 개의 축 정렬 사각형이 겹칩니다. (이는 분리 축 정리의 특수한 경우로 볼 수 있습니다.) 즉, 사각형을 X 및 Y 축에 투영하면 문제가 두 개의 선로 교차로 줄어 듭니다.

한 축의 두 선이 교차 하는 시간 간격 을 계산하고 (예 : 시간에 시작 (물체의 현재 분리 / 물체의 상대적 접근 속도)) 다른 축에 대해서도 동일하게 수행합니다. 이러한 시간 간격이 겹치는 경우 겹침 내의 가장 빠른 시간은 충돌 시간입니다.


3
스케치를 잊어 버렸습니다.
MichaelHouse

2
@ Byte56 아니요, 의사 코드가 아니라 알고리즘의 스케치입니다.
Kevin Reid

아 ... 알 겠어요 내 실수.
MichaelHouse

이것은 실제로 가장 쉬운 방법입니다. 해당 코드를 추가하여 구현했습니다.
Pasha

1

사각형보다 더 많은 변의 다각형 충돌을 계산하는 쉬운 방법이 없다고 생각합니다. 나는 그것을 선과 정사각형과 같은 기본 모양으로 세분화 할 것입니다.

function objectsWillCollide(object1,object2) {
    var lineA, lineB, lineC, lineD;
    //get projected paths of objects and store them in the 'line' variables

    var AC = lineCollision(lineA,lineC);
    var AD = lineCollision(lineA,lineD);
    var BC = lineCollision(lineB,lineC);
    var BD = lineCollision(lineB,lineD);
    var objectToObjectCollision = rectangleCollision(object1.getRectangle(), object2.getRectangle());

    return (AC || AD || BC || BD || objectToObjectCollision);
}

객체의 경로 및 종료 상태 그림

이전 계산 중에 확인해야 할 각 객체의 시작 상태를 무시하는 방법에 유의하십시오 .


3
이것의 문제는 물체의 크기가 많이 다르면 작은 물체가 충돌을 일으키지 않고 큰 물체의 경로 내에서 움직일 수 있다는 것입니다.
API-Beast

0

별개의 축 정리

Seperate Axis Theorem은 "두 볼록 모양이 교차하지 않는 축을 찾을 수 있으면 두 모양이 교차하지 않는다" 거나 IT에 더 실용적 이라고 말합니다 .

"두 개의 볼록한 모양이 가능한 모든 축에서 교차하는 경우에만 교차합니다."

축 정렬 사각형의 경우 가능한 축은 정확히 x와 y입니다. 그러나 정리는 사각형에 국한되지 않으며 모양이 교차 할 수있는 다른 축을 추가하여 볼록한 모양에 적용 할 수 있습니다. 주제에 대한 자세한 내용은 N 개발자가이 자습서를 확인하십시오. http://www.metanetsoftware.com/technique/tutorialA.html#section1

다음과 같이 구현되었습니다.

axes = [... possible axes ...];
collision = true;
for every index i of axes
{
  range1[i] = shape1.getRangeOnAxis(axes[i]);
  range2[i] = shape2.getRangeOnAxis(axes[i]);
  rangeIntersection[i] = range1[i].intersectionWith(range2[i]);
  if(rangeIntersection[i].length() <= 0)
  {
    collision = false;
    break;
  }
}

축은 정규화 된 벡터로 표현 될 수 있습니다.

범위는 1 차원 선입니다. 시작은 가장 작은 투영 점으로, 끝은 가장 큰 투영 점으로 설정해야합니다.

"스위핑 된"사각형에 적용

문제의 육각형은 물체의 AABB를 "스윕"하여 생성됩니다. 스윕은 가능한 모든 충돌 축을 정확하게 하나의 움직임 벡터로 추가합니다.

shape1 = sweep(originalShape1, movementVectorOfShape1);
shape2 = sweep(originalShape2, movementVectorOfShape2);

axes[0] = vector2f(1.0, 0.0); // X-Axis
axes[1] = vector2f(0.0, 1.0); // Y-Axis
axes[2] = movementVectorOfShape1.normalized();
axes[3] = movementVectorOfShape2.normalized();

지금까지 두 육각형의 교차 여부를 확인할 수 있습니다. 그러나 더 좋아집니다.

이 솔루션은 모든 볼록한 모양 (예 : 삼각형)과 스위핑 된 볼록한 모양 (예 : 스윕 된 팔각형)에 적합합니다. 그러나 모양이 복잡할수록 효과가 떨어집니다.


보너스 : 마법이 일어나는 곳.

내가 말했듯이 유일한 추가 축은 이동 벡터입니다. 움직임은 시간에 속도를 곱한 것이기 때문에 공간 축이 아니라 시간 축입니다.

즉,이 두 축에서 충돌이 발생한 시간을 도출 할 수 있습니다. 이를 위해 운동 축에서 두 교차점 사이의 교차점을 찾아야합니다. 이 작업을 수행하기 전에 두 범위를 정규화해야하므로 실제로 비교할 수 있습니다.

shapeRange1 = originalShape1.getRangeOnAxis(axes[2]);
shapeRange2 = originalShape2.getRangeOnAxis(axes[3]);
// Project them on a scale from 0-1 so we can compare the time ranges
timeFrame1 = (rangeIntersection[2] - shapeRange1.center())/movementVectorOfShape1.project(axes[2]);
timeFrame2 = (rangeIntersection[3] - shapeRange2.center())/movementVectorOfShape2.project(axes[3]);
timeIntersection = timeFrame1.intersectionWith(timeFrame2);

내가이 질문을했을 때 나는이 방법으로 몇 가지 희귀 한 오탐이있을 것이라는 타협을 이미 받아 들였다. 그러나이 시간 교차점을 검사하여 충돌이 "실제로"발생했는지 테스트 할 수 있고 잘못된 긍정을 정렬 할 수 있습니다.

if(collision)
{
  [... timeIntersection = see above ...]
  if(timeIntersection.length() <= 0)
    collision = false;
  else
    collisionTime = timeIntersection.start; // 0: Start of the frame, 1: End of the frame
}

코드 예제에서 오류가 발견되면 아직 구현하지 않았으므로 테스트 할 수 없었습니다.


1
해결책을 찾은 것을 축하합니다! 그러나 이전에 말했듯이 : 육각형이 교차한다고해서 충돌이 발생하지는 않습니다. 방법을 사용하여 원하는 모든 충돌 시간을 계산할 수 있습니다. 충돌이 없으면 유용하지 않습니다. 둘째, 1 개의 스윕 된 볼륨 만 계산하고 SAT를 사용할 때 계산을 단순화하기 위해 상대 속도를 사용할 수 있습니다. 마지막으로, "교차 시간"트릭이 어떻게 작동하는지에 대한 대략적인 아이디어 shapeRange1 == shapeRange2가 있습니다. 코드와 같이 인덱스가 섞여서 그렇지 않습니까?
jrsala

@madshogo 이제 더 이해해야합니다.
API-Beast

나는 여전히 범위 정규화가 어떻게 작동하는지 이해하지 못하지만 그림이 필요하기 때문입니다. 나는 그것이 당신을 위해 작동하기를 바랍니다.
jrsala

-2

스윕 영역이 모두 닫히면 (가장자리 경계선에 틈이 생기지 않는 한) 다음과 같이 작동합니다 (충돌 테스트를 선 및 점 교정 / 점 세 줄로 줄임).

  1. 가장자리가 닿습니까? (선 충돌) 스윕 된 영역의 모서리 선이 다른 스윕 된 영역의 모서리 선과 교차하는지 확인하십시오. 스윕 된 각 영역에는 6면이 있습니다.

  2. 작은 것이 큰 것입니까? (축 정렬 된 모양 사용 (포인트-정점 및 포인트-트리)) 큰 영역이 축 정렬되도록 작은 영역이 방향이 바뀌도록 회전하고 회전 시키십시오 (모서리 지점이 축 정렬 스윕 영역 내에 있어야합니다. 이것은 16 진수를 트리스와 렉 트로 분해하여 수행됩니다.

어떤 테스트를 먼저 수행 할 것인지는 각각의 가능성에 따라 다릅니다 (가장 일반적으로 발생하는 테스트를 먼저 수행하십시오).

스윕 경계 원 (16 진수 대신 캡슐)을 사용하면 축 정렬시 2 개의 반원과 rect로 나누기가 더 쉬워지기 쉽습니다. .. 솔루션을 그리겠습니다


사각형 중 하나가 실제로 작고 두 가장자리 선 사이의 공간 내에서 이동하면 작동하지 않습니다.
jrsala

@madshogo 방금 응답에 추가했습니다. 완벽한 솔루션이어야합니다.
axon

1
"축 정렬 셰이프 사용 (점-정점 및 포인트-트리)": 축과 삼각형 또는 "포인트-삼각형"(그것이 무엇이든)을 어떻게 정렬합니까? "큰 쪽이 축 정렬되도록": 어느 쪽이 다른 쪽보다 큰지 어떻게 알 수 있습니까? 그들의 지역을 계산합니까? "이것은 당신의 hex를 tris와 rect로 분해하는 것입니다.": 어느 hex? 두 가지가있다. "(나를 위해 설명해 주려면이 응답을 찬성하십시오)": 심각합니까?
jrsala

"삼각형과 축을 어떻게 정렬합니까?" A : 스윕 영역을 만드는 obj의 경로를 정렬합니다. 가장자리를 잡고 삼각을 사용하십시오. "어느 쪽이 다른 쪽보다 큰지 어떻게 알 수 있습니까?" A : 예를 들어, 직사각형의 대각선 반대쪽 두 지점 사이의 거리를 사용하십시오 (16 진수 중간). "어떻게 16 진수?" A : 큰 것입니다.
axon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.