경로의 길이를 어떻게 결정할 수 있습니까?


11

각 플레이어가 지정된 경로를 따라 이동 해야하는 게임이 있습니다. 베 지어 곡선을 사용하여 패스를 그립니다. 경로 의 총 실제 (선형이 아닌) 길이와 각 플레이어가 만든 거리를 어떻게 확인할 수 있습니까? (경로에서 시작점과 지정된 지점 사이의 거리입니다.)

최신 정보:

경로는 직교 평면 (2D)으로 표시됩니다.


귀하의 질문은 하단 대한 답변 이 답변
BlueRaja - 대니 Pflughoeft을

답변:


7

이전 답변에서 말했듯이 베 지어 곡선의 길이를 계산하는 것은 어렵습니다 ( 불가능 합니까?). 게임의 100 %가 길이의 근사치를 사용한다고 말하고 싶습니다. 이는 거의 항상 정확합니다.

몇 달 전에 저는 곡선을 "작은"세그먼트로 나누고 길이를 추가하는 제안 된 접근 방식을 사용하여 구현했습니다. 여기에 C ++ 구현의 예가 있습니다 .


11

베 지어 곡선의 길이를 측정하는 것은 어렵습니다. 약간의 부정확성을 신경 쓰지 않으면 간단한 해결책은 직선으로 베 지어 곡선을 근사하고 선 길이의 합을 계산하는 것입니다. 더 많은 세그먼트를 만들수록 근사치가 더 좋습니다.


나는 그것을 고려할 수도 있지만, 얼마나 많은 세그먼트가 있어야하고 어떻게 시작점과 끝 점이 경로에 있도록 세그먼트를 매핑 할 수 있습니까? 이 기술은 이름이 있습니까? (그래서 Google에서 검색합니다)
Valentin Radu

간단한 접근법은 B (0) 에서 B (1) 까지 점의 선형 분포를 사용하는 것입니다. 실제로 곡선을 그리는 데 사용하는 것과 매우 비슷합니다. Dan의 답변에서 소스 코드를보십시오.
bummzack

나는 내 대답에서 무엇을 향상시킬 수 있는지 알기 위해 다운 투표에 대한 설명을
부탁합니다

7

더 높은 차수 (즉, 1 차보다 큰) 스플라인 길이 매개 변수화는 근사화되어야합니다. 직접적으로 표현할 수 없으므로 이에 대한 직접적인 해결책을 찾기가 쉽지 않습니다.

현존하는 구현들 (복사-붙여 넣기 코드) :

체비 쇼프 근사값 사용저자에 따르면 곡선 크기가 증가함에 따라 정확도가 증가합니다. pp. 7-8 pseudocode를보십시오. 나머지는 무시할 수있는 접근 방식을 기반으로하는 다른 알고리즘에 대한 설명입니다. 많은 온라인 참조 자료에서는이 방법을 좋은 방법이라고합니다.

간결한 접근 방법 도 참조하십시오 .


5

이것은 @bummzack의 답변에 대한 의견으로 시작되었지만 너무 길었습니다.

얼마나 많은 세그먼트를 가져야하는지 어떻게 알 수 있습니까

두 가지 접근 방식이 있습니다. 첫 번째는 베 지어 곡선을 렌더링하기위한 표준 알고리즘입니다. 제어점은 곡선의 경계 상자를 형성하므로 모든 제어점이 시작점에서 끝점까지 선분의 엡실론 내에 있으면 선으로 근사합니다. 그렇지 않으면 de Casteljau의 알고리즘을 사용하여 세분화합니다. Epsilon은 최종 결과에서 원하는 오류에 따라 선택됩니다. 렌더링의 경우 일반적으로 0.5 픽셀입니다.

다른 접근 방식은 구간 산술을 사용하여 개선 한 것입니다. 시작부터 끝까지 선의 길이를 하한으로, 제어점을 통과하는 선의 길이의 합을 상한으로합니다. 다시 최종 오류 요구 사항에 따라 세분화하십시오.

하나는 일반적으로 t = 0.5로 세분화되지만 de Casteljau의 알고리즘은 어느 시점에서나 분할을 허용하므로 제어점이 C_0에서 C_3 인 큐빅 베 지어가 있고 C_2가 C_1보다 끝점 사이의 선분에 훨씬 가까운 경우 1/3 또는 2/3 중 하나가 더 좁아집니다. 나는 대수를 통해 더 나은 것을 정당화하기 위해 노력하지는 않았지만 원하는 경우 실험하고보고 할 수 있습니다. 다른 것이 없다면 옵션이 있다는 것을 지적하고 싶었습니다.


3

매개 변수화 된 곡선의 길이 계산은 sqrt ((dx / dt) ² + (dy / dt) ²)의 적분을 통해 수행 할 수 있습니다. 여기서 dx / dt는 곡선의 x 성분의 미분이며 dy / dt는 곡선의 y 성분의 미분입니다. 베 지어-스플라인의 경우 방정식이 모든 차원으로 확장 될 수 있으므로이 두 가지는 동일합니다.

3 차 베 지어 스플라인의 공식은 다음과 같습니다. B (t) = (1-t³) * P0 + 3 (1-t) ²t * P1 + 3 (1-t) t² * P2 + t³ P3 여기서 P0 제어 지점은 P3부터 P3까지입니다.

Wolfram | Alpha에 따르면,이 화학식의 유도체는 다음과 같습니다 : d (B (t)) / dt = 3 (t (t (P3-P0) + P2 (2-3t) + P1 (3t²-4t + 1))

이제 이것을 곡선의 길이에 대한 방정식에 다시 넣고 t = 0에서 t = 1까지의 적분을 계산할 수 있습니다. 불행히도, Wolfram | Alpha는 이것을 시도 할 때 시간이 초과됩니다. 그러나 수치 적분을 수행 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.