31 Окт

ИСПОЛЬЗОВАНИЕ МЕТОДА СРЕДИННОЙ ТОЧКИ ДЛЯ ПОСТРОЕ-НИЯ ОТРЕЗКОВ ЛИНИЙ И ОКРУЖНОСТЕЙ




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


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

//программа написана на языке программирования 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_P Canvas->Pixels

#define C_T Canvas->TextOutA

#define R_B  RGB(200,200,200)

#define cB clBlack

#define cW clWhite

#include «Primer_M.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<=20*my;y+=my)

  {   C_M(0,y);

   C_L(16*mx,y);

  }

//вертикальные линии сетки

for(x=0;x<=16*mx;x+=mx)

  {   C_M(x,0);

   C_L(x,20*my);

  }

 }

 //—————————————————————————-

 void __fastcall TForm1::XoY(int cenx, int ceny)

{//оси

//ось X

C_P_W=2;

C_M(cenx-6*mx,ceny);

C_L(cenx+6*mx,ceny);

//стрелка

C_M(cenx+5.5*mx,ceny-0.25*my);

C_L(cenx+6*mx,ceny);

C_L(cenx+5.5*mx,ceny+0.25*my);

C_T(cenx+5.5*mx,ceny-1*my,»X»);

//ось Y

C_M(cenx,ceny-9.8*my);

C_L(cenx,ceny+10*my);

//стрелка

C_M(cenx-0.25*mx,ceny-9.5*my);

C_L(cenx,ceny-9.8*my);

C_L(cenx+0.25*mx,ceny-9.5*my);

C_T(cenx+0.5*mx,ceny-9.8*my,»Y»);

C_P_W=1;

}

//———————————————————————-

void __fastcall TForm1::DrawLine(int x1, int y1, int x2, int y2)

{float k,x,y,c=0;

k=(float)(y2-y1)/(x2-x1);

C_P[x1][y1]=(TColor)cB;

if (fabs(x2-x1)>fabs(y2-y1))

 {   y=y1;

   if (k>=0)

    {     for(int x=x1+1;x<=x2;x++)

      {  if ((c+=k)>0.5)

         {   c-=1;

          y++;

          }

     C_P[x][(int)y]=(TColor)cB;

      }

   }

   else

    {   y=y1;

     for(int x=x1-1;x>=x2;x—)

      {   if ((c-=k)>0.5)

         {  c-=1;

          y++;

          }

     C_P[x][(int)y]=(TColor)cB;

      }

    }

   }

else

   {  x=x1;

    if ((1./k)>=0)

      {  for(int y=y1+1;y<=y2;y++)

         {  if ((c+=1./k)>0.5)

           { c-=1;

           x++;

            }

          C_P[(int)x][y]=(TColor)cB;

          }

       }

     else

       { x=x1;

        for(int y=y1+1;y<=y2;y++)

         {  if ((c-=1./k)>0.5)

            { c-=1;

             x—;

             }

          C_P[(int)x][y]=(TColor)cB;

          }

        }

     }

   }

//——————————————————————————

void __fastcall TForm1::DrawCircle(int cenx, int ceny, int r)

{int x,y,d;

x=0;y=r;

d=1.25-r;

C_P[x][y]=(TColor)cB;

while (y>x)

 { if (d<0)

  { d+=2*x+3;

   x++;

  }

  else

  {  d+=2*(x-y)+5;

   x++;

   y—;

   }

   circlePoints(cenx,ceny,x,y);

  }

}

//—————————————————————————-

void __fastcall TForm1::circlePoints(int cenx, int ceny, int x, int y)

{C_P[cenx+x][ceny-y]=(TColor)cB;

C_P[cenx+y][ceny+x]=(TColor)cB;

C_P[cenx-x][ceny+y]=(TColor)cB;

C_P[cenx-y][ceny-x]=(TColor)cB;

C_P[cenx-y][ceny+x]=(TColor)cB;

C_P[cenx-x][ceny-y]=(TColor)cB;

C_P[cenx+y][ceny-x]=(TColor)cB;

C_P[cenx+x][ceny+y]=(TColor)cB;

//закрашивание

C_P_C=(TColor)cB;

C_M(cenx-x,ceny-y);

C_L(cenx+x,ceny-y);

C_M(cenx-x,ceny+y);

C_L(cenx+x,ceny+y);

C_M(cenx-y,ceny+x);

C_L(cenx+y,ceny+x);

C_M(cenx-y,ceny-x);

C_L(cenx+y,ceny-x);

}

//—————————————————————————

void __fastcall TForm1::FormPaint(TObject *Sender)

{ int xc=8*mx,yc=10*my,x,y,r=3;

int i,j;

int x1,y1,x2,y2;

Color=(TColor)cW;

ShowGrid(xc);

C_P_C=(TColor)cB;

XoY(xc,yc);

//построение линий

x1=xc-4.5*mx;y1=yc;

x2=xc;y2=yc-9*my;

DrawLine(x2,y2,x1,y1);//1

C_T(xc-3.8*mx,yc-3.8*my,»1″);

x1=xc;y1=yc-9*my;

x2=xc+4.5*mx;y2=yc;

DrawLine(x1,y1,x2,y2);//2

C_T(xc+3.5*mx,yc-3.8*my,»2″);

x1=xc+4.5*mx;y1=yc;

x2=xc;y2=yc+9*my;

DrawLine(x1,y1,x2,y2);//3

C_T(xc+3.5*mx,yc+3.1*my,»3″);

x1=xc;y1=yc+9*my;

x2=xc-4.5*mx;y2=yc;

DrawLine(x2,y2,x1,y1);//4

C_T(xc-3.8*mx,yc+3.1*my,»4″);

x1=xc-2.5*mx;y1=yc;

x2=xc;y2=yc-5*my;

DrawLine(x2,y2,x1,y1);//5

C_T(xc-0.8*mx,yc-2.9*my,»5″);

x1=xc;y1=yc-5*my;

x2=xc+2.5*mx;y2=yc;

DrawLine(x1,y1,x2,y2);//6

C_T(xc+0.5*mx,yc-2.9*my,»6″);

x1=xc+2.5*mx;y1=yc;

x2=xc;y2=yc+5*my;

DrawLine(x1,y1,x2,y2);//7

C_T(xc+0.4*mx,yc+2.1*my,»7″);

x1=xc;y1=yc+5*my;

x2=xc-2.5*mx;y2=yc;

DrawLine(x2,y2,x1,y1);//8

C_T(xc-0.8*mx,yc+2.1*my,»8″);

//построение окружностей

for(j=-1;j<=1;j+=2)

 for(i=-3;i<=3;i+=2)

    DrawCircle(xc+i*mx,yc+j*my,r);

for(j=-3;j<=3;j+=6)

 for(i=-2;i<=2;i+=4)

    DrawCircle(xc+i*mx,yc+j*my,r);

for(j=-5;j<=5;j+=10)

 for(i=-1;i<=1;i+=2)

    DrawCircle(xc+i*mx,yc+j*my,r);

}

//—————————————————————————-

Рисунок 1. Построение заданной фигуры по методу срединной точки

 

Список литературы:

  1. Шикин Е.В., Боресков А.В. Компьютерная графика. Полигональные модели. — М.: ДИАЛОГ-МИФИ, 2005.-464с.: ил.
    . Для устранения ступенчатости при построении линейных функций (линий), а также конических сечений(окружностей, эллипсов, парабол, гипербол) помимо алгоритма Брезенхема можно воспользоваться методом срединной точки.» author=»Ананьева Марина Алексеевна» publisher=»БАСАРАНОВИЧ ЕКАТЕРИНА» pubdate=»2017-01-25″ edition=»ЕВРАЗИЙСКИЙ СОЮЗ УЧЕНЫХ_31.10.15_10(19)» ebook=»yes» ]