Перейти к содержимому



Класс работы с графическими примитивами С++

графические примитивы win32

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 admin

admin

    Администратор

  • Администраторы
  • 76 сообщений

Отправлено 20 Февраль 2012 - 16:51

Класс для приложения Win32 Project в Visual C++.
Использованы алгоритмы Брезенхэма и метод построчного сканирования.

class Graph {
HDC *hdc;
int color, bgcolor;
public:
Graph(HDC *hdc)
{
this->hdc = hdc;
color = RGB(0,0,0);
bgcolor = RGB(255,255,255);
}
void setcolor(int color)
{
this->color = color;
}
void setbg(int color)
{
bgcolor = color;
}
void line(int x1, int y1, int x2, int y2)
{
const int deltaX = abs(x2 - x1);
const int deltaY = abs(y2 - y1);
const int signX = x1 < x2 ? 1 : -1;
const int signY = y1 < y2 ? 1 : -1;
//
int error = deltaX - deltaY;
//
SetPixel(*hdc, x2, y2, color);
while(x1 != x2 || y1 != y2) {
		 SetPixel(*hdc, x1, y1, color);
const int error2 = error * 2;
//
if(error2 > -deltaY) {
			 error -= deltaY;
	x1 += signX;
}
if(error2 < deltaX) {
			 error += deltaX;
	y1 += signY;
	}
}

}
void circle(int x0, int y0, int radius)
{
		int x = 0;
		int y = radius;
		int delta = 2 - 2 * radius;
		int error = 0;
		while(y >= 0) {
				SetPixel(*hdc, x0 + x, y0 + y, color);
				SetPixel(*hdc, x0 + x, y0 - y, color);
				SetPixel(*hdc, x0 - x, y0 + y, color);
				SetPixel(*hdc, x0 - x, y0 - y, color);
				error = 2 * (delta + y) - 1;
				if(delta < 0 && error <= 0) {
						++x;
						delta += 2 * x + 1;
						continue;
				}
				error = 2 * (delta - x) - 1;
				if(delta > 0 && error > 0) {
						--y;
						delta += 1 - 2 * y;
						continue;
				}
				++x;
				--y;
				delta += 2 * (x - y + 1);
		}
}
private:
int linefill(int x, int y, int dir, int PrevX1, int PrevXr)
{
int scolor;
int x1=x;
int xr=x;
int c;
do {
c = GetPixel(*hdc,--x1,y);
} while((c!=bgcolor)&&(c!=color));

do {
c = GetPixel(*hdc,++xr,y);
} while((c!=bgcolor)&&(c!=color));

x1++;
xr--;

scolor = color;
color = bgcolor;
line(x1,y,xr,y);
color = scolor;
for(x=x1;x<=xr;x++)
{
c=GetPixel(*hdc,x,y+dir);
if((c!=bgcolor) &&(c!=color))
	x=linefill(x,y+dir,dir,x1,xr);
}
for(x=x1;x<PrevX1;x++)
{
c=GetPixel(*hdc,x,y-dir);
if((c!=bgcolor) &&(c!=color))
	x=linefill(x,y-dir,-dir,x1,xr);
}
for(x=PrevXr;x<xr;x++)
{
c=GetPixel(*hdc,x,y-dir);
if((c!=bgcolor) &&(c!=color))
	x=linefill(x,y-dir,-dir,x1,xr);
}
return xr;
}
public:
void fill(int x,int y)
{
linefill(x, y, 1, x, x);
}

};


использовать в обработчике WM_PAINT


пример:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
gr->setcolor(RGB(255,0,0));
gr->line(50,100,500,150);
gr->circle(250,250,200);
gr->setbg(RGB(0,255,0));
gr->fill(250,250);
gr->setbg(RGB(0,0,0));
gr->fill(250,100);
gr->setcolor(RGB(0,0,0));

gr->line(50,100,500,150);
gr->line(170,350,330,350);
gr->circle(170,180,40);
gr->circle(330,180,40);
gr->setbg(RGB(255,255,255));
gr->fill(170,180);
gr->fill(330,180);

EndPaint(hWnd, &ps);
break;





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей

Рейтинг@Mail.ru