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

#include <graphics.h>

#include <conio.h>

#include <stdlib.h>

#include <math.h>

int xmin=-4, ymin=-4, xmax=4, ymax=4;

float tmin=-100, tmax=100;

float xdens, ydens;

// Вычисление экранной x координаты

int ex(float x,float y)

{

return (int) ((x-xmin)/xdens);

}

// Вычисление экранной y координаты

int ey(float x,float y)

{

return (int) ((ymax-y)/ydens);

}

// Функция f(t)

float f(float t)

{

return 2*t-t*t;

}

// Функция g(t)

float g(float t)

{

return 3*t-t*t*t;

}

void main()

{

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

int gdriver=DETECT, gmode;

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

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

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

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

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

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

setcolor(WHITE);

float ht=(float)(tmax-tmin)/1000;

for(float t=tmin; t<tmax; t+=ht)

line(ex(f(t), g(t)), ey(f(t), g(t)),

ex(f(t+ht), g(t+ht)), ey(f(t+ht), g(t+ht)));

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

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

}

Задача №8. Пусть задан отрезок с экранными координатами ((0, 0)-(4, 3)). Рассмотреть на примере  этого отрезка алгоритм простого ЦДА и записать последовательность точек, которые будут сгенерированы этим алгоритмом.

x0=0, y0=0, x1=4, y1=3

|4-0|>|3-0|

l=|x1-x0|=|4-0|=4

dx=(x1-x0)/l=4/4=1, dy=(y1-y0)/l=3/4

ex=1, ey=1

rez=0.5

1.  (0,0)

rez=0.5+3/4=1.25, x=0+1*1=1, y=0+1*1=1, rez=1.25-1=0.25 (1,1)

2.  x=1+1*1=2, rez=0.25+3/4=1, y=1+1*1=2, rez=1-1=0 (2,2)

3.  x=2+1*1=3, rez=0+3/4=0.75 (3,2)

4.  x=3+1*1=4, rez=0.75+3/4=1.5, y=2+1*1=3, rez=1.5-1=0.5 (4,3)

Задача9. Алгоритм с запоминанием точек границы в стек для закраски областей. Рассмотреть пример.

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

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

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

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

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

Рассмотрим квадрат со стороной 4 пикселя. Обход начнем с левого верхнего угла(начальная точка) против часовой стрелки. Случай (а) до самой нижней грани. Рассмотрим нижнюю грань. Случай (б). Затем рассмотрим правую грань. Случай (в) – происходит закраска. Верхняя грань – случай (б). Квадрат закрашен.

Задача № 10. Разработать программу, которая выводит на экран график функции          =2(1-cosφ) для -4 x 4 и -4 y 4.

#include <graphics.h>

#include <conio.h>

#include <stdlib.h>

#include <math.h>

int xmin=-4, xmax=4, ymin=-4, ymax=4;

float xdens, ydens, hfi=0.00001;

// Функция r=r(fi)

float r(float fi)

{

return (float)(2*(1-cos(fi)));

}

// Вычисление экранной x координаты

int ex(float x,float y)

{

return (int) ((x-xmin)/xdens);

}

// Вычисление экранной y координаты

int ey(float x,float y)

{

return (int) ((ymax-y)/ydens);

}

// Вычисление координаты x

float fx(float fi)

{

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

}

// Вычисление координаты y