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

Решения (задачи 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);
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.