- •Глава 12 графика
- •1. Общие сведения
- •2. Инициализация графической системы. Обработка ошибок. Переключение режимов
- •Initgraph (&gd, &gm,"путь к bgi-файлам");
- •3. Работа с окнами и координатами
- •4. Графические примитивы
- •1 Способ:
- •2 Способ:
- •5. Включение .Bgi-драйверов в .Exe-файл
- •Примеры решения задач Задача a
- •Задание для самостоятельной работы
- •Задача b
- •Задание для самостоятельной работы
- •Задача c
- •Задание на программирование Задача 1
- •Задача 2
- •Задача 3
- •Задача 4
- •Задача 5
- •Задача 6
- •Задача 7
- •Задача 8
- •Задача 9
- •Задача 14
- •Задача 15
- •Задача 16
- •Задача 17
- •Задача 29
- •Задача 37
- •Задача 39
- •Задача 40
Задание для самостоятельной работы
Измените программу так, чтобы:
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;
}
