Рисование кривой из нескольких точек - PullRequest
2 голосов
/ 15 июня 2011

Я хотел бы знать, как соединить точку, чтобы сформировать кривую. У меня есть 20 точек на диаграмме, и я хотел бы знать, как присоединиться к ним. Я пытался с объектом GeneralPath, но хотел бы знать, если есть лучший способ?

Ответы [ 5 ]

3 голосов
/ 15 июня 2011

Похоже, вам нужна кривая Катмулла-Рома.См. http://www.mvps.org/directx/articles/catmull/ для более подробной информации и http://johnsogg.blogspot.com/2010/01/cardinal-splines-and-catmull-rom.html для реализации.

3 голосов
/ 15 июня 2011

GeneralPath, безусловно, самый простой. Создайте свой путь, вызовите moveTo для вашей первой точки, затем вызовите lineTo для каждой последующей точки. Затем нарисуйте его в объекте Graphics2D.

2 голосов
/ 15 июня 2011

Безье вообразил кривую, основанную на элементе полинома:

(a + b)^3 = a^3 + 3a^2*b + 3a*b^2 + b^3

(^ означает "во власть", а не "XOR").Он фактически заменил a на t и b на 1-t.Так что формула будет (t + (1 - t))^3 (Да, она равна 1).

На данный момент, у нас есть формула

t^3 + 3*t^2*(1-t) + 3*t*(1-t)^2 + (1-t)^3

Есть 4 части.Выберите 4 точки.

(x1,y1), (x2,y2), (x3,y3), (x4,y4)

Теперь создайте параметрические уравнения, умножив каждую часть формулы на координату, например:

x(t) = t^3*x1 + 3*t^2*(1-t)*x2 + 3*t*(1-t)^2*x3 + (1-t)^3*x4
y(t) = t^3*y1 + 3*t^2*(1-t)*y2 + 3*t*(1-t)^2*y3 + (1-t)^3*y4

Это параметрическое уравнение кубического Безье.

Вы хотите безье 20-го уровня?«просто» развить (t + (1-t))^20.

Треугольник Паскаля должен помочь вам.

2 голосов
/ 15 июня 2011

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

1 голос
/ 15 июня 2011

Чтобы построить кривую, а не только линии, вы можете использовать метод GeneralPath

public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3)

, который создает кривую Безье. Но чтобы вычислить контрольные точки x1, y1, x2, y2, вам нужно сложить математику или загрузить библиотеку интерполяции.

Также вы можете проверить этот вопрос , он имеет ссылки на исходный код, реализующий некоторые алгоритмы интерполяции.

...