2014-06-18 11 views
0

나가는 탄젠트에 의해 점 둘레로 3 차 베 지어 스플라인을 정렬해야합니다. 나의 첫 번째 시도는 나가는 탄젠트 각도를 결정하고 그것을 기준으로 정렬하는 것이 었습니다. 네 점 p0, p1, p2, p3와 스플라인의 경우, 발신 접선 각도는 다음과 같습니다나가는 탄젠트에 의해 점 둘레로 3 차 베 지어 스플라인 정렬하기

p0 != p1 ? angle(p0, p1) : p0 != p2 ? angle(p0, p2) : angle(p0, p3) 

이 실제로 차 또는 라인입니다 입방을 퇴화 처리합니다. 그러나 점에는 동일한 접선 각도를 가진 두 개의 나가는 스플라인이있을 수 있지만 나중에 정렬 순서에 영향을주는 스플라인 아래쪽에 다른 제어점 또는 끝점 위치가있을 수 있습니다.

degenerate case를 처리하는 나가는 각도로 두 개의 임의의 베 지어 스플라인을 정렬하는 좋은 닫힌 형식의 알고리즘이 있습니까? 또한 탄젠트가 같은 경우를 명확하게하기 위해 나머지 스플라인을 사용합니까? 내가 명확하게 할 때까지 t 값을 시도해 볼 수는 있지만 닫힌 폼 알고리즘이있는 것처럼 보입니다.

+0

그래서 두 곡선의 시작 접선이 같지만 나중에 나뉘어지면 정렬 목적으로 두 곡선의 동일성을 원했습니까? 아니면 여전히 특정 순서로 정렬 되길 원했습니까? – tfinniga

+0

특정 순서 (예 : 시계 방향)로 정렬해야합니다. 평면의 그래프에서면을 횡단하려고합니다. 가장자리가 3 차 베 지어 스플라인 인 경우입니다. – constexpr

답변

0

알고있는 한,이 특정 문제에 대한 폐쇄 형 솔루션은 없습니다. 한 점에서 나가는 탄젠트로 커브 세트를 정렬하려는 경우를 고려하십시오. 그러나 그 점에서 접선이 같으면 커브는 이미 정렬되어 있습니다! 실제로 원하는 것은 출발점에서 곡선을 따라 이동할 때 접선이 갈라 지는지 확인하는 것입니다.

그럼 그렇게하겠습니다. t = 0에서 작은 증분으로 접선을 비교하십시오 (t는 매개 변수 곡선의 곡선 시간 매개 변수입니다).

여기에 자바 스크립트로 small demo이 있습니다.

compareTan 함수는 탄젠트 각도를 작은 증분 (t = 1e-5)으로 비교합니다. 의존하는 것은 주어진 t 매개 변수에서 접선을 반환하는 메서드입니다. 이차 케이스를 구현하는 것은 그리 어렵지 않습니다. 라인의 경우 직접 비교할 수 있습니다.