Как мне создать кривую Безье, чтобы представить сглаженную ломаную линию? - PullRequest
4 голосов
/ 11 августа 2009

У меня есть ломаная линия, которая приближается к кривой, и я хочу нарисовать ее как гладкую кривую в PostScript, который поддерживает рисование кривой Безье. Для этого мне нужно сгенерировать две контрольные точки между каждой парой ломаных линий. (Я не могу получить исходную кривую из источника, только полилинию.)

У меня был некоторый успех при использовании кардинальных сплайнов из этого описания , но параметры там отличаются от Wikipedia и GDIPlus.DrawCurve , оба обратитесь к напряженности. У MS нет подробностей, а в Википедии - неполные детали (кардинальный сплайн игнорирует значения х?).

Какие формулы для контрольных точек основаны на растяжении?

Ответы [ 2 ]

14 голосов
/ 14 октября 2009

См. Эту ссылку http://www.ibiblio.org/e-notes/Splines/Cardinal.htm, которая предоставляет простые формулы, которые можно использовать для расчета контрольных точек Безье для многосегментной гладкой кривой.

Уравнения действительно просты, но для тех, кто не хочет повторять вычисления, я предоставляю свои результаты:

Пусть Pi (i = 1..n) - точки ломаной линии.

Сначала научитесь вычислять производные по Пи:

P1' = (P2 - P1) / a
Pi' = (Pi+1 - Pi-1) / a (for i=2..n-1)
Pn' = (Pn - Pn-1) / a 

где «а» - коэффициент (который, вероятно, означает «напряжение», о котором вы упоминали), например а = 2.

Тогда для каждого сегмента i (i = 1..n-1) от Pi до Pi + 1 контрольные точки Безье B1i и B2i будут:

B1i = Pi + Pi'/3
B2i = Pi+1 - Pi+1'/3
0 голосов
/ 11 августа 2009

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

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

...