2016-10-10 5 views
1

Я пытаюсь нарисовать кривую между двумя точками, в частности, я оставляю картину того, что я хочу:Как рисовать кривой между двумя точками? OpenGL

enter image description here

Этот образ был взят из этого pdf на странице 10.

Я понимаю, что применяет концепцию Bresenham algorithm, но не знает, как реализовать концепцию рисования кривой.

На странице 11 ПРВ pseudocode algorithm показано на рисунке, но не понимают понятие «ошибки» для реализации. Пожалуйста, если кто-нибудь поможет мне понять это. Я работаю с C++ и OpenGL.

псевдокод:

set up x, y to x0, y0 
set up error variable exy for P(x0+1,y0+1) 
loop 
set pixel x, y 
    if ex + exy > 0 then increment x, sub difference error 
    if ey + exy < 0 then increment y, add difference error 
loop until end pixel 

Спасибо вам всем.

+4

«Я понимаю, что применяет концепцию алгоритма Брешенема, но не знает, как реализовать концепцию рисования кривой. *« Вы не используете алгоритм Брешенема для рисования линий, а не кривых. Теперь вы можете использовать алгоритм Брешенема, чтобы нарисовать кривую, сначала разделив ее на кучу строк. Но это другое дело. –

+0

Итак, идите и найдите кубические и/или квадратичные сплайны. Написано множество строк, в которых вычисляются точки на каждом из них. Как сказал Никол, алгоритм Брешенема не имеет (или очень ограниченного, в лучшем случае) практического использования здесь. – enhzflep

+0

Алгоритм Bresenham для кривых всегда только для определенного типа уравнения/кривой, который вы получаете при компиляции/времени кода. поэтому, если вы создадите Bresenham для эллипса, он всегда будет рисовать только эллипс. Это ограничение неприемлемо для произвольной формы кривой, не говоря уже о подразделении по пунктам inflex и т. Д. Вместо этого используйте кубические кривые. см. [Правильная реализация кубической сплайновой интерполяции] (http://stackoverflow.com/a/20517874/2521214) Все кубические кривые обрабатываются одинаково, единственное отличие заключается в том, как вы вычисляете коэффициенты. – Spektre

ответ

2

В этой статье вы процитировали кривые с низкого уровня абстракции, чтобы попытаться увеличить производительность. Обычно, когда вы идете рисовать кривые, вы должны использовать более высокую абстракцию, такую ​​как Безье с De Casteljau's algorithm, которую ваш pdf упоминает на странице 22. Я сделал это на C++, и это совсем не сложно. У Pomax есть awesome guide, который объясняет это хорошо. Вы в основном разделяете свою кривую, пока не увидите много прямых линий. Затем вы рисуете все прямые линии.

1

Идея этого алгоритма заключается в том, что вы определяете свою кривую функцией f(x, y) = 0. То есть функция f(x, y) должна возвращать ноль для координат (x, y) любой точки, лежащей на кривой. Для любой точки, которая не лежит на кривой, функция должна возвращать ненулевое значение, величина и знак которого должны указывать соответственно расстояние и направление данной точки от кривой. Это значение называется «ошибкой».

Таким образом, значение «ошибка» для любого пикселя может быть вычислено просто путем вызова f(x, y) для координат (x, y) пикселя.