30 Дек

ИСПОЛЬЗОВАНИЕ АЛГОРИТМА БРЕЗЕНХЕМА ДЛЯ ПОСТРОЕНИЯ ЗАДАННОЙ ФИГУРЫ




Номер части:
Оглавление
Содержание
Журнал
Выходные данные


Науки и перечень статей вошедших в журнал:

//программа написана на языке программирования 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. Построение заданной фигуры по алгоритму Брезенхема

 

Литература:

  1. Роджерс Д. Алгоритмические основы машинной графики. /Пер. с англ. С.А.Вичеса, Г.В.Олохтоновой и П.А.Монахова/ под редакцией Ю.М.Баяковского и В.А.Галактионова-М.: Мир, 1989.-512с.: ил.
    . Для устранения ступенчатости при построении линейных функций (линий), а также конических сечений(окружностей, эллипсов, парабол, гипербол) можно воспользоваться алгоритмом Брезенхема.» author=»Ананьева Марина Алексеевна» publisher=»БАСАРАНОВИЧ ЕКАТЕРИНА» pubdate=»2017-01-04″ edition=»euroasia-science.ru_29-30.12.2015_12(21)» ebook=»yes» ]