28 Ноя

ИСПОЛЬЗОВАНИЕ МЕТОДА СРЕДИННОЙ ТОЧКИ ДЛЯ ПОСТРОЕНИЯ СОПРЯЖЁННОЙ ГИПЕРБОЛЫ И ВЕРТИКАЛЬНОГО ЭЛЛИПСА




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


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

//программа написана на языке программирования C++Builder6

#include <vcl.h>

#pragma hdrstop

#include<math.h>

#define C_P Canvas->Pixels

#define C_P_C Canvas->Pen->Color

#define C_M Canvas->MoveTo

#define C_L Canvas->LineTo

#define C_T Canvas->TextOutA

#define C_P_W Canvas->Pen->Width

#define R_B RGB(200,200,200)

#define cW clWhite

#define R_G RGB(244,98,0)

#include «Article_8.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(cenx-11*mx,y);

   C_L(cenx+11*mx,y);  }

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

for(x=cenx-11*mx;x<=cenx+11*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-10*mx,ceny);

C_L(cenx+10*mx,ceny);

//стрелка

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

C_L(cenx+10*mx,ceny);

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

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

//ось Y

C_M(cenx,ceny-8*my);

C_L(cenx,ceny+8*my);

//стрелка

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

C_L(cenx,ceny-8*my);

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

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

C_P_W=1;

}

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

void __fastcall TForm1::Ell_b(int cenx, int ceny, int a, int b,int cd_x)

{int x,y,a2,b2,a2a,b2b;

float d,st;

a2=a*a;b2=b*b;

a2a=2*a2;b2b=2*b2;

//часть 7

d=a2+b2*(-a+0.25);

x=0;y=a;

while(b2*(y-0.5)>a2*x)

{if (d<0)

  {d+=a2*(2*x+3);x++;}

   else

   {d+=a2*(2*x+3)+b2b*(1-y);x++;y—;}

   C_P_C=(TColor)R_G;

   {

   DrawPoints(cenx,ceny,x,y,cd_x);

   //закрашивание левого эллипса

   line(cenx-x-cd_x,ceny-y,cenx+x-cd_x,ceny-y,R_G);

   line(cenx-x-cd_x,ceny+y,cenx+x-cd_x,ceny+y,R_G);

   //закрашивание правого эллипса

   line(cenx-x+cd_x,ceny-y,cenx+x+cd_x,ceny-y,R_G);

   line(cenx-x+cd_x,ceny+y,cenx+x+cd_x,ceny+y,R_G);

   }

}

//часть 8

d=b2+a2*(-b+0.25);

x=b;y=0;

st=sqrt(a2+b2);

while((b2*(y-0.5)<=a2*x) && (x>=b2/st) && (y<=a2/st))

{if (d<0)

  {d+=b2*(2*y+3);y++;}

  else

  {d+=a2a*(1-x)+b2*(3+2*y);y++;x—;};

  DrawPoints(cenx,ceny,x,y,cd_x);

  C_P_C=(TColor)R_G;

  //закрашивание левого эллипса

  line(cenx-x-cd_x,ceny-y,cenx+x-cd_x,ceny-y,R_G);

  line(cenx-x-cd_x,ceny+y,cenx+x-cd_x,ceny+y,R_G);

  //закрашивание правого эллипса

  line(cenx-x+cd_x,ceny-y,cenx+x+cd_x,ceny-y,R_G);

  line(cenx-x+cd_x,ceny+y,cenx+x+cd_x,ceny+y,R_G);

  }

}

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

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

{//левый эллипс

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

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

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

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

//правый эллипс

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

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

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

C_P[cenx-x+cd_x][ceny-y]=(TColor)R_G;}

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

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

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

if (x1==x2) k=(y2-y1)*(y2-y1);else

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

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

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)color; }

   }

   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)color;

      }

    }

   }

 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)color;

          }

       }

     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)color;

          }

        }

     }

}

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

void __fastcall TForm1::DrawGip(int cenx, int ceny, int a, int b,

 int endg_xx, int endg_yy)

{float a2,b2,a2a,d,st,r2_1,eks_1;

 int x,y;

  a2=a*a;b2=b*b;

 a2a=2*a2;

 d=b2+a2*(b+0.25);

  x=0;y=b;

  st=sqrt(a2+b2);

  eks_1=(float)st/(float)b;

 while (r2_1<=abs(eks_1*y-b) && x<=endg_xx &&  y<=endg_yy)

 { if (d<0)

  {   d+=b2*(2*x+3);

   x++;   }

   else

   {   d+=b2*(2*x+3)+a2a*(1-y);

   x++;

   y++;   }

   DrawDot(cenx,ceny,x,y);

   }

}

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

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

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

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

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

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

line(cenx-x,ceny-y,cenx+x,ceny-y,R_G);

line(cenx-x,ceny+y,cenx+x,ceny+y,R_G);

}

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

void __fastcall TForm1::FormPaint(TObject *Sender)

{

int xc=11*mx,yc=9*my,a1=5*mx,b1=1*my,cd_x=8*mx;

int a2=6*mx,b2=3*my,endg_xx=8*mx,endg_yy=5*my;

Color=(TColor)cW;

ShowGrid(xc);

C_P_C=(TColor)0;

DrawGip(xc,yc,a2,b2,endg_xx,endg_yy);

Ell_b(xc,yc,a1,b1,cd_x);

Ell_b(xc,yc,a1,b1,cd_x);

C_P_C=(TColor)0;

line(xc-8*mx,yc-5.5*my,xc-8*mx,yc+5.5*my,0);

line(xc+8*mx,yc-5.5*my,xc+8*mx,yc+5.5*my,0);

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

C_T(xc-6*mx,yc-2*my,»x^2+y^2/25=1″);

C_M(xc-7.1*mx,yc-2.5*my);

C_L(xc-6*mx,yc-1.1*my);

C_L(xc-1.8*mx,yc-1.1*my);

//сопряжённая гипербола

C_T(xc-6*mx,yc+2*my,»y^2/9-x^2/36=1″);

C_M(xc-6*mx,yc+2.85*my);

C_L(xc-1.3*mx,yc+2.85*my);

C_M(xc-6*mx,yc+2.85*my);

C_L(xc-7*mx,yc+4.7*my);

XoY(xc,yc);

}

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

Рисунок 1. Гипербола и вертикальный эллипс

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

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