Иллюстрированный самоучитель по С++ для начинающих

Решения (задачи 240-252)

Задача 252.

// Кривая Серпинского
#define u 5
//Длина штриха, определяет величину кривой
Idefine DT 25 // определяет скорость вычерчивания кривой
#define PATHTODRIVER "с: WborlandcWbgiW"
#include <graphics.h>
ttinclude <stdio.h> #include <conio.h> #include <math.h>
// кривая Серпинского состоит из четырех
// элементов: a, b, end
// каждый элемент строит соответствующая функция
void a(int i);
void b(int i);
void с(int i);
void d(int i);
// вычерчивает прямую из текущей точки в заданную
// координаты конца задаются в приращениях
#define linetodxy(dx,dy) lineto(getx()+dx,gety()+dy)
void far lineto(int x2, int y2); // вычерчивает линию по
// точкам
// заменяет стандартную функцию, чтобы процесс вычерчивал элементы кривой
void a(infc i)
{
if (i > 0)
a(i-l); linetodxy(u, u);
b(i-l); linetodxy(2*u,0),
d(i-l); linetodxy(u, -u); a (i-1);
void b(int i)
{
if (i > 0)
b (i-1);linetodxy(-u,u); с(i-1);linetodxy(0, 2*u), a (i-1)/linetodxy(u,u); b(i-l);
void с(int i) {
if (i > 0)
с(i-1)/linetodxy(-u,-u); d(i-l);linetodxy(-2*u, 0); b (i-1)/linetodxy(-u,u)/ с(i-1) /
void d(int i)
if (i > 0)
d(i-l)/linetodxy(u,-u)/ a(i-1)/linetodxy(0,-2*u); с(i-1)/linetodxy(-u,-u)/
d(i-l);
void main(void) (
int gdriver = DETECT; // драйвер
int gmode; // режим
int errorcode; // код ошибки
initgraph(&gdriver, Sgmode, PATHTODRIVER); errorcode = graphresult();
if (errorcode == grOk) (
int p; // порядок кривой
puts("Программа строит кривую Серпинского.");
puts("Введите порядок кривой (1-4) и нажмите Enter");
printf(" › ");
scanf("%i", &p);
printf("Кривая Серпинского %i-ro порядка\n", р);
movetodOO, 100);
// кривая Серпинского а(р); iinetodxy(u,и);
b(р); Iinetodxy(-и,и); с(р); Iinetodxy{-и,-и); d (р); Iinetodxy (и, -и);
puts("Для завершения нажмите Enter");
getch();
closegraph();
else
printf ("Ошибка: "sdVn", errorcode);
puts("Для завершения нажмите Enter");
ch();
// вычерчивает по точкам линию
// подменим этой функцией стандартную, чтобы
// видеть процесс вычерчивания кривой
#include <dos.h>
void far linetofint x2, int y2)
int x1,y1;
int x,y;
int dx;
int dy;
int color
int a,b;
int n;
int i;
// координаты начала прямой,
// x2,y2 – координаты конца
// координаты текущей точки
// приращение аргумента
// приращение у при рисовании
// вертикальной линии
// цвет линии
// коэф-ты уравнения прямой
// кол-во точек "
xl = getx(); yl = gety(); color = getcolorO;
if (xl!= x2)
//не вертикальная линия
a = (y2-yl)/(x2-xl); b = yl – a * xl; n = abs(x2-xl)+l; if (x2 > xl)
dx = 1; else
dx = -1;
х = xl;
for (i = 1; i<= n;
у = а*х + b; putpixel(x,у,color); delay(DT); х += dx;
else // вертикальная линия
n = abs(y2-yl); if (y2 > yl)
dy = 1; else dy = -1;
x = xl; у = yl; for (i = 1; i<=n; i++)
putpixel(x, y, color); delay(DT); у += dy;
putpixel(x2, y2, color); moveto(x2, y2);
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.