[면책 조항 : 다음과 같이 작동하지만 실제로 직접 코딩하지는 않았다고 생각합니다.]
예 / 아니오 답변을 생성하는 "사소한"방법을 생각할 수 없었지만 다음은 질문에 대한 실질적인 해결책에 대한 합리적인 접근 방법입니다.
우리의 곡선이 각각 제어점 { A0, A1..An } 및 { B0, .. Bm } 인 A (s) 와 B (t) 라고 가정 해 봅시다 .
우리가 결정하거나 교차하지 않을 2D 베 지어 쌍을 고려할 때 고려해야 할 6 가지 사례가있는 것 같습니다.
"사소하게"서로 교차 하지 않는 것으로 판단 할 수있는 경우 .
그것들이 유한 한 횟수로 교차하고 우리가 그들이 적어도 한 번 이상 교차하는 것을 "쉽게"결정할 수있는 경우 (그러나 우리는 실제로 그 교차점이 발생하는 곳은 신경 쓰지 않습니다)
베 지어 중 하나는 축퇴합니다. 즉 점 (모든 제어점이 동일한 경우에 발생 함). 둘 다 포인트 인 경우를 이미 처리했다고 가정 할 수 있습니다.
하나 이상의 커브가 닫힙니다. A0 == 인생을 더 단순하게 만들기 위해 우리는 그러한 곡선을 세분화하고 다시 시작합니다.
각각은 "부모"베 지어의 부분 집합이고 서로 겹치기 때문에 무한한 수의 교차점이 있습니다.
위의 경우에 대해 확신이 없으며 추가 조사가 필요합니다.
현재로서는 3과 4를 무시하지만 나중에 다시 돌아옵니다.
사례 1
귀하의 질문에 힌트를 주듯이, A 와 B 의 제어점 각각의 경계 상자가 교차하지 않으면 곡선이 교차 할 수 없습니다. 분명히 이것은 빠른 거부 테스트이지만 지나치게 보수적입니다. 아시다시피 베 지어 곡선을 사용하면 제어점의 볼록 껍질이 곡선에 (더 단단한) 경계를 형성합니다. 따라서 분리 축 기술을 사용하여 A 와 B 의 선체가 교차하지 않는지 를 결정할 수 있습니다. (예 : Wikipedia에 표시된대로)
사례 2
사례 1 테스트에 실패하면 교차점이 "사소한"존재인지 확인할 수 있습니다. 이제이 작업을 수행하는 더 좋은 방법이 있지만 다음과 같은 비교적 저렴한 접근 방식이 나에게 발생했습니다.
곡선 A 만 고려하십시오.
우리는 커브가 ㅏ0에서 종료 ㅏ엔볼록 껍질 안에 있습니다. 간단하게하기 위해 선분의 방향을 계산하겠습니다ㅏ0ㅏ엔¯¯¯¯¯¯¯¯¯¯¯¯ 양쪽의 경계를 계산합니다 (예 : 나머지 제어점의 내적을 ㅏ0ㅏ엔¯¯¯¯¯¯¯¯¯¯¯¯).
곡선 B와 동일하게하면 다음과 같은 경우가 발생합니다.
우리가 발견하면 ㅏ0 과 ㅏ엔B 이외의 대향 경계이다 및 그비0 과 비미디엄 A 경계 바깥쪽에있는 경우 베 지어의 연속성으로 인해 교차점이 하나 이상 있어야합니다.
사례 6
위의 경우 중 하나를 즉시 표시 할 수없는 경우 각 베 지어를 두 개의 "반쪽"으로 분할하십시오. ㅏ1,ㅏ2,비1,비2. 이것은 비교적 간단하지만 (독자에게 연습으로 남겨 두 었음) 특히 2 차 베 지어의 경우에는 사소합니다 .
4 가지 조합을 재귀 적으로 비교하십시오. (ㅏ1,비1) , (ㅏ2,비1) . . . (ㅏ2,비2). 모든 통과 사례 1이면 분명히 교차점이 없습니다. 1이 실패하면 축소 된 부분 집합으로 나머지 테스트를 계속하십시오.
사례 3 및 5
이것은 약간 더 지루한 곳입니다.
"case 3"이 "case 1"테스트를 통과하면 실제 교차점을 풀어야 할 것 같습니다. 베 지어의 N 제어점을 A (s)의 베 지어의 N-1 점에 매핑하는 간단한 프로세스가 있다고 가정 할 때, 1 차 미분을 나타냅니다 (제공된주의는 상대적으로 드물고 소위 "퇴화"상황에서 1 차 도함수가 0이되는 경우), 뉴턴 반복 (1 차원)을 사용하여 잠재적 인 솔루션을 찾을 수 있습니다.
또한, A '(s)의 제어점은 미분 값에 구속되어 있기 때문에 일부 경우를 조기에 제거 할 가능성이 있습니다.
사례 5는 상대적으로 가능성이 낮은 것으로 보이므로 몇 번의 재귀 후에 결정적인 증거가없는 경우에만 곡선 B에 대해 A의 각 끝점을 시도하고 그 반대의 경우도 시도 할 수 있습니다. 이것은 비교 차의 증거가 아니라 교차의 증거 만 제공 할 것입니다.