3.8.2. Вычерчивание кривых, заданных параметрически Кривая, заданная параметрически, рисуется непосредственно. В этом состоит главное преимущество параметрической формы перед неявной. Допустим, что кривая С имеет параметрическое задание P(t) - (x(t), y(t)), где t изменяется от 0 до Г (см. рис. 3.54, а). Предположим далее, что мы хотим нарисовать хорошее приближение к кривой, используя только прямые линии. Тогда нам следует взять замеры

Френсис Хилл

Глава 3. Дополнительные инструменты для рисования Дс) для близких значений параметра. Таким образом, будет выбрана последовательность моментов времени {t}, и для каждого £. вычислена текущая координата на кривой Р.= P(t) = (x(t),y(t)). Затем кривая P(t) аппроксимируется ломаной линией на базе этой последовательности точек РР как показано на рис. 3.57, б.

Френсис Хилл

В листинге 3.15 приведен фрагмент кода, рисующего кривую (x(t), y(t)) на базе массива замеров времени t[i\.

Листинг 3.15. Рисование эллипса с помощью точек, равноудаленных по t

// draw the curve (x(t). y(t)) using

// the array t[0].....t[n-l] of "sample-times'

// рисуем кривую (x(t). y(t)). используя // массив t[0].....t[n-l] «замеров времени»

glBegin(GL_LINES):

for(int i - 0: i < n: i++)

glVertex2f(x(t[i]). y(t[i])): glEndO: Если эти замеры расположены достаточно близко друг от друга, то глаз естественным образом соединит отрезки прямых вместе, и мы увидим гладкую кривую. Замеры должны быть расположены особенно близко в тех промежутках t, где кривая быстро «извивается», и могут быть взяты пореже в тех местах, где кривая имеет слабую волнистость. Требуемая «близость» или «качество» аппроксимации зависят от обстоятельств.

Код может быть зачастую упрощен, если он нужен только для определенной кривой. Эллипс из уравнения 3.13 можно нарисовать, задавая п равноотстоящих значений t, посредством следующего кода:

#define TW0PI 2 * 3.14159265 glBegin(GL_LINES):

for(double t - 0: t <=■ TWOPI; t +=■ TWOPI/n)

glVertex2f(W * cos(t), H * sin(t)): glEndO:


⇐ Предыдущая| |Следующая ⇒