Метод художника для удаления невидимых частей поверхностей, страница 3

float fy(float fi)

{

return (float)(r(fi)*sin(fi));

}

void main()

{

// Инициализация графики

int gdriver=DETECT, gmode;

initgraph(&gdriver, &gmode, "");

// Вычисление коэффициента масштабирования по x

xdens=(float)(xmax-xmin)/getmaxx();

// Вычисление коэффициента масштабирования по y

ydens=(float)(ymax-ymin)/getmaxy();

// Вывод графика

setcolor(WHITE);

for(float fi=0; fi<=2*M_PI; fi+=hfi)

line(ex(fx(fi), fy(fi)), ey(fx(fi), fy(fi)),

ex(fx(fi+hfi), fy(fi+hfi)), ey(fx(fi+hfi), fy(fi+hfi)));

getch(); // Ожидание нажатия клавиши

closegraph(); // Выход из графического режима

}

Задача № 11. Алгоритм закраски с использованием режима XOR_PUT. Рассмотреть пример.


Сформируем алгоритм для заполнения многоугольника.

1. Выбираем начальную точку (x0,y0) – одну из вершин многоугольника.

2. Выбирается направление обхода границы (например, по часовой стрелке).

3. Устанавливается режим XOR_PUT.

4. Рассматриваем следующую точку границы многоугольника в выбранном направлении обхода, и называем ее текущей (xтек,yтек). Сравниваем текущую точку (xтек,yтек) и предыдущую точку (xпред,yпред). Возможны три случая:

·  а) yтек>yпред, в этом случае проводим горизонтальный отрезок от точки (xтек,yтек) до перегородки с помощью функции line и переходим к следующей точке границы многоугольника;

·  б) yтек=yпред, в этом случае переходим к следующей точке границы многоугольника;

·  в) yтек<yпред, в этом случае проводим горизонтальный отрезок от точки (xпред,yпред) до перегородки с помощью функции line и переходим к следующей точке границы многоугольника.

5. Заполнение закончено, когда просмотрены все стороны многоугольника.

Стартуем с левой верхней вершины (начальная точка) и рассмотрим левую сторону квадрата. Берем следующую точку,  вариант (в), и так до самого конца. Затем рассматриваем нижнюю сторону квадрата, вариант (б). После этого рассматриваем правую сторону квадрата, вариант (а). При этом линии от правой границы квадрата до перегородки исчезают. Берем последнюю сторону, верхнюю, вариант (б). Квадрат закрашен.

Задача № 12. Hаписать текст программы , котоpая, используя метод пpиpащений, генеpиpует точки эллипса , принадлежащих  пеpвой  четвеpти.

#include <stdio.h>

#include <graphics.h>

#include <conio.h>

int x0, y0; //экранные координаты начала координат

int hx, hy; //половины ширины и высоты пиксела

void point(int ix, int iy)

{bar (x0+hx*2*ix-hx+1, y0-hy*2*iy-hy+1, x0+hx*2*ix+hx-1, y0-hy*2*iy+hy-1);}

main()

{

int gdriver = DETECT, gmode;

int x, y, a=30, b=20;

float delta;

long a2, b2;

hx=3; hy=3;

//Инициализация графического режима

initgraph ( &gdriver, &gmode, "D:\\BC\\BGI") ;

x0 = getmaxx()/2; y0 = getmaxy()/2;

moveto(0,y0); linerel(getmaxx(),0);

moveto(x0,0); linerel(0, getmaxy());

a2=a*a; b2=b*b;

x=a; y=0; delta=0;                //начальная точка (x0,y0))

while (b2*x>a2*y)                          //пока вектор касательной принадлежит третьей

{                                 //октанте

point(x,y);                       //ставим точку с координатами (x,y)

if (delta<0)

delta+=a2*(y*2+1);//положительное приращение

else

{                         //отрицательное приращение

delta+=a2*(y*2+1)+b2*(-x*2+1);

x--;                      //x уменьшается на 1

}

y++;                              //y увеличивается на 1

}

while (x>= 0)                     //пока вектор касательной принадлежит

{                                 //четвертой октанте

point(x, y);              //ставим точку с координатами (x,y)