답변:
여기 내 시도가 있습니다. 다음 알고리즘이 있습니다 완벽 하지는 않지만 간단하지만 나는 이것으로 시작하여 상황에서 작동하는지 확인하고 나중에 더 빠르고 정확한 것으로 전환해야한다고 생각합니다.
아이디어는 다음과 같습니다.
베 지어 곡선은 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- 축)에 가장 가까운 커플을 시험해 볼 것입니다.
나는 수학자가 정확한 수학 (수학)을 줄 수 있다고 확신하지만 비디오 게임에서 / 솔루션을 찾으려면 실제 솔루션에 몇 가지 답변이 포함될 수 있으므로 약간 괜찮은 솔루션을 사용하는 것이 좋습니다. 처리 능력에 대해서는 이야기조차하지 않습니다.)
베 지어 곡선-직선의 경우 답을 찾는 가장 정확한 방법은 다음을 수행하는 것입니다.