ИСПОЛЬЗОВАНИЕ МЕТОДА СРЕДИННОЙ ТОЧКИ ДЛЯ ПОСТРОЕНИЯ ПАРАВОЛЫ
И ГОРИЗОНТАЛЬНОГО ЭЛЛИПСА
Ананьева Марина Алексеевна,
старший преподаватель кафедры прикладной математики, Московский Государственный Университет информационных технологий, радиотехники и электроники МИРЭА, г. Москва
USE OF METHOD AVERAGE POINTS FOR KNOWLEDGE PARABOLA AND COMIC-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 computer graphics consider bit-mapped algorithms. Result in program knowledge for parabola and comic-strip oriented ellipse 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 bifurcation (circle, ellipse, parabola, giperbola) apart from algorithm Brezenshema one can use methods average points. Ключевые слова: срединная точка Keyword: average points
//программа написана на языке программирования C++Builder6 #include <vcl.h> #pragma hdrstop #include<math.h>
#def ne C_P Canvas->Pixels
#def ne C_P_C Canvas->Pen->Color
#def ne C_M Canvas->MoveTo
#def ne C_L Canvas->LineTo
#def ne C_T Canvas->TextOutA
#def ne C_P_W Canvas->Pen->Width
#def ne R_B RGB(200,200,200)
#def ne R_G RGB(125,0,19)
#def ne cW clWhite
#def ne cB clBlack
#include "PP_1.h"
//----
#pragma package(smartjnit) #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<=15*my;y+=my) {
C_M(0,y);
C_L(20*mx,y); }
//вертикальные линии сетки
for(x=0;x<=20*mx;x+=mx) {
C_M(x,0);
C_L(x,15*my); }
}
//----------------------------------------------------------------------------------------
void_fastcall TForm1::XoY(int cenx, int ceny)
{ //оси //ось X C_P_W=2;
C_M(cenx-8*mx,ceny); C_L(cenx+8*mx,ceny); //стрелка
C_M(cenx+7.5*mx,ceny-0.25*my); C_L(cenx+8*mx,ceny); C_L(cenx+7.5*mx,ceny+0.25*my); C_T(cenx+7.5*mx,ceny-1*my,"X"); //ось Y
C_M(cenx,ceny-8.4*my);
C_L(cenx,ceny+5*my);
//стрелка
C_M(cenx-0.25*mx,ceny-7.9*my); C_L(cenx,ceny-8.4*my); C_L(cenx+0.25*mx,ceny-7.9*my); C_T(cenx+0.5*mx,ceny-8.5*my,"Y");
C_P_W=1; }
//---------------------------------------------------------------------------------------
void_fastcall TForm1::DrawPar(int cenx, int ceny, int ap, int endp)
{
int x=0,y=0; int p,p_2,r,d=0;
C_P[cenx+x][ceny+y]=(TColor)R_G;
p=ap/2.;
p_2=p/2.;
r=endp+p_2;
while (x<=r && y>=0 &y<=endp) {
if (d<0) {
d+=2*x+3;
x++; }
else {
d+=2*x+3-2*p;
x++; y++;
}
C_P[cenx+x][ceny-y]=(TColor)R_G;
C_P[cenx-x][ceny-y]=(TColor)R_G; }
}
//---------------------------------------------------------------------------------------
void_fastcall TForm1::DrawEll(int cenx, int ceny, int a, int b)
{int x,y,a2,b2,a2a,b2b,k; float d,st; a2=a*a;b2=b*b; a2a=2*a2;b2b=2*b2; //часть 7
d=b2+a2*(-b+0.25); x=0;y=b;k=0; while(a2*(y-0.5)>b2*x) {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);
}
}
//часть 8
d=-a2+b2*(-a+0.25);
x=a;y=0;
st=sqrt(a2+b2);
while((a2*y<=b2*(x-0.5)) && (x>=a2/st) && (y<=b2/st)) {if (d<0)
{d+=a2*(2*y+3);y++;} else
{d+=b2b*(1-x)+a2*(3+2*y);y++;x--;};
DrawDot(cenx,ceny,x,y); }
}
//--------------------------------------------------------------------------------------------------
void_fastcall TForm1::DrawDot(int cenx, int ceny1, int x, int y)
{C_P[cenx+x][ceny1+y]=(TColor)R_G;
C_P[cenx+x][ceny1-y]=(TColor)R_G;
C_P[cenx-x][ceny1+y]=(TColor)R_G;
C_P[cenx-x][ceny1-y]=(TColor)R_G;
//закрашивание
C_P_C=(TColor)R_G;
C_M(cenx+x,ceny1+y);
C_L(cenx+x,ceny1-y);
C_M(cenx-x,ceny1+y);
C_L(cenx-x,ceny1-y);} //----------------------------------------------------------------------------------------------
void_fastcall TForm1::FormPaint(TObject *Sender)
{Color=(TColor)cW;
int xc=10*mx,yc=10*my,yc_1=7*my,a=6*mx,b=my,ap=12*mx,endp=3*my;
ShowGrid(xc);
DrawPar(xc,yc,ap,endp);
DrawEll(xc,yc_1,a,b);
C_P_C=(TColor)cB;
XoY(xc,yc);} _
ïijf Метод срединной точки для параболы и горизонт B|S| -£3-
tl Ь Y
\ -V
X
Рисунок 1. Парабола и горизонтальный эллипс
Список литературы
1. Шикин Е.В., Боресков А.В. Компьютерная графика. Полигональные модели. - М.: ДИАЛОГ-МИФИ, 2005.-464с.: ил.