Пользователь
Регистрация: 12.11.2012
Сообщений: 11
|
Компьютерная графика в C++ Builder
Добрый день! Используя алгоритм заполнения, закрасить область внутри многоугольника. В примере генерация точек отрезка реализуется по алгоритму симметричного ЦДА (Цифровые дифференциальные анализаторы), а заполнение областей - по алгоритму с затравкой с использованием рекурсии.
Код:
#include<vcl.h>
#include <stdlib.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int algor=1;
int maxX, maxY; // размеры окна
int x0, y0; //Координаты центра системы координат
class Pnt // класс точки плоскости с целыми координатами
{
public:
int x, y;
int operator<(Pnt p2); // операции над точками
Pnt operator=(Pnt p2);
int operator==(Pnt p2);
};
int Pnt::operator<(Pnt p2) // отношение лексикографического порядка
{
if (y<p2.y) return 1;
else if (y==p2.y) return (x<p2.x);
return 0;
}
Pnt Pnt::operator=(Pnt p2) // операция присваивания
{
x=p2.x; y= p2.y;
return *this;
}
int Pnt::operator==(Pnt p2) // операция сравнения точек
{
return (x==p2.x&&y==p2.y);
}
Pnt p[5]; //вершины многоугольника
// функция вывода прямолинейного отрезка
void line(int x0, int y0,int x1, int y1)
{
Form1->Image1->Canvas->MoveTo(x0,y0);
Form1->Image1->Canvas->LineTo(x1,y1);
}
int getpixel(int x, int y) // функция чтения цвета точки
{
return Form1->Image1->Canvas->Pixels[x][y]; // чтение точки
}
void putpixel(int x, int y, int color) // запись точки
{
Form1->Image1->Canvas->Pixels[x][y]=(TColor)color;
}
// Вывод пиксела на экран
void point(int x, int y)
{
TColor color = clBlack;
Form1->Image1->Canvas->Pixels[x][y]=(TColor)color;
}
// Метод симметричного ЦДА
void symcda(int x0, int y0, int x1, int y1)
{
int res_x=512, res_y=512; // Инициализация аккумуляторов
int x=x0, y=y0; // Начало отрезка
int dx=x1-x0, dy=y1-y0;
point (x,y); // Выводим первый пиксел
while (!(x==x1 && y==y1)) // Цикл пока не дойдем до конца отрезка
{
res_x+=dx;
//Проверка аккумулятора
if (res_x>=1024)
{
x++; point(x,y); res_x-=1024;
} else
if (res_x<0)
{
x--; point(x,y); res_x+=1024;
}
res_y+=dy;
//Проверка аккумулятора
if (res_y>=1024)
{
y++; point(x,y); res_y-=1024;
} else
if (res_y<0)
{
y--; point(x,y); res_y+=1024;
}
}
}
void Polyf(Pnt *p, int n) // вывод границы многоугольника
{
int i;
Form1->Image1->Canvas->MoveTo(p[0].x,p[0].y);
for(i=0; i<=n; i++)
Form1->Image1->Canvas->LineTo(p[i%n].x,p[i%n].y);
}
//Построчный алгоритм с затравкой с использованием рекурсии
void flrec(int color, int bkcolor, int x, int y)
{
int minX=0, minY=0;
int xleft=x, xright=x, yy;
if (getpixel(x,y)==color||getpixel(x,y)==bkcolor) return;
if (y>maxY||y<minY) return;
if (x>maxX||x<minX) return;
while (getpixel(xleft,y)!=color&& xleft>=minX)
putpixel(xleft--,y,bkcolor);
xright++;
while (getpixel(xright,y)!=color&& xright<=maxX)
putpixel (xright++,y,bkcolor);
for (yy=y-1; yy<=y+1; yy+=2)
{
x=xleft+1;
while (x<xright&&x<maxX)
{
if (getpixel(x,yy)!=color&&getpixel(x,yy)!=bkcolor)
flrec(color,bkcolor,x,yy);
x++;
}
}
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
maxX = Form1->Image1->Width;
maxY = Form1->Image1->Height;
algor=1;
putpixel(maxX/2,maxY/2,clRed);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//вывод многоугольника
symcda(150, 200, 250, 100);
symcda(250, 100, 350, 200);
symcda(350, 200, 300, 300);
symcda(300, 300, 200, 300);
symcda(200, 300, 150, 200);
int savemode, savecolor;
p[5].x=p[0].x; p[5].y=p[0].y;
savecolor=Form1->Image1->Canvas->Pen->Color;
savemode=Form1->Image1->Canvas->Pen->Mode;
switch (algor)
{
Polyf (p, 5);
flrec(0, 0, 170, 200);
break;
}
Form1->Image1->Canvas->Pen->Mode=savemode;
Form1->Image1->Canvas->Pen->Color=savecolor;
}
Необходимо подправить код программы, чтобы генерация точек отрезка реализовалась по алгоритму метода приращений.
Последний раз редактировалось Stilet; 07.01.2013 в 13:56.
|