답변:
여기 내 시도가 있습니다. 다음 알고리즘이 있습니다 완벽 하지는 않지만 간단하지만 나는 이것으로 시작하여 상황에서 작동하는지 확인하고 나중에 더 빠르고 정확한 것으로 전환해야한다고 생각합니다.
아이디어는 다음과 같습니다.
베 지어 곡선은 F(t)
일련의 제어점과 다양한 매개 변수를 사용하는 함수로 매개 변수화됩니다 t
. 생성 포인트의 수는 중요하지 않습니다.
선은 두 개의 포인트 parametrised있다 A
및 B
.
SAMPLES = 10
예를 들어 보자
로 시작 t0 = 0
하고t1 = 1
허락하다 dt = (t1 - t0) / SAMPLES
경우 dt < 1e-10
(당신이 알아서 다른 정확도 조건 또는) 알고리즘을 완성하고 대답이다F(t0)
.
SAMPLES + 1
베 지어 곡선 의 점 리스트를 계산합니다 .
L[0] = F(t0)
L[1] = F(t0 + dt)
L[2] = F(t0 + 2 * dt)
L[SAMPLES] = F(t0 + SAMPLES * dt)
L
색인 i
과 가장 가까운 점을 찾으십시오 . 알고 있는 점 / 선 거리 방법 을 사용하십시오. 예를 들어 제곱 거리 ( ||AB^L[i]A||² / ||AB||²
여기서 ^
교차 곱을 나타내며 ||…||
거리)입니다.
만약 i == 0
설정 i = 1
; 인 경우 i == SAMPLES
설정i = SAMPLES - 1
하자 t1 = t0 + (i + 1) * dt
및t0 = t0 + (i - 1) * dt
3 단계로 돌아가십시오.
우리는 두 개의 베 지어 곡선이이 시간에 의해 parametrised F(t)
하고 G(t)
.
SAMPLES = 10
예를 들어 보자
시작 t0 = 0
, t1 = 1
, s0 = 0
및s1 = 1
허락하다 dt = (t1 - t0) / SAMPLES
허락하다 ds = (s1 - s0) / SAMPLES
경우 dt < 1e-10
(당신이 알아서 다른 정확도 조건 또는) 알고리즘을 완성하고 대답이다F(t0)
.
만약 이 루프의 첫 번째 실행은 다음과 같습니다
6.1. SAMPLES + 1
포인트 목록을 계산합니다 F
( 위 참조 ).
6.2. 의 SAMPLES + 1
포인트 목록을 계산합니다 G
.
6.3. 서로 가장 가까운 점 쌍을 찾으십시오.
6.4. 업데이트 t0
, t1
, s0
, s1
위에서 본 것처럼.
ELSE : 양자 택일에 지점의 목록 계산 F
OR 에 지점의 목록 G
에있는 지점 찾기 다음 F
에 가장 가까운 G(s0)
갱신하고 t0
와 t1
, OR 의 점 G
에 가장 가까운 F(t0)
업데이트 s0
하고 s1
.
3 단계로 돌아가십시오.
설계 상 이러한 알고리즘은 항상 로컬 최소값으로 수렴됩니다. 그러나 최상의 솔루션으로 수렴 할 것이라는 보장은 없습니다. 특히 베 지어 곡선 알고리즘은 그다지 좋지 않으며 여러 곳에서 두 곡선이 서로 가까이있는 경우 불행히도 롱 샷으로 솔루션을 놓칠 수 있습니다.
그러나 내가 말했듯이 더 강력한 솔루션에 대해 생각하기 전에 먼저 간단한 솔루션을 실험해야합니다.
1) 모든 것을 하나의 축으로 변환하므로 한 점의 길이를 계산하는 대신 '선', '선'은 Y 축입니다.
그러면 베 지어 곡선이 주어지면 제어점 수에 달려 있다고 말할 것입니다.
세 가지 (시작, '제어'및 종료)가있는 경우 일종의 스캔을 수행합니다 (각각 2 % 씩, 가장 가까운 것 사이에서 '이진'접근법으로).
더 많은 포인트 나는 (번역 된 Y- 축)에 가장 가까운 커플을 시험해 볼 것입니다.
나는 수학자가 정확한 수학 (수학)을 줄 수 있다고 확신하지만 비디오 게임에서 / 솔루션을 찾으려면 실제 솔루션에 몇 가지 답변이 포함될 수 있으므로 약간 괜찮은 솔루션을 사용하는 것이 좋습니다. 처리 능력에 대해서는 이야기조차하지 않습니다.)
주어진 2 차 베 지어 곡선에서 가장 가까운 점을 정확하게 찾는 알고리즘 블로그 페이지의 답변입니다 .
데모 .
베 지어 곡선-직선의 경우 답을 찾는 가장 정확한 방법은 다음을 수행하는 것입니다.