두 커브에서 가장 가까운 점을 어떻게 계산합니까?


15

선의 점과 2 차 베 지어 곡선이 주어지면 가장 가까운 점을 어떻게 계산합니까? .... 마찬가지로, 2 개의 곡선 점이 주어지면 가장 가까운 점을 어떻게 얻습니까?

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


2
나는 이 질문 이 좋은 출발 이라고 믿는다 .
sam hocevar

답변:


3

여기 내 시도가 있습니다. 다음 알고리즘이 있습니다 완벽 하지는 않지만 간단하지만 나는 이것으로 시작하여 상황에서 작동하는지 확인하고 나중에 더 빠르고 정확한 것으로 전환해야한다고 생각합니다.

아이디어는 다음과 같습니다.

  • 베 지어 곡선을 샘플링하고 해당 샘플에서 가장 가까운 점을 찾습니다
  • 찾은 지점 주변의 이웃을 샘플링하고 가장 가까운 새로운 지점을 찾습니다
  • 점이 더 이상 변하지 않을 때까지 계속

베 지어 곡선에서 선까지의 거리에 대한 알고리즘

베 지어 곡선은 F(t)일련의 제어점과 다양한 매개 변수를 사용하는 함수로 매개 변수화됩니다 t. 생성 포인트의 수는 중요하지 않습니다.

선은 두 개의 포인트 parametrised있다 AB.

  1. SAMPLES = 10예를 들어 보자

  2. 로 시작 t0 = 0하고t1 = 1

  3. 허락하다 dt = (t1 - t0) / SAMPLES

  4. 경우 dt < 1e-10(당신이 알아서 다른 정확도 조건 또는) 알고리즘을 완성하고 대답이다F(t0) .

  5. SAMPLES + 1베 지어 곡선 의 점 리스트를 계산합니다 .

    • L[0] = F(t0)
    • L[1] = F(t0 + dt)
    • L[2] = F(t0 + 2 * dt)
    • L[SAMPLES] = F(t0 + SAMPLES * dt)
  6. L색인 i과 가장 가까운 점을 찾으십시오 . 알고 있는 점 / 선 거리 방법 을 사용하십시오. 예를 들어 제곱 거리 ( ||AB^L[i]A||² / ||AB||²여기서 ^교차 곱을 나타내며 ||…||거리)입니다.

  7. 만약 i == 0설정 i = 1; 인 경우 i == SAMPLES설정i = SAMPLES - 1

  8. 하자 t1 = t0 + (i + 1) * dtt0 = t0 + (i - 1) * dt

  9. 3 단계로 돌아가십시오.

베 지어 곡선에서 베 지어 곡선까지의 거리에 대한 알고리즘

우리는 두 개의 베 지어 곡선이이 시간에 의해 parametrised F(t)하고 G(t).

  1. SAMPLES = 10예를 들어 보자

  2. 시작 t0 = 0, t1 = 1, s0 = 0s1 = 1

  3. 허락하다 dt = (t1 - t0) / SAMPLES

  4. 허락하다 ds = (s1 - s0) / SAMPLES

  5. 경우 dt < 1e-10(당신이 알아서 다른 정확도 조건 또는) 알고리즘을 완성하고 대답이다F(t0) .

  6. 만약 이 루프의 첫 번째 실행은 다음과 같습니다

    6.1. SAMPLES + 1포인트 목록을 계산합니다 F( 위 참조 ).

    6.2. 의 SAMPLES + 1포인트 목록을 계산합니다 G.

    6.3. 서로 가장 가까운 점 쌍을 찾으십시오.

    6.4. 업데이트 t0, t1, s0, s1위에서 본 것처럼.

  7. ELSE : 양자 택일에 지점의 목록 계산 F OR 에 지점의 목록 G에있는 지점 찾기 다음 F에 가장 가까운 G(s0)갱신하고 t0t1, OR 의 점 G에 가장 가까운 F(t0)업데이트 s0하고 s1.

  8. 3 단계로 돌아가십시오.

이슈

설계 상 이러한 알고리즘은 항상 로컬 최소값으로 수렴됩니다. 그러나 최상의 솔루션으로 수렴 할 것이라는 보장은 없습니다. 특히 베 지어 곡선 알고리즘은 그다지 좋지 않으며 여러 곳에서 두 곡선이 서로 가까이있는 경우 불행히도 롱 샷으로 솔루션을 놓칠 수 있습니다.

그러나 내가 말했듯이 더 강력한 솔루션에 대해 생각하기 전에 먼저 간단한 솔루션을 실험해야합니다.


0

1) 모든 것을 하나의 축으로 변환하므로 한 점의 길이를 계산하는 대신 '선', '선'은 Y 축입니다.

그러면 베 지어 곡선이 주어지면 제어점 수에 달려 있다고 말할 것입니다.

세 가지 (시작, '제어'및 종료)가있는 경우 일종의 스캔을 수행합니다 (각각 2 % 씩, 가장 가까운 것 사이에서 '이진'접근법으로).

더 많은 포인트 나는 (번역 된 Y- 축)에 가장 가까운 커플을 시험해 볼 것입니다.

나는 수학자가 정확한 수학 (수학)을 줄 수 있다고 확신하지만 비디오 게임에서 / 솔루션을 찾으려면 실제 솔루션에 몇 가지 답변이 포함될 수 있으므로 약간 괜찮은 솔루션을 사용하는 것이 좋습니다. 처리 능력에 대해서는 이야기조차하지 않습니다.)


추신. 2 커브, 그것에 대해 생각조차하지 마십시오 (제어점의 수에 따라 (적어도 가능할 수도 있습니다.)
Valmond


0

베 지어 곡선-직선의 경우 답을 찾는 가장 정확한 방법은 다음을 수행하는 것입니다.

  1. 직선이 항상 Y = 0에서 수평이되도록 문제를 변환합니다. 모든 제어점에 적절한 아핀 매트릭스를 곱하면됩니다. (나는 당신이 3 개의 고정 된 엔트리를 가진 3x3 행렬로 평면의 아핀 변환을 표현하는데 익숙하다고 가정한다.)
  2. 제어점의 Y 좌표를 검사하십시오. 모두 같은 부호를 갖지 않으면 선과 교차 할 수 있습니다. 베 지어 곡선의 Y 부분의 근을 계산합니다. 다항식에 대한 근본 발견 방법을 사용할 수 있으며 문헌에는 많은 것이 있습니다. 예를 들어, 구글 "볼록 껍질 행진"-베 지어 곡선에 사용되는 다항식에 대해 상당히 좋은 방법입니다. 찾은 모든 근은 거리가 0 인 선과의 교차점의 시간 값이며 작업이 완료됩니다.
  3. 모든 Y 좌표가 동일한 부호를 갖는 경우 베 지어 곡선의 Y 부분의 도함수를 계산하십시오. 점의 X 좌표는 차이가 없으므로 무시할 수 있습니다. 대상 선은 수평입니다. 그 파생어의 뿌리를 찾으십시오. 이는 커브가 선에 로컬로 가장 가까운 시간 값입니다.
  4. 이전 단계에서 찾은 모든 근에 대한 베 지어 곡선을 명시 적으로 평가하고 선으로부터 가장 작은 거리를 제공하는 근을보고합니다. 또한 엔드 포인트를 확인해야합니다. 루트보다 거리가 좁을 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.