Найдите высоту кривой Безье на холсте

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

c.moveTo(130,55);
c.bezierCurveTo(130,-18,0,-18,0,55);

-18 - это то, что мне нужно было установить для значений y, чтобы кривая примерно проходила через y = 0.


person qw3n    schedule 08.12.2010    source источник
comment
Нужно ли вам использовать кривую Безье и всю ее мощь, или простая круговая arcTo даст вам то, что вам нужно?   -  person Phrogz    schedule 08.12.2010
comment
@Phrogz Технически нет, но мне нравится, как кривая Безье более прямая по сторонам, ведущим к прямому участку. Как я уже упоминал, у меня есть кое-что, что работает, и мне просто интересно, какой будет формула, если у меня снова возникнет эта проблема.   -  person qw3n    schedule 09.12.2010


Ответы (1)


Да, для этой версии кривых Безье с ограничениями есть простой ответ. Берем определение кубической кривой Безье из Википедии здесь и решим среднюю точки на кривой (t=0,5), минимальное значение y будет:

1/4 Ymax + 3/4 Ymin

(Ymax — значение y начальной и конечной точек, а Ymin — значение y двух контрольных точек). Или, чтобы середина была 0,

Ymin = -1/3 Ymax.

Итак, поскольку у вас Ymax = 55, Ymin должно быть -1/3 * 55 = -18,333.. Вот почему в вашем примере работало 18.

person andrewmu    schedule 16.03.2011
comment
Я почти забыл об этом вопросе, спасибо за ответ. - person qw3n; 18.03.2011