볼록 다각형을 더하고 빼려면 어떻게해야합니까?


12

두 개의 2D 볼록 다각형이 서로 겹칩니다 . 내가하는 알고리즘을 찾고 빼기추가 를. 결과는 단일 오목 다각형이거나 오목한 결과를 형성하는 가장 큰 볼록 다각형 (예 : 삼각형)이어야합니다.

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

( 왼쪽 : 초기 겹치는 다각형. 중간 : 추가 후 생성 된 오목 다각형. 오른쪽 : 오목한 결과를 형성하는 볼록 다각형 세트 여기서 성능상의 이유로 삼각형보다 큰 볼록 다각형을 얻는 것이 좋습니다. 두 개의 겹치는 다각형은 왼쪽과 같은 그림으로 이어지지 만 겹치는 영역은 결과 다각형의 일부가 아닙니다.)

어떻게해야합니까?


여기서 2D에 대해 이야기하고 있습니까? 3D 결합 다각형은 실제로 의미가 없기 때문입니다.
concept3d

예, sry, 나는 2D에 대해 이야기하고 있습니다! 왜 그것이 2D보다 3D에서 덜 의미가 없는지는 알지 못합니다.
Sebastian Barth

2
3D로 2 개의 다각형을 추가 할 때, 평면이 평평하다면, 같은 평면에 있지 않는 한, 부피 (고체)가 있으면 다른 이야기입니다.
concept3d

알았어 그래픽이 아니라 충돌 객체를 생각했습니다. 명확하게 해 주셔서 감사합니다.
Sebastian Barth

또한 교차하는 모든 점을 찾아 정점을 세트에 추가하십시오. 겹침을 방지하기 위해 세트가 중요합니다. 그런 다음 다른 두 도형의 다른 모든 정점을 세트에 추가하기 만하면됩니다. 이 세트에는 추가 모양의 모든 정점이 포함됩니다.
Vaughan Hilts

답변:


9

TL; DR BSP 트리를 사용하여 부울 연산을 구현해야합니다.

음, 여기서 우리는 입체 솔리드 지오메트리 에 대해 이야기하고있는 것 같습니다 . 나는 상업 수준에서 CSG를 ​​구현하여 그것에 대해 한두 가지를 알고 있습니다.

CSG에 대한 고전 논문은 BSP 트리 생성 다면체 세트 연산 병합 이라고 합니다. 솔직히 말해서 여기에 설명하기에는 너무 많지만 간단히 말해서 알고리즘은 이진 공간 분할과 동일한 평면에있는 다각형을 처리하여 기본적으로 구성합니다. 각 다각형 메쉬의 BSP 트리 두 번째 단계는 이러한 BSP 트리를 병합하는 것입니다. 한 나무를 가져다가 다른 나무에 삽입하면됩니다. 그런 다음 알고리즘은 노드를 나누고 빼기 위해 각 리프 노드를 처리하는 방법을 설명하고 최종 모양에 필요하지 않은 노드는 제거되고 다른 노드에는 적절한 부모가 제공됩니다.

하지만 기다려! 그 종이는 기본적으로 다각형 메쉬와 3D 평면에 대해 말하고 있습니다.

알고리즘은 모든 차원으로 일반화 될 수 있으므로 2D 경우 평면 대신 이진 파티션으로 선분을 쉽게 사용할 수 있습니다. 따라서 각 다각형은 병합되는 것보다 BSP 트리로 변환됩니다. 마지막으로 결과 트리를 탐색하여 최종 다각형을 생성합니다.

이 알고리즘과 CSG는 일반적으로 렌더링 및 메쉬면을 직접 처리하지 않으며 실제로 렌더링 준비가되어 있지 않으므로 최종 BSP 트리의면을 추출해야합니다. 또한 광선 추적이 CSG 결과를 렌더링하기위한 더 쉬운 접근 방법이라는 것을 알았 습니다.면 을 추출하고 실제로 분할 하는 대신 광선을 트리를 통과하기 만하면됩니다 (이진 파티션 만 처리 함을 기억하십시오).

수치 적 견고성에 관해. 기하 계산에는 두 가지 유형이 있습니다.

  • 구성을 기반으로하는 구성 요소는 이전 작업의 결과를 기반으로 모양 을 구성 합니다. 예를 들어 y = sqrt(x)다음 사용하는 y새로운 작동. 이것을 건축이라고합니다. 문제는 수치 오류가 빠르게 누적된다는 것입니다.
  • 대신, 술어를 대신 사용 하는 조작이 있습니다 . 기본적으로 구성을 사용하는 대신 조건이 참 / 거짓인지를 묻고 다른 조작에서 동일한 값을 사용하기 만하면됩니다. 고전적인 테스트에는 원형 및 오리엔테이션 테스트가 포함됩니다. 특히 단 정밀도 또는 배정 밀도를 사용하지만 일반적으로 훨씬 더 나은 결과를 얻을 경우 수치 오류가 발생할 수 있습니다. 속도와 정확도가 다른 다른 솔루션도 있습니다. 다음은 평면 기반 형상을 사용하여 정확한 결과를 제공하여 구성을 피하는 최근 논문 중 하나입니다. 나는 또한 논문에서 인용 할 것이다 :

다각형 메시의 평면 기반 표현의 개념은 Sugihara와 Iri [SI89]에 의해 처음 설명되었습니다. 이러한 종류의 표현은 불리언 표현식의 평가와 같이 메시로 표현되는 솔리드의 토폴로지를 변경하는 작업과 관련하여 중요한 이점을 제공합니다. 결과 다면체를 얻기 위해 새로운 기본 지오메트리 정보를 구성 할 필요가 없습니다.

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

마지막으로 BSP CSG 구현을 시작하려면 BSP Faqs에서 시작하는 것이 좋습니다 .


볼록 다각형 또는 다면체의 BSP가 목록이라는 점을 고려하면 시원하지만 반 직관적입니다. 좋은 종이.
3Dave

@DavidLively 그렇습니다. 그러나면이 아닌 루트 평면을 선택하여 균형 잡힌 나무로 만들 수 있습니다. 실제로 이것은 그들이 말하지 않은 도전의 일부입니다.
concept3d

아, 말이 되네요. 그렇다면 하이브리드 BSP의 일종입니다.
3Dave

@DavidLively 또한 BSP는 렌더링하기 쉽지 않지만 OP 질문은 간단한 경우이지만, 수백만 개의 다각형으로 구성된 복잡한 경우에는 트리 구성을 마치면 완료하지 못합니다.
concept3d

@ concept3d 5 살짜리 대답이므로 이것이 너무 성 가시지 않기를 바랍니다.하지만 실제로 이해하지 못하는 두 가지가 있습니다. 평면 / 선이 사소한 평면 / 선에 해당하도록 전체를 회전시키는 것이 더 쉽지 않습니까? 그런 다음 회전 점의 좌표를 고려하십시오. BSP 트리 대신 Sutherland–Hodgman 알고리즘을 사용하는 것은 어떻습니까? 이 방법과 매우 비슷합니다.
John P

1

당신의 모범으로 가십시오 :

다각형 A에서 시작 정점을 선택한 다음 시계 방향 (또는 시계 반대 방향)의 교차 모서리 검사를 시작합니다. 교차점이없는 경우 결과 다각형에 이전 정점을 추가합니다. 교차점이 있으면 결과 다각형과 교차 한 점을 추가 한 다음 동일한 권선 순서로 다각형 B를 반복하여 시작합니다. 교차점이 발생하면 다각형 A로 다시 바꾸어 같은 작업을 수행하십시오.

새 다각형의 정점을 모두 모으면 삼각 분할 알고리즘을 수행하십시오. 귀 클리핑 방법은 쉽게 구현할 수 있지만, 거기 빠른 옵션이 있습니다.

중요 : 시작한 정점이 다른 다각형 안에 있지 않은지 확인하십시오 ( 다각형 테스트 에서이 기사 를 확인 하십시오 ).

교차점을 확인하기 위해 각 모서리를 반복하는 것은 O (n ^ 2) 알고리즘입니다. 다른 다각형 안에있는 꼭짓점을 먼저 찾아서 속도를 높일 수 있습니다. 꼭짓점에 연결된 가장자리가 교차하는 것이기 때문입니다.


0

오목한 다각형 을 원하면 두 입력 다각형 사이에서 가장 가까운 모서리를 선택하고 두 개의 새 모서리를 추가하십시오.

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

볼록 함 이 약간 더 복잡해집니다.

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

한 가지 접근 방식은 두 번째 다각형에서 첫 번째 다각형으로 한 번에 하나씩 정점을 추가하여 첫 번째 다각형을 모든 것을 포함하는 컨테이너로 진화 시킨다는 점에서 반복적입니다.

원래:

  • 두 번째 다각형의 정점을 반복합니다.
  • 각 정점 V에 대해 첫 번째 다각형의 모서리를 반복합니다.
  • 모든 정점을 향한 모서리의 "범위"를 찾습니다.
  • 해당 범위를 정의하는 외부 정점 쌍을 취하고이를 연결하는 범위의 모든 모서리를 제거합니다.
  • 외부 꼭지점에서 새 꼭지점 (두 번째 다각형에서)까지 두 개의 새 세그먼트를 그려 새 모서리가 올바른 방향을 향하도록합니다.
  • 두 번째 다각형에서 다음 정점으로 진행

다음은 첫 번째 정점에 대한 프로세스를 보여주는 다이어그램입니다.

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

더 빠른 방법은 각 다각형에서 다른 다각형을 향하지 않는 모서리 목록을 찾고 다른 다각형을 모두 제거하고 나머지 선 스트립의 끝점을 서로 연결하는 것입니다.

아마도 다른 누군가가 약간의 빼기 조언으로 차임 할 수 있습니다.


이것은 문제의 절반 만 해결하는 것 같습니다 (추가). 알고리즘이 어떻게 작동하는지 또는 다각형이 겹치는 경우 최적화 될 수있는 방법을 지적하는 것이 좋습니다.

이 알고리즘은 대상 다각형의 "내부"정점을 암시 적으로 무시하며 두 번째 다각형의 가장자리가 첫 번째 다각형과 교차하는 문제를 보완합니다.
3Dave

그것은 병합 단계와 거의 같습니다 ( 병합 선체 알고리즘 의 포인트 4 .. 제 경우에는 다각형을 결합한 후 더 많은 영역을 둘러싸는 것이 올바른 해결책이 아닙니다. 올바른 해결책은 두 다각형을 원래대로 유지하는 것입니다. 겹치거나 만지지 마십시오
Sebastian Barth

@luftgewehrindianer Ah-네, 큰 차이가 있습니다. 아마도 나는 그 질문을 오해했을 것입니다. 결과가 볼록인지 오목인지에 대해 걱정하지 않고 다각형을 함께 추가하려고하십니까? 아니면 교차점을 기준으로 볼록 세트를 생성합니까? (순간 빼기 무시)
3Dave

@DavidLively 테두리가없는 동일한 색상의 두 개의 볼록 다각형을 상상해보십시오. 겹치면 하나의 새로운 볼록 또는 오목 다각형처럼 보입니다. 그는 결합 된 형태의 삼각 분할을 찾습니다. 두 다각형 사이에 영역을 추가하지 마십시오.
danijar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.