//программа написана на языке программирования C++Builder6
#include <vcl.h>
#pragma hdrstop
#include<math.h>
#define C_M Canvas->MoveTo
#define C_L Canvas->LineTo
#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 R_G clMaroon
#include «lab4_36.h»
//—————————————————————————————————
#pragma package(smart_init)
#pragma resource «*.dfm»
TForm1 *Form1;
int mx=30,my=30;
//—————————————————————————————————
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
//—————————————————————————————————
void __fastcall TForm1::ShowGrid(int cenx)
{int x,y;
C_P_C=(TColor)R_B;
//горизонтальные линии сетки
for(y=0;y<=18*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,18*my);}}
//—————————————————————————————————-
void __fastcall TForm1::XoY(int cenx, int ceny)
{//оси
//ось X
C_P_W=2;
C_M(cenx-9*mx,ceny);C_L(cenx+9*mx,ceny);
//стрелка
C_M(cenx+8.5*mx,ceny-0.25*my);C_L(cenx+9*mx,ceny);
C_L(cenx+8.5*mx,ceny+0.25*my);C_T(cenx+8.5*mx,ceny-1*my,»X»);
//ось Y
C_M(cenx,ceny-8.8*my);C_L(cenx,ceny+8.8*my);
//стрелка
C_M(cenx-0.25*mx,ceny-8.3*my);C_L(cenx,ceny-8.8*my);
C_L(cenx+0.25*mx,ceny-8.3*my);C_T(cenx+0.5*mx,ceny-8.9*my,»Y»);
C_P_W=1;}
//————————————————————————————————
void __fastcall TForm1::line(int x1, int y1, int x2, int y2,int color)
{int x,y,dx,dy,sx,sy,d,d1,d2,e,e2;
dx=abs(x2-x1);dy=abs(y2-y1);
sx=x1<x2?1:-1;sy=y1<y2?1:-1;
e=dx-dy;
for(;;)
{C_P[x1][y1]=(TColor)color;
if (x1==x2 && y1==y2) break;
e2=e*2;
if (e2>-dy)
{ e-=dy; x1+=sx; }
if (e2<dx)
{ e+=dx; y1+=sy; } }}
//————————————————————————————————
void __fastcall TForm1::DrawArc(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 %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 % 8==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;
line(cenx-x,ceny-y,cenx-x,ceny,R_G);
line(cenx+x,ceny,cenx+x,ceny-y,R_G);}
//———————————————————————————————
void __fastcall TForm1::DrawArc_2(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 % 8==0)) DrawDot_2(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_2(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;
line(cenx-x,ceny,cenx-x,ceny+y,R_G);
line(cenx+x,ceny,cenx+x,ceny+y,R_G);}
//——————————————————————————————————
void __fastcall TForm1::FormPaint(TObject *Sender)
{Color=(TColor)cW;
int xc=14*mx,yc=9*my,r1=8*my,i;
int a=8*mx,b=3.5*my,a1=5.25*mx,b1=1.5*my;
ShowGrid(xc);
DrawArc(xc,yc,r1,r1,true,cB);
DrawArc(xc,yc,a,b,false,cB);
DrawArc(xc,yc-5.75*my,a1,b1,false,R_G);
DrawArc(xc+1,yc-5.75*my+1,a1,b1,false,R_G);
DrawArc(xc+1,yc-5.75*my-1,a1,b1,false,R_G);
DrawArc(xc,yc+5.75*my,a1,b1,false,R_G);
DrawArc(xc+1,yc+5.75*my+1,a1,b1,false,R_G);
DrawArc(xc+1,yc+5.75*my-1,a1,b1,false,R_G);
//наклонные линии
//1
line(xc-7.2*mx,yc-3.5*my,xc+7.2*mx,yc+3.5*my,R_G);
line(xc-7.2*mx-1,yc-3.5*my+1,xc+7.2*mx-1,yc+3.5*my+1,R_G);
line(xc-7.2*mx-1,yc-3.5*my+2,xc+7.2*mx-1,yc+3.5*my+2,R_G);
//2
line(xc+7.2*mx,yc-3.5*my,xc-7.2*mx,yc+3.5*my,R_G);
line(xc+7.2*mx-1,yc-3.5*my+1,xc-7.2*mx-1,yc+3.5*my+1,R_G);
line(xc+7.2*mx-1,yc-3.5*my+2,xc-7.2*mx-1,yc+3.5*my+2,R_G);
//горизонтальные линии
//1
line(xc-7.2*mx,yc-3.5*my,xc+7.2*mx,yc-3.5*my,R_G);
line(xc-7.2*mx-1,yc-3.5*my-1,xc+7.2*mx-1,yc-3.5*my-1,R_G);
line(xc-7.2*mx-1,yc-3.5*my+1,xc+7.2*mx-1,yc-3.5*my+1,R_G);
//2
line(xc-7.2*mx,yc+3.5*my,xc+7.2*mx,yc+3.5*my,R_G);
line(xc-7.2*mx-1,yc+3.5*my-1,xc+7.2*mx-1,yc+3.5*my-1,R_G);
line(xc-7.2*mx-1,yc+3.5*my+1,xc+7.2*mx-1,yc+3.5*my+1,R_G);
//3
line(xc-5.35*mx,yc-5.75*my,xc+5.35*mx,yc-5.75*my,R_G);
line(xc-5.35*mx-1,yc-5.75*my-1,xc+5.35*mx-1,yc-5.75*my-1,R_G);
line(xc-5.35*mx-1,yc-5.75*my+1,xc+5.35*mx-1,yc-5.75*my+1,R_G);
//4
line(xc-5.35*mx,yc+5.75*my,xc+5.35*mx,yc+5.75*my,R_G);
line(xc-5.35*mx-1,yc+5.75*my-1,xc+5.35*mx-1,yc+5.75*my-1,R_G);
line(xc-5.35*mx-1,yc+5.75*my+1,xc+5.35*mx-1,yc+5.75*my+1,R_G);
//вертикальные линии
line(xc-7.2*mx,yc-3.5*my,xc-7.2*mx,yc+3.5*my,R_G);//1
line(xc-7.2*mx-1,yc-3.5*my-1,xc-7.2*mx-1,yc+3.5*my-1,R_G);
line(xc-7.2*mx+1,yc-3.5*my-1,xc-7.2*mx+1,yc+3.5*my-1,R_G);
line(xc+7.2*mx,yc-3.5*my,xc+7.2*mx,yc+3.5*my,R_G);//2
line(xc+7.2*mx-1,yc-3.5*my-1,xc+7.2*mx-1,yc+3.5*my-1,R_G);
line(xc+7.2*mx+1,yc-3.5*my-1,xc+7.2*mx+1,yc+3.5*my-1,R_G);
DrawArc_1(xc,yc-5.75*my,a1,b1,false,R_G);
DrawArc_2(xc,yc+5.75*my,a1,b1,false,R_G);
//штриховка
for(i=0;i<=11;i++)
{line(xc-7.2*mx,yc-3.5*my+9*i,xc-7.2*mx+18*i,yc-3.5*my+9*i,R_G);
line(xc+7.2*mx-18.5*i,yc+3.5*my-9*i,xc+7.2*mx,yc+3.5*my-9*i,R_G);}
C_P_C=(TColor)cB;
XoY(xc,yc);}
//—————————————————————————————————
Рисунок 1. Построение заданной фигуры по алгоритму Брезенхема
Литература:
- Роджерс Д. Алгоритмические основы машинной графики. /Пер. с англ. С.А.Вичеса, Г.В.Олохтоновой и П.А.Монахова/ под редакцией Ю.М.Баяковского и В.А.Галактионова-М.: Мир, 1989.-512с.: ил.[schema type=»book» name=»ИСПОЛЬЗОВАНИЕ АЛГОРИТМА БРЕЗЕНХЕМА ДЛЯ ПОСТРОЕНИЯ ЗАДАННОЙ ФИГУРЫ» description=»В компьютерной графике рассматриваются растровые алгоритмы. Приводится программа построения заданной фигуры по алгоритму Брезенхема. При построении заданной фигуры используются (сплошные линии, пунктирные линии), окружность, эллипс. Алгоритмы растровой развёртки линии, окружности, эллипса описывается в [1]. Для устранения ступенчатости при построении линейных функций (линий), а также конических сечений(окружностей, эллипсов, парабол, гипербол) можно воспользоваться алгоритмом Брезенхема.» author=»Ананьева Марина Алексеевна» publisher=»БАСАРАНОВИЧ ЕКАТЕРИНА» pubdate=»2017-01-04″ edition=»euroasia-science.ru_29-30.12.2015_12(21)» ebook=»yes» ]