2016-06-10 3 views
-1

임의의 지점에서 스플라인 곡선을 평가하는 최선의 방법은 무엇입니까?베 지어 스플라인 평가 정확도

필자는 평가 결과를 플롯하고 UI 라이브러리를 사용하여 얻은 결과와 비교하여 결과가 좋지 않음을 확인했습니다.

저는 커브의 마지막 세그먼트 인 첫 번째 &에 대해 중앙 세그먼트에 대해 입방식을 사용하고 있습니다.

http://www.it.hiof.no/~borres/j3d/jlatexmath/BezierFunction0small.png

I는 평가에서 X가 변화 (이동)를 조정하기 때문에이 문제에 봉착 이유라고 생각하며 현재 일정 그것을 평가있어 입력 사이에 약간의 차이가 발생 좌표 단차 x 및 출력 하나 (현재 무시하고 있습니다)

필요한 경우 코드를 제공 할 수 있습니다. (나는 그것을 돕기 위해 정확성을 확인하는 방법으로 Qt를 사용하고있다.)

+0

"이 문제가 발생하는 이유는 무엇입니까?" // "필요한 경우 코드를 제공 할 수 있습니다."물론 필요합니다! // "Qt를 확인하는 방법으로 사용하고 있습니다 ..."Qt 만? 기본 언어는 무엇입니까? – DYangu

+0

@DYangu 답장을 보내 주셔서 감사합니다. 프로그래밍 방식보다 수학적으로 더 중요한 문제입니다. 코드를 포함시키지 않았고 언어를 처음부터 지정하지 않았습니다. 나는 그것을 제공하는 것보다 더 행복하다. 이제 커브의 미분을 고려하지 않고 커브의 "일정한 단계별 평가"를 수행하여 문제가 발생했음을 확인했습니다. 내가 아크 길이를 고려해야한다면 아마 작동 할 것이지만 그것을하는 방법을 잘 이해할 수는 없습니다. 내가한다면 게시물을 업데이트 할 것입니다. 건배. –

+0

예. 일부 코드와 오류 출력을 제공하십시오. 나는 아직도 당신의 잘못이 무엇인지 분명하지 않다. – DYangu

답변

0

그것은 수학과 프로그래밍의 조합으로 밝혀졌다.

이후 구현하고있는 특정 유형의 커브에 대한 지식을 확장했으며 지금 달성하고자하는 것과 내 문제가 무엇인지 더 잘 설명 할 수 있습니다. 이로 인해 혼란 스러울 수 있습니다.

FCurve를 구현하면서 임의의 입력 값에서 "평가"할 수 있어야했습니다. FCurves는 함수를 나타내는 스플라인입니다 (즉, 단일 입력을 반환하는 임의의 입력에 대한 것임)

이전의 스플라인 구현을 평가할 때 잘못된 평가 결과가 나타났습니다. 길이는 FCurves가 약간 더 엄격하다는 사실을 제외하고는

정확한 평가 값을 얻기 위해 현재 사용하고있는 방법은 세그먼트를 따라 다른 "t"가있는 "세그먼트 샘플"집합을 채운 다음 가장 가까운 일치를 찾고 선형을 사용하여 반복합니다 그들 사이의 보간. 나중에 다시 살펴보고 최소한의 오류로 세그먼트를 평가하는 데 실제로 필요한 샘플 수를 얻는 현명한 방법을 찾으려고 노력하지만 지금은 매우 훌륭하게 작동합니다.

위의 공식 (큐빅 베 지어)을 적용 할 때 입력 "x"및 "t"에서 다른 "x"값을 얻는 것이 일반적이기 때문에이 모든 일이 발생했습니다. 전

const uint32_t sampleCount = 20; 
    Vec2 samples[sampleCount]; 
    fillSegmentSamples(x, &samples[0], sampleCount); 

    uint32_t best = 0; 
    for(uint32_t i = 0; i < sampleCount; i++) 
    { 
     if(samples[i].x > x) 
      break; 

     best = i; 
    } 

    uint32_t nxt = best + 1; 
    if(nxt >= sampleCount) 
    { 
     best--; 
     nxt--; 
    } 

    float t = (x - samples[best].x)/(samples[nxt].x - samples[best].x); 

    y = lerp(samples[best].y, samples[nxt].y, t); 

, 나는 그것이 보상의 모든 종류를하지 않는 잘못 다음의 해당하는, 실행중인 : 여기

내가 그것을 평가할 때와 종료 코드의 비트입니다 x 축 이동.이 두 가지 질문/내가 무엇을 이해하는 데 도움 답변입니다

Vec2 samples[1]; 
fillSegmentSamples(x, &samples[0], 1); 
y = samples[0].y; 

(이 경우에 "T"는 "X"에서 추출됩니다주의하는 것은) 잘못된 거라고 :

그들은 특별히 fcurves와 관련이 없지만 호 길이는 나에게이 문제를 해결할 힌트를주었습니다.

건배!