Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2013, 10:00   #1
Starget-93
Пользователь
 
Регистрация: 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.
Starget-93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компьютерная графика Truepak Помощь студентам 3 05.12.2012 17:51
Компьютерная графика motaro Фриланс 2 26.12.2011 18:20
Компьютерная графика F1nk Помощь студентам 0 17.03.2011 14:47
компьютерная графика Черная тень Паскаль, Turbo Pascal, PascalABC.NET 6 11.01.2009 07:29