#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. Разработать программу, которая выводит на экран график функции r =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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.