Решения (задачи 240-252)
Задача 251.
// Кривая Гильберта #include <graphics.h> ttinclude <stdlib.h> #include <stdio.h> #include <conio.h> #include <math.h> #include <dos.h> #define PATHTODRIVER "c:\\borlandc\\bgi\\" idefine DT 3 // задержка при выводе линий по точкам #define u 10 // величина штриха кривой Гильберта void Gilbert(int p); // вычерчивает кривую Гильбе(void) int gdriver = DETECT; // драйвер int gmode; // режим int errorcode; /7 код ошибки initgraph(&gdriver, &gmode, PATHTODRIVER); errorcode = graphresult(); if (errorcode = grOk) { outtextxy (10.10, "Кривая Гильберта…"J.Gilbert (4); outtextxy(10.25,"Для завершения нажмите Enter"); getch(); closegraph(); r } else { printf("Ошибка: %d\n", errorcode); printf("\fljiH завершения программы нажмите Enter"); getch(); } // Кривая Гильберта состоит из четырех элементов: а, b, с и d. // Каждый элемент строит соответствующая функция. void a(int i); void b(int i); void с(int i); void d(int i); void my_lineto(int x2, int y2); // вычерчивает по точкам линию! void Gilbert(int p) // p – порядок кривой Гильберта { moveto(4 50.50); a(p); // Элементы крив void a(int i) if (i > 0) { d(i-l); my_lineto (getx () – u, getyO) a(i-l); my__lineto(getx(), getyO + u) a(i-l); my_lineto (getx () + u, getyO) b(i-l); void b(int i) if (i > 0) { c(i-l); b(i-l); b(i-l); a(i-l); my_lineto (getx (), gety () – u); my lineto (getx () + u, getyO) my_lineto (getx (), gety () + u); void с(int i) if (i > 0) { b(i-l); my_lineto(getx() + u,gety()); c(i-l); my_lineto(getx (), gety() – u); c(i-l); my_lineto(getx() – u,gety()); d(i-l); void d(int i if (i > 0) { a(i-l); my_lineto (getx (), gety () + u) d(i-l); my_lineto(getx() – u,gety()) d(i-l); my_lineto (getx (), gety () – u) c(i-l); // вычерчивает по точкам линию void my_lineto(int х2, int у2) { int x1,y1; // координаты начала прямой // х2, у2 – координаты конца int х,у; // координаты текущей точки int dx; // приращение аргумента int dy; // приращение у при рисовании // вертикальной линии int color; // цвет линии int a,b; // коэф-ты уравнения прямой int n; // кол-во точек int i; xl = getx (); yl = gety(); if (xl!= x2) { //не вертикальная линия a = (У2-у1)/(х2-х1); b = y1 – a * x1; n = abs(x2-xl)+1; if (x2 > xl) dx = 1; else dx = -1; x = xl; color = getcolorO; for (i = 1; i<= n; i++) { у = a*x + b; putpixel(x,y,color); delay(DT); x += dx; else { // вертикальная линия n = abs(y2-yl); if (y2 > yl) dy = 1; else dy = -1; x = xl; у = yl; color = getcolor(); for (i = 1; i<=n; putpixel(x, y, color); delay(DT); у += dy; putpixel(x2, y2, color); moveto(x2, y2);