Номер части:
Журнал
ISSN: 2411-6467 (Print)
ISSN: 2413-9335 (Online)
Статьи, опубликованные в журнале, представляется читателям на условиях свободной лицензии CC BY-ND

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



Науки и перечень статей вошедших в журнал:
DOI:
Дата публикации статьи в журнале:
Название журнала: Евразийский Союз Ученых — публикация научных статей в ежемесячном научном журнале, Выпуск: , Том: , Страницы в выпуске: -
Данные для цитирования: . ИСПОЛЬЗОВАНИЕ АЛГОРИТМА БРЕЗЕНХЕМА ДЛЯ ПОСТРОЕНИЯ ЗАДАННОЙ ФИГУРЫ // Евразийский Союз Ученых — публикация научных статей в ежемесячном научном журнале. Технические науки. ; ():-.

//программа написана на языке программирования 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с.: ил.[schema type=»book» name=»ИСПОЛЬЗОВАНИЕ АЛГОРИТМА БРЕЗЕНХЕМА ДЛЯ ПОСТРОЕНИЯ ЗАДАННОЙ ФИГУРЫ» description=»В компьютерной графике рассматриваются растровые алгоритмы. Приводится программа построения заданной фигуры по алгоритму Брезенхема. При построении заданной фигуры используются (сплошные линии, пунктирные линии), окружность, эллипс. Алгоритмы растровой развёртки линии, окружности, эллипса описывается в [1]. Для устранения ступенчатости при построении линейных функций (линий), а также конических сечений(окружностей, эллипсов, парабол, гипербол) можно воспользоваться алгоритмом Брезенхема.» author=»Ананьева Марина Алексеевна» publisher=»БАСАРАНОВИЧ ЕКАТЕРИНА» pubdate=»2017-01-04″ edition=»euroasia-science.ru_29-30.12.2015_12(21)» ebook=»yes» ]
Список литературы:


Записи созданы 9819

Похожие записи

Начните вводить, то что вы ищите выше и нажмите кнопку Enter для поиска. Нажмите кнопку ESC для отмены.

Вернуться наверх
404: Not Found404: Not Found