인접한 삼각형을 만들기위한 알고리즘


14

한 번 클릭하여 장면에 노드를 배치 할 수있는 시스템이 있습니다. 3 개의 노드를 배치하면 삼각형이 형성됩니다. 향후 노드를 배치하면 해당 노드를 가장 가까운 기존 노드 2 개에 연결하여 새 삼각형을 만듭니다.

이것은 대부분 잘 작동하지만 가장 예각 인 삼각형 근처에서 사용할 때는 결함이 있습니다. 가장 가까운 2 개의 노드 중 하나가 사용해야하는 노드가 아니기 때문입니다.

예를 들어 아래 이미지를 참조하십시오. 자홍색 삼각형이 첫 번째로 배치됩니다. 그런 다음 X로 표시된 위치를 클릭하면 파란색 오버레이가있는 새로운 삼각형이 나타납니다. 내가 원하는 것은 녹색 오버레이가있는 새로운 삼각형입니다. (예 :이 예에서는 자홍색과 대칭입니다. 설명 : 녹색과 자홍색 삼각형이 겹치지 않습니다.

실제적이고 바람직한 행동의 예

삼각형이 이와 같이 겹쳐지지 않도록 새 삼각형을 만들 때 사용할 기존 정점 2 개를 어떻게 확인할 수 있습니까?

편집 : 가장 가까운 가장자리를 검색하면 더 나은 결과를 얻을 수 있지만 완벽한 것은 아닙니다. 이 상황을 고려하십시오.

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

'가장 가까운 가장자리'테스트는 모호하며 AB 또는 AC를 반환 할 수 있습니다 (둘 다 X에 대한 가장 가까운 점은 A에 있음). 원하는 결과는 AC이며, 가장자리가 겹치지 않고 ACX 삼각형을 형성합니다. 이 결과를 어떻게 보장 할 수 있습니까? (가장 가까운 에지 테스트가 부동 소수점 정밀도 문제를 고려할 때 2가 정확히 같은 거리에 있다는 것을 걱정할 수 있기 때문에 가능한 경우 개별 에지 오버랩 테스트를 타이 브레이커로 수행하지 않아도됩니다.)


마지막 5 개의 정점을보고 새로 배치 된 정점에 가장 가까운 2 개의 정점을 선택하는 것만으로는 충분하지 않습니까? 삼각형 스트립 ( codercorner.com/Strips.htm ) 알고리즘을 알려 주지만 종종 마지막 두 개 또는 마지막 세 개를 건너 뛰는 것을 사용합니다.
Roy T.

1
녹색 삼각형이 자홍색과 겹치나요? 이것의 목표는 무엇입니까? 사용자는 삼각형이 생성되는 위치와 방법을 제어해야합니까, 아니면 점 구름의 삼각 분할이 허용됩니까?
bummzack

이것을 그래프 컨텍스트에 넣으려면 본질적으로 가장자리가 겹치지 않고 노드를 연결하고 싶습니까? (자홍색 / 녹색 삼각형이 모서리를 공유한다고 가정)
MichaelHouse

Roy T : 아니요-예제에서 알 수 있듯이 가장 가까운 2를 선택하는 것은 잘못되었습니다. 불분명 한 것이 있습니까? Bummzack-녹색은 자홍색과 겹치지 않습니다. 목표는 이러한 삼각형의 메쉬 또는 그래프를 만드는 것입니다. 사용자는 통제가 필요합니다. 바이트 56-예, 모서리가 교차하지 않아야합니다.
Kylotan

2
사용자는 실제로 개별 삼각형을 볼 수 있습니까? 아니면 하나의 연속적인 표면이 될까요?
bummzack

답변:


11

노드까지의 최소 거리를 찾는 대신 가장자리까지의 최소 거리를 찾으십시오 (즉, 노드에 의해 정의 된 선분).

그런 다음 가장 가까운 점이 정점 인 경우 (부동 소수점 epsilon ** 테스트를 사용해야 함) 새 점에서 정점까지의 선과 해당 정점에 연결된 각 모서리 사이의 각도를 비교합니다. 최소 절대 각도를 가진 것을 선택하십시오 :

MinAngle(newPoint, vertex, edge1, edge2)
{
   newEdgeUnit = norm(newPoint - vertex); // don't actually need to normalize this
   edge1Unit = norm(edge1 - vertex);      // you probably have these from your dist to line tests
   edge2Unit = norm(edge2 - vertex);

   edge1Dot = dot(edge1Unit, newEdgeUnit);
   edge2Dot = dot(edge2Unit, newEdgeUnit);

   // you can simply compare dot products to find the minimum absolute angle
   if (edge1Dot > edge2Dot) return edge1;     // set up this way so you can generalize to an array
   return edge2;
}

** 엡실론 테스트를 방해 할 수있는 축퇴 삼각형 추가를 피하기 위해 점을 추가 할 수없는 각 정점 주위에 영역을 배치 할 수 있습니다 (위에서 사용 된 엡실론의 여러 배수 내에서 점을 허용하지 않는 것과 같은).


3
+1-이것은 IMHO가 다른 것보다 훨씬 간단한 답변이며 올바른 결과를 제공 할 가능성이 높습니다. 스마트 스킴으로 거리-세그먼트도 쉽게 계산할 수 있습니다.
Steven Stadnicki

동의, 이것은 더 깨끗한 방법입니다. 아마 내가 더 그것에 대해 생각한다면 내가 도착했을 것 : /
MichaelHouse

아 너무 가까이! 그러나 Byte56의 대답과 Jimmy의 다이어그램에서와 같이 때로는 2 개의 등거리 가장자리가 있으며 그중 하나가 제약 조건을 위반합니다. 내 질문을 업데이트했습니다.
Kylotan

@Kylotan이 경우 아마도 어떤 것이 겹치는지를 확인하고 다른 옵션을 취하는 것만 큼? 선택한 모서리를 공유하는 삼각형을 찾고 새 삼각형이 기존 모서리와 같은 모서리에 있는지 확인하십시오.
Kevin Reid

@Kylotan 삼각형의 권선이 항상 같은지 확인하십니까? 그렇다면 새 정점에서 먼 쪽을 가리키는 법선이없는 모서리를 배제 할 수 있습니다 (점 제품 사용).
bummzack

6

첫 번째 삼각형을 배치 한 후 새 정점을 배치 할 때 항상 두 개의 새 모서리가 생성됩니다. 새 삼각형의 세 번째 모서리는 항상 이전 삼각형과 공유 된 모서리입니다. 공유 에지를 결정하는 방법을 찾을 수 있다면 어떤 정점에 연결할지 알 수 있지만 어려운 부분입니다. 새 정점에서 마지막으로 생성 된 각 3 개의 가장자리 (또는 가장 가까운 3 개의 가장자리)의 중심까지 선을 그려서이 작업을 수행 할 수있는 한 가지 방법이 있습니다.

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

정점에서 가장자리 중심까지의 선 이 다른 두 가장자리 중 하나를 교차 하지 않으면 공유 가장자리가있는 것입니다. 공유 모서리는 새로운 정점을 연결할 두 정점을 알려줍니다.

지미는 새로운 삼각형이 어디로 갈지 모호한 점을 제시했습니다.

모호한 삼각형

그러면 두 개의 유효한 삼각형 중에서 선택할 수 있습니다. 아마도 중심점이 가장 가까운 타이 브레이킹 일 것입니다.

업데이트를 고려하면 더 복잡하지만 두 개의 유효한 삼각형이있을 때만 솔루션이 연결됩니다. 이 방법을 사용하면 두 번째 예제 이미지로 원하는 결과를 얻을 수 있습니다.

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


두 선이 가장자리와 교차하지 않는 상황이있을 수 있습니다 (X가 가장자리보다 정점에 더 가까운 경우)
Jimmy

@Jimmy 당신은 그런 상황의 이미지를 그릴 수 있습니까?
MichaelHouse


아 네, 그러면 삼각형을 어디에 둘 것인지 선택할 수 있습니다! 어느 쪽이든 효과가 있습니다. 아마도 당신은 중심에서 가장 짧은 거리를 가진 사람과 휴식을 취할 수 있습니다.
MichaelHouse

@Kylotan이 솔루션이 작동하지 않습니까? Jeff의 의견에서 Jimmy의 이미지에는 두 가지 경우가 있으며 하나는 제약 조건을 위반하지만 실제로는 그렇지 않습니다. Jimmy의 이미지에서 두 경우 모두 내 방법을 사용하여 유효한 삼각형을 생성합니다.
MichaelHouse

1

자홍색 삼각형 ABC가 있으면 새로운 정점 X를 포함합니다. D에서 시작하여 삼각형 ABC의 가장자리 사이에 교차하지 않는 두 개의 선이 있음이 분명합니다.

이 두 줄은 AX & BX, BX & CX 또는 AX & CX가 될 수 있습니다. 그런 다음 문제를 "두 줄이 교차하는"고전적인 문제로 취급 할 수 있습니까? 그런 다음이 선 쌍 중 어느 것이 ABC 삼각형 가장자리와 교차하지 않는지 확인할 수 있습니다 (예 :이 질문의 방법 중 하나) . 따라서 새 삼각형의 두 가지 새로운 가장자리가 생깁니다.


이것은 좋아 보이지만, 당신이 말한 방식은 기존 삼각형이 하나만 있다고 가정하는 것 같습니다. 많은 사람들에게 어떻게 일반화됩니까?
Kylotan

흠 ... 당신의 X와 삼각형 ABC가 고정되어 있다면, 하나만 있다고 생각하지 않습니까?
Dan

시스템은 두 번째 노드 다음에 모든 노드에 대해 새 삼각형을 만듭니다.
Kylotan

죄송합니다. 귀하의 질문을 오해했습니다. 이것을 어떻게 많은 삼각형으로 확장 할 수 있는지 봅시다.
Dan

글쎄, X에 연결했을 때 가장자리를 교차하지 않는 X에 가장 가까운 두 정점을 검색 할 수 있다고 생각하십니까?
bummzack

1

모호하지 않은 영역 중 하나 (아래 1, 2, 3)에 있는지 알아내는 것은 매우 쉽습니다. 삼각형의 각 모서리를 2D 평면으로 취급하고 새 점이있는 평면의 어느 쪽을 테스트하십시오. 두 개 안에 있지만 한 개 밖에 있다면 그 하나는 삼각형의 가장자리에 해당하여 새 삼각형에 두 개의 꼭짓점을 제공합니다.

삼각형의 보로 노이 지역

1과 2의 내부에 있다면, 새로운 점에 가장 가까운 삼각형 부분이 모호한 경우가 모호합니다. 이 경우 반대쪽 가장자리의 중간 점 (내부에있는 것)과 가장 가까운 정점 (외부에있는 두 평면이 공유하는 것)에서 2D 평면을 형성 할 수 있습니다. 새 점이있는이 평면의 측면에 따라 모서리를 선택할 수 있습니다.

2D의 평면 테스트는 3D와 같은 방식으로 작동합니다. 평면의 어느 곳에서든 평면의 법선으로 점에 벡터를 점으로 표시합니다 (2D에서는 선의 수직).

(우연히이 이미지에서 마젠타로 구분 된 영역을 보로 노이 영역이라고합니다.이 영역은 삼각형의 특정 기능 (가장자리 또는 꼭지점)에 가장 가까운 점을 포함하는 공간 영역입니다. 편집 : 여기에서의 용어는 실제로는 아닙니다. 정확히 맞습니다. 이것들은 정확히 보로 노이 지역이 아닙니다.)


장면에서 여러 삼각형을 일반화하는 방법은 특히 명확하지 않습니다. 특히 가장 가까운 피처가 하나 이상의 삼각형이 공유 할 수있는 꼭짓점 인 경우에는 더욱 그렇습니다.
Kylotan

@Kylotan 모든 삼각형에 대해 알고리즘을 실행하고 가장 가까운 전체 피처를 선택하십시오. 무슨 일이 있어도 끊임없는 논리가 필요합니다. 당신이 공유 정점되는 가까운 기능을 끝낼 경우에, 당신은 해야한다 어쩌면 당신이를 선택할 수 있습니다, 단 하나의 삼각형 가장자리 영역 (# 1, # 2, # 3)에있을?
John Calsbeek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.