Решения (задачи 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);