28
Евразийский Союз Ученых (ЕСУ) # 11 (20), 2015 ТЕХНИЧЕСКИЕ НАУКИ
ТЕХНИЧЕСКИЕ НАУКИ
использование метода срединной точки для построения
СОПРЯЖ ННОЙ ГИПЕРБОЛЫ И ВЕРТИКАЛЬНОГО ЭЛЛИПСА
Ананьева Марина Алексеевна
старший преподаватель кафедры прикладной математики Московский Государственный Университет информационных технологий, радиотехники и электроники МИРЭА
г. Москва
use of method average points for knowledge conjugate giperbola and vertical-strip oriented ellipse
Ananieva Marina Alekseevna
older teacher of chair application mathematics of Moskow State University information technology, radio-technology and electronics MIREA, MOSCOW
АННОТАЦИЯ
В этой статье рассматривается построение вертикального эллипса и сопряжённой гиперболы по методу срединной точки. Заполнение вертикального эллипса и сопряжённой гиперболы осуществляется линиями, построенными по методу срединной точки. Алгоритм растровой развёртки горизонтального эллипса описывается в [1]. Для устранения ступенчатости при построении линейных функций (линий), а также конических сечений(окружностей, эллипсов, парабол, гипербол) помимо алгоритма Брезенхема можно воспользоваться методом срединной точки.
ABSTRACT
In this article considers knowledge of vertical-strip oriented ellipse and conjugate giperbola by methods average points. The fill of vertical -strip oriented ellipse and conjugate giperbola realize lines, constructing on the methods average points. The algorithm bit-mapped scan ellipse describe in [1]. For removal jagging by construction linear function(line), a also canonical bifurca-tion(circle, ellipse, parabola, giperbola) apart from algorithm Brezenshema one can use methods average points.
Ключевые слова: срединная точка, вертикальный эллипс, сопряжённая гипербола Keyword: average points, vertical-strip oriented ellipse, conjugate giperbola
//программа написана на языке программирования 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); }
//вертикальные линии сетки
29
Евразийский Союз Ученых (ЕСУ) # 11 (20), 2015 ТЕХНИЧЕСКИЕ НАУКИ
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;
30
Евразийский Союз Ученых (ЕСУ) # 11 (20), 2015 ТЕХНИЧЕСКИЕ НАУКИ
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,"xA2+yA2/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,"yA2/9-xA2/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. Гипербола и вертикальный эллипс Список литературы:
Шикин Е.В., Боресков А.В. Компьютерная графика. Полигональные модели. - М.: ДИАЛОГ-МИФИ, 2005.-464с.: ил.