두 베 지어 곡선의 교차점에 대한 신뢰할 수있는 테스트


9

두 개의 평면 베 지어 곡선이 교차하는지 여부를 확실하게 확인하는 방법은 무엇입니까? "신뢰할 수있는"이란 곡선이 교차 할 때만 테스트가 "예"로 응답하고 교차하지 않는 경우에만 "아니오"로 응답한다는 의미입니다. 교차점이 발견 된 매개 변수를 알 필요가 없습니다. 또한 구현에 부동 소수점 숫자를 사용하고 싶습니다.

테스트에 커브의 경계 상자를 사용하는 StackOverflow에서 몇 가지 답변을 찾았습니다. 이는 커브가 교차하지 않더라도 교차로를보고 할 수 있기 때문에 내가 추구하는 것이 아닙니다.

지금까지 내가 찾은 가장 가까운 것은 Sederberg와 Meyers 의 " 경계 웨지 "이지만 가장 "한"것은 최대 1 개와 2 개 이상의 교차로를 구별하는 반면, 최대 0이 있는지 알고 싶습니다. 그리고 하나 이상의 교차로.


그것이 존재하는지 확실하지 않다면, wetehr를 결정하거나 0-1 또는 2 이상의 가능성을 결정하는 것은 사소한 것이지만 공식은 실제로 확인하지 않고 0 또는 1을 확인하는 것이 실제로 쉽지 않습니다.
joojaa

런타임 요구 사항은 무엇입니까? 매우 정확한 결과를 얻을 수 있어야하는 솔루션은 두 개의 곡선을 많은 짧은 직선 세그먼트로 근사한 다음 쌍으로 교차시키는 것입니다. 그러나 시간과 메모리가 많이 소모됩니다.
Dragonseel

@Dragonseel 글쎄, 나는 어떤 해결책이라도 기뻐할 것이지만, 당신이 O (1)을 물었으므로 좋을 것입니다. 그러나 선분으로 곡선을 근사하면 경계 상자 겹침 테스트와 동일한 문제가 발생합니다.
Ecir Hana

재미있는 문제. 나는 쉬운 대답이 없다고 생각하지만 잘못하고 싶습니다. Sederberg와 Meyers 논문에 대한 링크가 있습니까?
Daniel M Gessel

@DanielMGessel 예, 위의 편집을 참조하십시오.
Ecir Hana

답변:


6

문제를 공식화하는 다른 방법은 곡선 매개 변수의 함수로 두 곡선의 점 사이의 거리를 제공하는 함수를 정의하는 것입니다. 그런 다음이 함수의 전체 최소값을 찾으십시오. 곡선이 교차하면 최소값은 0이됩니다. 그렇지 않으면 최소값은 양의 거리가됩니다.

명시 적으로 말하자면, 한 쌍의 2D 곡선이 c1,c2:[0,1]R2거리 제곱을 다음과 같이 정의하십시오.

f(u,v):[0,1]2R0|c2(v)c1(u)|2

3 차 곡선의 경우 함수 f두 변수에서 6도 다항식입니다. 그런 다음 단면 법 또는 켤레 경사 하강 과 같은 수치 최적화 기법을 적용 할 수 있습니다 . 불행히도이 함수는 몇 개의 로컬 최소값 (볼록하지 않음)을 가질 수 있으므로 최적화가 쉽지 않습니다. 다항식에 사용할 수있는 더 전문화 된 최적화 방법이있을 수 있지만 이것은 전문 분야가 아닙니다.


3 차 베 지어에 대해 이야기 할 때 왜 3 도가 아닌 6도 다항식입니까? 그리고 당신이 연결 한 두 가지 방법은[0,1]2전체와 반대로 아르 자형2?
Ecir Hana

1
@EcirHana 그것은 제곱 거리이기 때문에 6 도입니다. (제곱근을 제곱 할 수는 있지만 더 이상 다항식이 아니며 0에서 부드럽 지 않습니다.)[0,1]스플라인이있는 공간이 아니라 매개 변수 공간입니다. 즉, 끝 점이있는 스플라인입니다. 어쨌든, 방법은 잘 작동합니다아르 자형2그러나 그들은 초기 추측에서 "내리막으로 여행"하고 지역 최소값을 찾습니다; 전체 매개 변수 영역을 검사하고 전역 최소값을 찾으려면 더 많은 것이 필요합니다 . 매개 변수 공간을 제한하면 도움이 될 것입니다.
Nathan Reed

1
나단-좋은 공식! 녹슬었지만, 각 베 지어 곡선을 최대 5 개의 세그먼트로 나눌 수 있다고 생각합니다.엑스 또는 와이 커브의 방향을 바꿉니다. 엑스의 함수로서 나는 최대 2 회 (미분의 뿌리) 방향으로 커브를 3 개의 세그먼트로 나누고, 그 중 2 개는 와이. 이제 직선 선분이 아니라 "너무 많이 구부러지지 않는"선분이 있습니다. 세그먼트 쌍으로 선택한 25 포인트에서 검색을 시작하면 항상 전역 최소값을 찾을 수는 있지만 그것을 증명하는 방법을 알 수는 없습니다.
Daniel M Gessel

@Nathan : 나는 그것을 생각했지만 질감 압축 형식에서 최소를 찾기 위해 코드를 작성하는 데 많은 시간을 보냈지 만 모두 약간 무시 무시한 것처럼 보였습니다.
Simon F

5

[면책 조항 : 다음과 같이 작동하지만 실제로 직접 코딩하지는 않았다고 생각합니다.]

예 / 아니오 답변을 생성하는 "사소한"방법을 생각할 수 없었지만 다음은 질문에 대한 실질적인 해결책에 대한 합리적인 접근 방법입니다.

우리의 곡선이 각각 제어점 { A0, A1..An } 및 { B0, .. Bm } 인 A (s)B (t) 라고 가정 해 봅시다 .

우리가 결정하거나 교차하지 않을 2D 베 지어 쌍을 고려할 때 고려해야 할 6 가지 사례가있는 것 같습니다.

  1. "사소하게"서로 교차 하지 않는 것으로 판단 할 수있는 경우 .

  2. 그것들이 유한 한 횟수로 교차하고 우리가 그들이 적어도 한 번 이상 교차하는 것을 "쉽게"결정할 수있는 경우 (그러나 우리는 실제로 그 교차점이 발생하는 곳은 신경 쓰지 않습니다)

  3. 베 지어 중 하나는 축퇴합니다. 즉 점 (모든 제어점이 동일한 경우에 발생 함). 둘 다 포인트 인 경우를 이미 처리했다고 가정 할 수 있습니다.

  4. 하나 이상의 커브가 닫힙니다. A0 == 인생을 더 단순하게 만들기 위해 우리는 그러한 곡선을 세분화하고 다시 시작합니다.

  5. 각각은 "부모"베 지어의 부분 집합이고 서로 겹치기 때문에 무한한 수의 교차점이 있습니다.

  6. 위의 경우에 대해 확신이 없으며 추가 조사가 필요합니다.

현재로서는 3과 4를 무시하지만 나중에 다시 돌아옵니다.

사례 1

귀하의 질문에 힌트를 주듯이, AB 의 제어점 각각의 경계 상자가 교차하지 않으면 곡선이 교차 할 수 없습니다. 분명히 이것은 빠른 거부 테스트이지만 지나치게 보수적입니다. 아시다시피 베 지어 곡선을 사용하면 제어점의 볼록 껍질이 곡선에 (더 단단한) 경계를 형성합니다. 따라서 분리 축 기술을 사용하여 AB 의 선체가 교차하지 않는지 를 결정할 수 있습니다. (예 : Wikipedia에 표시된대로)

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

사례 2

사례 1 테스트에 실패하면 교차점이 "사소한"존재인지 확인할 수 있습니다. 이제이 작업을 수행하는 더 좋은 방법이 있지만 다음과 같은 비교적 저렴한 접근 방식이 나에게 발생했습니다.

곡선 A 만 고려하십시오.

베 지어의 "지방 라인"경계

우리는 커브가 0에서 종료 볼록 껍질 안에 있습니다. 간단하게하기 위해 선분의 방향을 계산하겠습니다0¯ 양쪽의 경계를 계산합니다 (예 : 나머지 제어점의 내적을 0¯).

곡선 B와 동일하게하면 다음과 같은 경우가 발생합니다. 여기에 이미지 설명을 입력하십시오

우리가 발견하면 0B 이외의 대향 경계이다 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의 각 끝점을 시도하고 그 반대의 경우도 시도 할 수 있습니다. 이것은 비교 차의 증거가 아니라 교차의 증거 만 제공 할 것입니다.


예, 그러나 Bm 및 / 또는 B0이 모두 A의 최대 및 최소 한계의 볼륨 내에 있지만 피어싱하지 않는 경우에 대해 개인적으로 더 관심이 있습니다. 분할하지 않으면 최악의 시나리오에서 교차점을 계산해야합니다 포인트. 더 좋은 방법은 굵은 선 근사라고도하는 최소 경계 상자를 사용하는 것입니다.
joojaa

모든 이진 세분화에서 곡선과 끝점을 연결하는 세그먼트 사이의 차이는 합리적인 요소로 내려갑니다 (그리고 머리 꼭대기에서 2 차의 경우 4 배 였을 것입니다). "얇은"리본으로 상당히 빠르게 수렴합니다.
Simon F

예, 그러나 최악의 시나리오는 다른 베 지어가 다른 베 지어를 시작한다는 것입니다.
joojaa

예를 들어 An == B0 입니다. 교차점으로 정의합니까?
Simon F

더 이상 B0은 곡선 어딘가에 있습니다. 또는 심지어 최소한의 교차로
joojaa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.