LINUX.ORG.RU

Кривые Безье - математический ликбез.


0

0

Суть вопроса такова:

Есть три или четыре точки через которые надо провести кривую Безье. Допустим, первая и последняя будут базовыми. Остаются одна-две промежуточных через которую КБ должна проходить. Надо вычислить две вспомогательные точки для кривой Безье. На ум приходит только отыскание этих точек с помошью метода наименьших квадратов. Не изобретаю ли я велосипед - это должна быть частая операция по идее?

★★★

ничего не понял. кривые Безье - это вполне себе сплайн-интерполяция; если тебе нужно чтобы кривая через эти точки именно проходила, строй три кривых

jtootf ★★★★★
()

Есть математически выведенная система уравнений для получения точной инфы по заданным условиям. Причём, для любого количества точек. ЕМНИП, потому что мог перепутать со сплайнами.

JackYF ★★★★
()
Ответ на: комментарий от jtootf

>кривые Безье - это вполне себе сплайн-интерполяция; если тебе нужно чтобы кривая через эти точки именно проходила, строй три кривых

А какие вспомогательные точки выбирать для этих трех кривых? Чтобы оно градкое получилось?

Absurd ★★★
() автор топика

BTW Мне оно нужно грубо говоря чтобы построить график. До хрена раз lineTo вызывать не хочется, поэтому есть желание брать первую и вторую производные и соединять экстремумы и точки перегиба кривыми Безье.

Absurd ★★★
() автор топика
Ответ на: комментарий от Absurd

в таком случае правильное решение может варьироватьсяв зависимости от того график чего строим

btw, тот код, который будет рисовать безье, тоже в конечном итоге выховет lineTo дохрена раз, так что неплоохо бы сперва понять в чем состоит ожидаемый профит

anonymous
()
Ответ на: комментарий от anonymous

>так что неплоохо бы сперва понять в чем состоит ожидаемый профит

Тот код который будет рисовать кривую Безье не будет с одной стороны закрашивать один пиксель по два-три раза а с другой стороны допускать зазубренностей.

Absurd ★★★
() автор топика
Ответ на: комментарий от Absurd

>А какие вспомогательные точки выбирать для этих трех кривых? Чтобы оно градкое получилось?

я не понимаю, чего ты хочешь

оно будет гладкое - по определению сплайна. поясни, каких точек тебе там не хватает и почему :) ибо это как бы неочевидно. как по мне, то всё у тебя уже есть

jtootf ★★★★★
()
Ответ на: комментарий от Absurd

Как мне кажется, для такой задачи больше подойдут дельта-сплайны. Но вряд ли это есть в библиотеках в готовом виде.

Zenom ★★★
()
Ответ на: комментарий от Absurd

> экстремумы и точки перегиба кривыми Безье

ну если у тебя есть точки x[i], значения функции в этих точках y[i] и значения производной функции, y'[i], то на каждом отрезке (x[i], x[i+1]) строй многочлен, так чтобы значения и производные на концах совпадали с нужными. Всего параметров получается 4, значит многочлен 3-й степени брать надо. Как переписать многочлен в виде кривой безье думаю сам можешь посчитать

В точках x[i] у графика будет разрыв второй производной, на глаз должно быть достаточно гладко.

anonymous
()
Ответ на: комментарий от jtootf

>поясни, каких точек тебе там не хватает и почему :)

У функции bezierTo четыре параметра - p1, p2, p3, p4: две базовые точки p1, p4 и две вспомогательные p2, p3. Вспомогательные точки - это те плюшки которые ты возишь мышкой в Inkscape чтобы отрегулировать кривизну сопряженных с ними кривых. Базовые точки p1, p4 у меня есть - это значения функции на начале и конце отрезка. Мне нужно получить вспомогательные точки p2, p3. В библиотеке других сплайнов кроме как безье нет. Угол phi под которым вспомогательные точки отстоят от базовых - это допустим производная (геометрический смысл производной - тангенс угла касательной). Надо найти длину r от базовой точки p1 до вспомогательной p2 и аналогично от p4 до p3, так чтобы этот сплайн наиболее точно покрывал реальный график функции. И мне нужна имено библиотечная функция, так как в библиотеке есть вменяемый растровый алгоритм автоматически подбирающий шаг итерации чтобы не закрашивать один пиксель по два раза и кошерное сглаживание.

PS: И Почему на ЛОР-е нельзя аттачить картинки? Если модеры хотят убрать анонимуса, они определенно должны в качестве индульгенции разрешить постить картинки.

Absurd ★★★
() автор топика
Ответ на: комментарий от Absurd

> это допустим производная

не допустим, а так и есть

> Надо найти длину r от базовой точки p1 до вспомогательной p2 и аналогично от p4 до p3, так чтобы этот сплайн наиболее точно покрывал реальный график функции


ну ты уравнение кубическое записать можешь, или троечник совсем?

B(t) = (1-t)^3 P1 + 3t(1-t)^2 P2 + 3t^2(1-t) P3 + t^3 P4.

B'(0) = -3 P1 + 3 P2 -- это производная на одном конце, то же на другом конце.
Остаются два свободных параметра.

Можешь их подогнать так чтобы например вторые производные на концах тоже совпадали с твоим гребаным графиком:

B''(0) = 6 P1 - 12 P2 + 6 P3
B''(1) = 6 P4 - 12 P3 + 6 P2

эти два вектора значит должны быть параллельны (1, f''(x[i]) и (1, f''(x[i+1])) соответственно.

anonymous
()
Ответ на: комментарий от anonymous

Ок, алгоритм придумал, спасибо.

Absurd ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.