Я работаю над проектом с использованием кривых Безье, и мне трудно найти значение t, которое находится в диапазоне [0, 1], которое соответствует определенной позиции на кривая Безье. Я установил тест, где я добавлял инкрементные значения t (в частности, с шагом 0,001 до 1) и подставлял их в параметрические уравнения x и y кривой безье, затем вычитал это значение с истинным значением и находится в пределах небольшого порога для x и y Я нашел подходящий t. К сожалению, не существует ни одного значения для t, которое соответствует требуемым координатам. Это означает, что цикл фактически заканчивается, не преуспевая в условном в цикле for.Поиск правильного параметрического значения для кривой безье с заданной координатой
Координата, которая должна быть на кривой, равна (75, -2.26384401). Я помещаю свой код ниже, который показывает координаты контрольных точек и истинные x и y координаты. Любая помощь будет принята с благодарностью. Благодаря!
int _tmain(int argc, _TCHAR* argv[])
{
float P0[2] = { 55, -11.105 };
float P1[2] = { 72.569, -11.105 };
float P2[2] = { 50.217, 1.396 };
float P3[2] = { 100, 1.396 };
float t = 1.0F;
float int_t = t/1000; // intervals
float x;
float y;
float tx = 75.0000000F; // where it should be in x
float ty = -2.26384401F; // where it should be in y
float epsilon = 0.01;
float final_t;
for (float i = 0; i < t; i += int_t)
{
final_t = i;
x = powf(1.0F - i, 3.0F)*P0[0] + 3.0F*powf(1.0F - i, 2.0F)*i*P1[0] +
3.0F*(1.0F - i)*powf(i, 2.0F)*P2[0] + powf(i, 3.0F)*P3[0]; // x(t)
y = powf(1.0F - i, 3.0F)*P0[1] + 3.0F*powf(1.0F - i, 2.0F)*i*P1[1] +
3.0F*(1.0F - i)*powf(i, 2.0F)*P2[1] + powf(i, 3.0F)*P3[1]; // y(t)
// for my testing
cout << "---------------------------------" << endl;
cout << "i = " << i << endl;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "---------------------------------" << endl;
if ((fabsf(x - tx) <= epsilon) && (fabsf(y - ty) <= epsilon))
break;
}
cout << endl;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "t = " << final_t << endl;
return 0;
}
Есть несколько вопросов о ближайшей точке кривой Безье на SO – MBo
Спасибо @MBo за то, что так быстро прокомментировали! Есть ли тот, который, по вашему мнению, был бы наиболее проницательным? – InsigMath
Я лично использовал метод решения квинтичного уравнения (нулевую производную функции расстояния). Он находит все возможные решения (если многие существуют), но может страдать от числовых ошибок. Но методы подразделения для Bezier тоже хорошо работают: http://stackoverflow.com/questions/2742610/ – MBo