Министерство образования и науки РФ
ГОУВПО «Комсомольский-на-Амуре государственный технический университет»
Кафедра МОП ЭВМ
Лабораторная работа №2
По дисциплине «Компьютерная графика»
Выполнил: Николусь П. А.
Группа: 4ВС-1
Проверила: Михайлова Н.Н.
Комсомольск-на-Амуре
2006
Генерация точек отрезка по алгоритму простого ЦДА, заполнение
областей по алгоритму с использованием режима вывода XOR_PUT.
Задание. Используя алгоритм простого ЦДА, построить два многоугольника, один из которых расположен внутри другого. Закрасить область между границами многоугольников с помощью алгоритма заполнения с использованием режима вывода XOR_PUT.
Листинг программы:
TCanvas *DC;
int maxX, maxY, red, green, blue;
void pcda(int, int, int, int);
void __fastcall TForm1::ReSize(TObject *Sender)
{
DC = Form1->Canvas;
int i, j;
maxX = Form1->ClientWidth, maxY = Form1->ClientHeight;
DC->Pen->Width = 2;
DC->Pen->Mode = pmXor;
DC->Pen->Color = RGB(red, green, blue);
TRect rect;
rect.left = 0;
rect.right = maxX;
rect.top = 0;
rect.bottom = maxY;
DC->FillRect(rect);
int polygon1[2][5] = {0.15 * maxX, 0.11 * maxX, 0.50 * maxX, 0.8 * maxX, 0.68 * maxX,
0.21 * maxY, 0.50 * maxY, 0.8 * maxY, 0.80 * maxY, 0.03 * maxY};
int polygon2[2][4] = {0.19 * maxX, 0.53 * maxX, 0.7 * maxX, 0.42 * maxX,
0.38 * maxY, 0.75 * maxY, 0.25 * maxY, 0.2 * maxY};
for (i = 0; i < 5; ++i)
pcda(polygon1[0][i], polygon1[1][i], polygon1[0][(i + 1) % 5],
polygon1[1][(i + 1) % 5]);
for (i = 0; i < 4; ++i)
pcda(polygon2[0][i], polygon2[1][i], polygon2[0][(i + 1) % 4],
polygon2[1][(i + 1) % 4]);
}
//--------------------------------------------------------------------------void pcda(int x0, int y0, int x1, int y1)
{
int n, curx = x0, cury = y0, i;
float dx, dy, mem = 0.5;
n = abs(x1 - x0);
if (n < abs(y1 - y0))
n = abs(y1 - y0);
dx = (0. + x1 - x0) / n;
dy = (0. + y1 - y0) / n;
if (dx == 1 || dx == -1)
{
for (i = 0; i < n; ++i)
{
DC->MoveTo(curx, cury);
DC->LineTo(curx, cury);
curx += dx;
mem += dy;
DC->Pen->Width = 1;
if (mem >= 1)
{
mem -= 1;
cury += 1;
DC->MoveTo(curx + 1, cury);
DC->LineTo(maxX, cury);
}
else if (mem < 0)
{
DC->MoveTo(curx + 1, cury);
DC->LineTo(maxX, cury);
mem +=1;
cury -= 1;
}
DC->Pen->Width = 2;
}
}
else
{
for (i = 0; i < n; ++i)
{
DC->MoveTo(curx, cury);
DC->LineTo(curx, cury);
DC->Pen->Width = 1;
if (dy > 0)
{
cury += dy;
DC->MoveTo(curx + 1, cury);
DC->LineTo(maxX, cury);
}
else
{
DC->MoveTo(curx + 1, cury);
DC->LineTo(maxX, cury);
cury += dy;
}
DC->Pen->Width = 2;
mem += dx;
if (mem >= 1)
{
mem -= 1;
curx += 1;
}
else if (mem < 0)
{
mem +=1;
curx -= 1;
}
}
}
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Edit1->Text = 0 ;
Form1->Edit2->Text = 255;
Form1->Edit3->Text = 255;
}
Выполнение программы:
Список литературы:
1. Хусаинов А.А., Михайлова Н.Н. Алгоритмы машинной графики и их реализация на языке Си: Учеб. пособие. – Комсомольск-на-Амуре: Комсомольский-на-Амуре гос. техн. ун-т, 1999. – 65 с.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.