Плоская машинная графика, страница 11

В дальнейшем будем руководствоваться следующим правилом. Если методом приращений найдена некоторая точка (xi,yi), причем f(xi,yi)<0, то для того, чтобы сгенерированная последовательность точек была близка к идеальной кривой, будем стремиться перейти в такую точку (xi+1,yi+1), для которой выполняется условие f(xi+1,yi+1)>0, и наоборот. Другими словами, если мы выставили точку слева от кривой, то мы стремимся перейти на правую сторону от кривой и наоборот.

Опишем метод подробнее. Выбираем начальную точку (x0,y0), принадлежащую кривой, и направление движения вдоль кривой. Затем разобьем кривую на отрезки кривой, причем для каждого отрезка будет выполняться следующее условие: вектор касательной для всех точек отрезка кривой принадлежит только одной октанте (октанта – это одна восьмая часть плоскости, на рис. 11 приведена нумерация октант). Например, все точки эллипса,  принадлежащие первой четверти, разобьются на два отрезка. Для первого отрезка вектор касательной V принадлежит третьей октанте, а для второго отрезка вектор касательной V1 принадлежит четвертой октанте (рис. 12).

 


Рис. 11. Нумерация октант                             Рис. 12. Генерация точек эллипса

Зная уравнение кривой, мы можем найти вектор касательной и определить номер октанты. Для этого сначала запишем градиент

.

Вектор касательной перпендикулярен градиенту (рис. 12). Любому вектору а=(аху) на плоскости ОХУ перпендикулярны два вектора: вектор b1=(-ay,ax) и вектор b2=(ay,-ax). Следовательно, градиенту перпендикулярны два вектора

.

Нужный нам вектор определяется, исходя из направления движения вдоль кривой.

Генерацию точек кривой будем производить следующим образом: сначала выведем все точки, принадлежащие первому отрезку кривой, затем второму и т. д. Например, для генерации точек эллипса, принадлежащих первой четверти, требуется вывести два отрезка кривой (рис. 12).

Для всех точек каждого отрезка кривой вектор касательной принадлежит только одной октанте. А зная, какой октанте принадлежит вектор касательной, определим в какие две точки возможно перемещение. Например, если вектор касательной принадлежит третьей октанте (рис. 13), то из точки (х,у) мы можем перейти либо в точку (х,у+1), либо в точку (х-1,у+1).

А для того, чтобы из этих двух возможных точек выбрать одну, воспользуемся сформулированным ранее правилом. То есть из текущей точки ii)  мы можем перейти либо в точку jj), либо в точку kk), причем f(хjj)×f(хkk)<0. Пусть f(хjj)>0, а f(хkk)<0. В этом случае поступаем следующим образом: если f(хii)<0, то переходим в точку jj), и наоборот, если f(хii)³0, то переходим в точку kk).

Для уменьшения времени работы программы в дальнейшем, вместо значения f(хii) будем вычислять значение величины di, причем di=f(хii). Так как начальная точка 00) принадлежит кривой, то d0=f(х00)=0. Величина di вычисляется по формуле

di=di-1+f(хi,уi)-f(хi-1,уi-1).

В дальнейшем мы будем вычислять приращение функции f(х,у): f(хii)- f(хi-1i-1).

Пример генерации точек эллипса, принадлежащих первой четверти. Уравнение эллипса х222/b2=1 запишем в виде f(х,у)=b2x2+a2y2-a2b2=0. В качестве начальной точки 00) рекомендуется выбирать точку кривой, принадлежащей оси координат. В нашем случае, в качестве начальной точки можно выбрать точку (а,0) или (0,b). Выбираем точку х0=а, у0=0. Направление движения вдоль кривой – против часовой стрелки. Мы уже отмечали (рис. 12), что, в этом случае, сначала выводится отрезок кривой, для которого вектор касательной принадлежит третьей октанте, а затем отрезок, для которого вектор касательной принадлежит четвертой октанте.

Запишем градиент функции f

.

Вектор касательной равен либо V=(-2a2y, 2b2x), либо w=(2a2y, -2b2x). Вектор w=(wx,wy) принадлежит седьмой октанте (рис. 11), так как wx>0, а wy<0. Вектор V=(vx,vy) принадлежит третьей октанте (рис. 12), так как Vx<0, a Vy>0. Следовательно, вектор касательной V=(-2a2y, 2b2x).

Запишем условие, при выполнении которого, вектор касательной принадлежит третьей октанте: ½Vy½>½Vx½, в нашем случае: ½2b2x½>½-2a2y½. Учитывая, что x>0 и y>0, так как они принадлежат первой четверти, получаем условие b2x>a2y. Если  вектор касательной принадлежит третьей октанте (рис. 13), то возможны два перемещения

Отметим, что у этих двух перемещений у координата одинакова, следовательно, не зависимо от того в какую точку мы будем перемещаться, у увеличится на 1.