Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Page 163_192.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
363.01 Кб
Скачать

Задание для самостоятельной работы

Измените программу так, чтобы:

1. Увеличить/уменьшить скорость перемещения прямоугольника по экрану.

2. При передвижении прямоугольника по экрану за ним "тянулся след", т.е. должен быть виден весь предыдущий маршрут. Включение/выключение "следа" должно производиться нажатием какой-либо клавиши (например, пробела).

3. Предусмотрите возможность смены цвета прямоугольника в процессе движения, например по нажатию функциональных клавиш (несколько различных цветов).

4. Обеспечьте возможность прокрутки (скроллинга) изображения, т.е. при достижении прямоугольником края экрана он должен плавно перейти на противоположный край.

Задача b

Получить на экране картину "звездного неба", причем заполнение экрана должно производиться в два приема: сначала верхняя часть экрана, затем нижняя.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#define BGIPATH "c:\\borlandc\\bgi"

void Initialize ();

void Pixel ();

int GraphDriver, GraphMode, MaxX, MaxY, MaxColors, ErrorCode;

int main ()

{

Initialize ();

Pixel ();

closegraph ();

return (0);

}

void Initialize ()

{

GraphDriver = DETECT; // Автоопределение типа используемого

// графического адаптера

initgraph (&GraphDriver, &GraphMode, BGIPATH);

ErrorCode = graphresult ();

if(ErrorCode != grOk)

{

printf ("Ошибка инициализации: %s\n",

grapherrormsg ( ErrorCode ) );

exit (1);

}

MaxColors = getmaxcolor () + 1;

MaxX = getmaxx (); MaxY = getmaxy ();

}

void Pixel ()

{

int seed = 1000;

int x, y, h, w, color;

long int i;

cleardevice ();

// Вывод в верхней части экрана

srand (seed);

// Вывести 20000 пикселов на экран

for (i=0 ; i<20000 ; ++i)

{

// Получить координаты очередного пиксела

x = 1 + random (MaxX - 1);

y = 1 + random (MaxY/2 - 1);

// Выбор цвета и вывод пиксела на экран

color = random (MaxColors);

putpixel (x, y, color);

}

// Вывод в нижней части экрана с использованием отсечки

setviewport (0, MaxY/2, MaxX, MaxY, 1);

rand (seed);

for (i=0; i<20000; ++i)

{

x = 1 + random (MaxX - 1);

y = 1 + random (MaxY - 1);

color = random (MaxColors);

putpixel (x, y, color);

}

getch ();

}

Задание для самостоятельной работы

1. Объясните, почему число пикселов, выведенных в верхнюю часть экрана, больше числа пикселов, выведенных в нижнюю часть экрана. Как выравнять эти числа?

2. Измените программу так, чтобы в процессе вывода пикселов на экран после нажатия на определенную клавишу начался обратный процесс - гашение пикселов. Подумайте, как эффективно(!) можно проверить, все ли пикселы на экране погашены.

Задача c

Построить кривые Гильберта порядка N. Принцип построения кривых Гильберта поясняет следующий рисунок.

#include<conio.h>

#include<stdio.h>

#include<graphics.h>

#define H0 500 // Начальная величина соединительной линии

int N, x, y, h;

void A (int );

void B (int );

void C (int );

void D (int );

#define incX x+=h; lineto(x, y)

#define incY y+=h; lineto(x, y)

#define decX x-=h; lineto(x, y)

#define decY y-=h; lineto(x, y)

void A (int i)

{ if (i>0)

{ D(i-1); decX;

A(i-1); incY;

A(i-1); incX;

B(i-1);

}

}

void B (int i)

{ if (i>0)

{ C(i-1); decY;

B(i-1); incX;

B(i-1); incY;

A(i-1);

}

}

void C (int i)

{ if (i>0)

{ B(i-1); incX;

C(i-1); decY;

C(i-1); decX;

D(i-1);

}

}

void D (int i)

{ if (i>0)

{ A(i-1); incY;

D(i-1); decX;

D(i-1); decY;

C(i-1);

}

}

void main()

{

int gd, gm, i;

begin:

clrscr();

textcolor(WHITE);

textbackground(BLACK);

cputs("Каков порядок кривой? ( не выше 7 ) >> ");

cscanf("%d", &N); getch();

cputs("\n\r По нажатию клавиши будут рисоваться кривые Гильберта");

cprintf("\n\r порядков 1,...,%d", N);

textcolor(GREEN);

cputs("\n\n\r Нажмите Вашу любимую клавишу...\n\r");

getch();

detectgraph(&gd, &gm);

initgraph(&gd, &gm, "e:\\borlandc\\bgi");

i=0; h=H0;

do

{ setcolor(i+1);

x=getmaxx()/2+150; y=getmaxy()/2-240;

i++;

h/=2;

x+=h/2; y+=h/2;

moveto(x,y); // Отсюда начинаем рисовать кривую

A(i); getch(); cleardevice();

}

while (i<N);

closegraph();

puts("Повторим?");

if(getch()=='y') goto begin;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]