2016-06-10 2 views
-1

Каков наилучший/самый правильный способ оценки кривых сплайнов в произвольных точках?Правильность оценки сплайсов Безье

Я разработал результаты оценки и сравнил их с тем, что я получаю от использования библиотеки пользовательского интерфейса, и выяснил, что мои результаты отключены.

Я использую кубическую формулу для центральных сегментов и квадратичную для первых & последних сегментов кривой.

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

Я думаю, что причина, у меня этот вопрос потому, что в своей оценке координаты Х изменений (сдвигов) и я в настоящее время оценивает его на постоянной активизировали координаты, вызывает некоторые различия между входом x и выходной (который я в настоящее время игнорирую)

Я могу предоставить код при необходимости. (Я использую Qt как способ проверить правильность в случае, если это помогает)

+0

«Причина, по которой у меня возникает эта проблема» Какая проблема? // «Я могу предоставить код при необходимости» Конечно, это необходимо! // «Я использую Qt как способ проверки ...» Только Qt? Какой базовый язык? – DYangu

+0

@DYangu спасибо за ответ. Это скорее математическая проблема, чем программная, поэтому я не включил код и не указал язык в первую очередь. Я более чем счастлив предоставить его, хотя. Теперь я подтвердил, что проблема связана с выполнением «постоянной ступенчатой ​​оценки» кривой без учета производных кривой. Если бы я принял во внимание длину дуги, это, вероятно, сработало бы, но не могло бы понять, как это сделать. Я обновлю сообщение, если я это сделаю. веселит. –

+0

Да, пожалуйста. Предоставьте код и вывод ошибок. Я до сих пор не понимаю, какова ваша ошибка. – DYangu

ответ

0

Оказалось, что это сочетание математики и программирования.

С тех пор я расширил свои знания по конкретному типу кривых, которые я выполнял, и теперь я могу лучше объяснить, чего я пытаюсь достичь и какова моя проблема. Извините за любую путаницу, которая может быть вызвана.

Я реализовал FCurve и должен был «оценить» его при произвольных входных значениях. FCurves являются сплайнами, которые представляют собой функцию (то есть для любого заданного ввода они возвращают единственный уникальный выход)

При оценке моей старой реализации сплайна я получал неправильные результаты оценки, потому что мой оценочный код не учитывал кривые arc- а кроме того, что FCurves несколько более ограничительны.

Способ, которым я в настоящее время использую, чтобы получить точные оценочные значения, состоял в том, чтобы заполнить набор «сегментных выборок» с разными «t» по сегменту, а затем итерации через него, чтобы найти самые близкие совпадения и сделать линейный интерполяция между ними. Впоследствии я вернусь к нему и попытаюсь найти разумный способ получить, сколько образцов действительно требуется для оценки сегмента с минимальной ошибкой, но пока это работает очень хорошо.

Все это происходило, потому что, применяя приведенную выше формулу (кубический безье), довольно часто получают разные значения «х» от входных «х» и «т».

Вот кусочек кода, который я закончил с при оценке его:

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; 

Эти два вопроса/ответы, которые помогли мне понять, что происходит не так:

они не относятся к fcurves специально, но длина дуги дала мне подсказку, чтобы исправить это.

Cheers!

Смежные вопросы