ТЕХНИЧЕСКИЕ НАУКИ
ИСПОЛЬЗОВАНИЕ АЛГОРИТМА БРЕЗЕНХЕМА ДЛЯ ПОСТРОЕНИЯ _ЗАДАННОЙ ФИГУРЫ
Ананьева Марина Алексеевна,
старший преподаватель кафедры прикладной математики Московский Государственный Университет информационных технологий, радиотехники и электроники МИРЭА
г. Москва
USE OF ALGORITHM BREZENSHEIM FOR KNOWLEDGE SETING FIGURE
Ananieva Marina Alekseevna, older teacher of chair application mathematics of Moskow State University information technology, radio-technology and electron-ics MIREA, MOSCOW АННОТАЦИЯ
В компьютерной графике рассматриваются растровые алгоритмы. Приводится программа построения заданной фигуры по алгоритму Брезенхема. При построении заданной фигуры используются (сплошные линии, пунктирные линии), окружность, эллипс. Алгоритмы растровой развёртки линии, окружности, эллипса описывается в [1]. Для устранения ступенчатости при построении линейных функций (линий), а также конических сечений (окружностей, эллипсов, парабол, гипербол) можно воспользоваться алгоритмом Брезен-хема .
ABSTRACT
In computer graphics consider bit-mapped algorithms. Result in program knowledge of setting figure by Brezenshem's algorithm .When acquisition of fig-ure use(solid lines, stroke lines), circle, ellipse. The algorithm bit-mapped scan lines, circle, ellipse describe in[1].For removal jagging by construction linear function(line), a also canonical bifurcation(circle, ellipse, parabola, giperbola) one can use from algorithm Brezenshema . Ключевые слова: алгоритм Брузенхема Keyword: Brezenshem's algorithm
//программа написана на языке программирования C++Builder6
#include <vcl.h>
#pragma hdrstop
#include<math.h>
#define C_M Canvas->MoveTo
#define C_L Canvas->LineTo
#define C_P Canvas->Pixels
#define C_P_C Canvas->Pen->Color
#define C_P_W Canvas->Pen->Width
#define C_T Canvas->TextOutA
#define C_P Canvas->Pixels
#define R_B RGB(200,200,200)
#define cW clWhite
#define cB clBlack
#define cG clGreen
#include «P_br.h»
//.......................................................................
{ }
//-------
#pragma package(smart_init) #pragma resource «*.dfm» TForm1 *Form1; int mx=30,my=30;
//......................................
void_fastcall TForm1::ShowGrid(int cenx)
{int x,y;
C_P_C=(TColor)R_B; //горизонтальные линии сетки for(y=0;y<=19*my;y+=my) { C_M(0,y); C_L(28*mx,y);} //вертикальные линии сетки for(x=0;x<=28*mx;x+=mx) { C_M(x,0); C_L(x,19*my); }
}
//..........................................................
_fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
void_fastcall TForm1::XoY(int cenx, int ceny)
{//оси //ось X C_P_W=2;
C_M(cenx-13.5*mx,ceny); C_L(cenx+13.5*mx,ceny); //стрелка
C_M(cenx+13*mx,ceny-0.25*my);
C_L(cenx+13.5*mx,ceny);
C_L(cenx+13*mx,ceny+0.25*my);
C_T(cenx+13*mx,ceny-1*my,»X»); //ось Y
C_M(cenx,ceny-9.4*my); C_L(cenx,ceny+9.4*my); //стрелка
C_M(cenx-0.25*mx,ceny-8.9*my); C_L(cenx,ceny-9.4*my); C_L(cenx+0.25*mx,ceny-8.9*my); C_T(cenx+0.5*mx,ceny-9.5*my,»Y»);
C_P_W=1; }
//...............................................
int TForm1::Sign(int n) {if (n>0) return 1; else if (n==0)return 0; else if (n<0) return -1;}
//..............................
void_fastcall TForm1::BrezenhemLine(int x1, int y1,
int x2, int y2,int color)
{int dx,dy,sx,sy,flag,e,x,y,buf; //инициализация переменных dx=abs(x1-x2); dy=abs(y2-y1); sx=Sign(x2-x1); sy=Sign(y2-y1); x=x1; y=y1;
// обмен значений dx и dy в зависимости от углового // коэффициэнта наклона отрезка flag=0; if (dy>dx) { buf=dx; dx=dy; dy=buf; flag=1;}
// инициализация ошибки с поправкой на половину пиксела
e=2*dy-dx; // основной цикл for(int i=0;i<=dx;++i) { C_P[x][y]=(TColor)color; if (e>=0) { if (flag==1) x+=sx; else y+=sy; e-=2*dx;
}
if (flag==1) y+=sy; else x+=sx; e+=2*dy;
}
}
//......................................................................
void_fastcall TForm1::DrawArc(int cenx, int ceny, int
radx, int rady,bool dot-ted,int color) {int x,y; int a2,b2,d,e; x=0;y=rady; if (radx==rady) { a2=1;b2=1;} else
{ a2=radx*radx; b2=rady*rady; }
d=b2-2*a2*rady+a2; e=0;
int counter=0; while (y>=0)
{if (dotted && ((counter %20) !=9) && ((counter %20) !=10) && ((counter % 20) !=11)) DrawDot(cenx,ceny,x,y,color); if (!dotted) DrawDot(cenx,ceny,x,y,color); ++counter;
//ошибка для случая 1 или2 e=2*(d+a2*y)-a2; if (d<0 && e<=0) {//шаг mh ++x;
d+=2*b2*x+b2; continue; } //ошибка для случая 4 или 5 e=2*(d-b2*x)-b2; //шаг mv if(d>0 && e>0)
{--y;
d+=a2-2*a2*y;
continue; }
//шаг md ++x;
d+=2*(b2*x-a2*y)+a2+b2; --y;
}
}
//-.....................................................................
void_fastcall TForm1::DrawDot(int cenx, int ceny, int
x, int y,int color)
{ C_P[cenx+x][ceny+y]=(TColor)color; C_P[cenx+x][ceny-y]=(TColor)color; C_P[cenx-x][ceny+y]=(TColor)color; C_P[cenx-x][ceny-y]=(TColor)color;} //-.....................................................................
void_fastcall TForm1::DrawArc_1(int cenx, int ceny,
int radx, int rady, bool dotted, int color) {int x,y; int a2,b2,d,e; x=0;y=rady; if (radx==rady) {a2=1; b2=1;} else
{a2=radx*radx; b2=rady*rady; } d=b2-2*a2*rady+a2; e=0;
int counter=0; while (y>=0)
{if (!dotted && (counter % 10==0)) DrawDot_1(cenx,ceny,x,y,color); ++counter;
//ошибка для случая 1 или2 e=2*(d+a2*y)-a2; if (d<0 && e<=0) {//шаг mh ++x;
d+=2*b2*x+b2; continue;
}
//ошибка для случая 4 или 5
e=2*(d-b2*x)-b2;
//шаг mv
if(d>0 && e>0) {--y;
d+=a2-2*a2*y;
continue; }
//шаг md ++x;
d+=2*(b2*x-a2*y)+a2+b2; --y;
}
}
//---------------------------------------
void_fastcall TForm1::DrawDot_1(int cenx, int ceny,
int x, int y, int color)
{C_P[cenx+x][ceny+y]=(TColor)color; C_P[cenx+x][ceny-y]=(TColor)color; C_P[cenx-x][ceny+y]=(TColor)color; C_P[cenx-x][ceny-y]=(TColor)color; BrezenhemLine(cenx-x,ceny-y,cenx+x,ceny-y,cG); BrezenhemLine(cenx-x,ceny+y,cenx+x,ceny+y,cG); BrezenhemLine(cenx-x,ceny-y,cenx-x,ceny+y,cG); BrezenhemLine(cenx+x,ceny-y,cenx+x,ceny+y,cG);} //----------------------------------------------------------------------
void_fastcall TForm1::FormPaint(TObject *Sender)
{Color=(TColor)cW;
int xc=14*mx,yc=9.5*my,r1=2.5*my;
int a=7.5*mx,b=4*my;
ShowGrid(xc);
//построение окружности
DrawArc(xc,yc,r1,r1,false,cG);
DrawArc(xc+1,yc+1,r1,r1,false,cG);
DrawArc(xc+1,yc-1,r1,r1,false,cG);
//построение эллипсов
DrawArc(xc-5*mx,yc,a,b,true,cB);
DrawArc(xc+5*mx,yc,a,b,true,cB);
//построение линий
//наклонные линии
//1
BrezenhemLine(xc,yc-8.5*my,xc-12.5*mx,yc,cB);
BrezenhemLme(xc-1,yc-8.5*my+1,xc-12.5*mx-1,ус+1,сВ);
BrezenhemLme(xc-1,yc-8.5*my+2,xc-12.5*mx-1,ус+2,сВ);
//2
BrezenhemLine(xc,yc-8.5*my,xc+12.5*mx,yc,cB);
BrezenhemLine(xc-1,yc-8.5*my+1,xc+12.5*mx-1,ус+1,сВ);
BrezenhemLine(xc-1,yc-8.5*my+2,xc+12.5*mx-1,ус+2,сВ);
//3
BrezenhemLine(xc-12.5*mx,yc,xc,yc+8.5*my,cB);
BrezenhemLine(xc-12.5*mx-1 ,ус + 1 , хс-1,ус+8.5*ту+1,сВ);
BrezenhemLine(xc-12.5*mx-1,yc + 2,xc-1,ус+8.5*ту+2,сВ);
//4
BrezenhemLine(xc+12.5*mx,yc,xc,yc+8.5*my,cB);
BrezenhemLine(xc+12.5*mx-1 ,ус+1 , хс-1,ус+8.5*ту+1,сВ);
BrezenhemLine(xc+1 2.5*тх-1 , у с + 2 , хс-1,ус+8.5*ту+2,сВ);
//вертикальные линии
BrezenhemLine(xc-5*mx,yc-4*my,xc-5*тх,ус+4*ту,сВ);
BrezenhemLine(xc+5*mx,yc-4*ту,хс+5*тх,ус+4*ту,сВ);
//штриховка
DrawArc_1(xc,yc,r1,r1,false,cG);
С_Р_С=(ТСо1ог)сВ;
XoY(xc,yc);
}
//-.....................................................................
Рисунок 1. Заданная фигура
Литература: и П.А.Монахова/ под редакцией Ю.М.Баяковского и
1. Роджерс Д. Алгоритмические основы машинной В.А.Галактионова-М.: Мир, 1989.-512с.: ил. графики. /Пер. с англ. С.А.Вичеса, Г.В.Олохтоновой