Генерация точек отрезка по алгоритму простого ЦДА, заполнение областей по алгоритму с использованием режима вывода XOR_PUT

Страницы работы

Содержание работы

Министерство образования и науки РФ

ГОУВПО «Комсомольский-на-Амуре государственный технический университет»

Кафедра МОП ЭВМ

Лабораторная работа №2

По дисциплине «Компьютерная графика»

Выполнил: Николусь П. А.

Группа: 4ВС-1

Проверила: Михайлова Н.Н.

Комсомольск-на-Амуре

2006

Вариант 14

Генерация точек отрезка по алгоритму простого ЦДА, заполнение

областей по алгоритму с использованием режима вывода XOR_PUT.

Задание. Используя алгоритм простого ЦДА, построить два многоугольника, один из которых расположен внутри другого. Закрасить область между границами многоугольников с помощью алгоритма заполнения с использованием режима вывода 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 с.

Похожие материалы

Информация о работе