использование метода срединнои точки для построения заданной фигуры
Ананьева Марина Алексеевна,
старший преподаватель кафедры прикладной математики Московский Государственный Университет информационных технологий, радиотехники и электроники МИРЭА
г. Москва
USE OF METHOD AVERAGE POINTS FOR KNOWLEDGE SETING FIGURE
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-&rip oriented ellipse on the methods average points. The bit-mapped algorithms line, circle, scan ellipse describe in[1].For removal jagging by contraction linear function(line), a also canonical bifurcation(circle, ellipse, parabola, giperbola) apart from algorithm Brezenshema one can use methods average points.
Ключевые слова: срединная точка, отрезок линии, окружность, эллипс
Keywords: average points, line, circle, ellipse
//программа написана на языке программирования C++Builder6
#include <vcl.h> #pragma hdr^op #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 clRed #include «Article_9.h>> //.......................................................................
#pragma package(smart_init) #pragma resource «*.dfm» TForml *Form1;
int mx=30,my=30; //..................................
_fa^call TForm1::TForm1(TComponent* Owner)
: TForm(Owner) { }
//
void_fa^call TForm1::FormPaint(TObject *Sender)
{Color=(TColor)cW; int xc=14*mx,yc=9.5*my,r=8.5*my,i; int a=8*mx,b=2.5*my; ShowGrid(xc); //1
DrawCircle(xc,yc,r,true,cB); DrawEll(xc,yc-2.5*my,a,b,true,cB); //наклонные линии
//1
line(xc,yc-8.5*my,xc-5.25*mx,yc+6.6*my,R_G); line(xc-1,yc-8.5*my+1,xc-5.25*mx-1,yc+6.6*my+1,R_G); line(xc-1,yc-8.5*my+2,xc-5.25*mx-1,yc+6.6*my+2,R_G); //2
line(xc,yc-8.5*my,xc+5.25*mx,yc+6.6*my,R_G);
line(xc-1,yc-8.5*my+1,xc+5.25*mx-1,yc+6.6*my+1,R_G);
line(xc-1,yc-8.5*my+2,xc+5.25*mx-1,yc+6.6*my+2,R_G);
//3
line(xc-8.1*mx,yc-2.5*my,xc,yc+6.6*my,R_G);
line(xc-8.1*mx-1,yc-2.5*my+1,xc-1,yc+6.6*my+1,R_G);
line(xc-8.1*mx-1,yc-2.5*my+2,xc-1,yc+6.6*my+2,R_G);
//4
line(xc+8.1*mx,yc-2.5*my,xc,yc+6.6*my,R_G); line(xc+8.1*mx-1,yc-2.5*my+1,xc-1,yc+6.6*my+1,R_G);
line(xc+8.1*mx-1,yc-2.5*my+2,xc-1,yc+6.6*my+2,R_G); //штриховка
//1
for(i=0;i<=20;i++)
line(xc-3*i,yc-8.5*my+9*i,xc+3*i,yc-8.5*my+9*i,R_G); //2
for(i=0;i<=14;i++)
line(xc-7.9*i,yc+6.6*my-9*i,xc+7.9*i,yc+6.6*my-9*i,R_G); //3
for(i=0;i<=14;i++)
line(xc-8.1*mx+9*i,yc-2.5*my,xc-8.1*mx+9*i,yc-2.5*my+10.3*i,R_G); for(i=1;i<=5;i++)
line(xc-3.9*mx+9*i,yc-2.55*my,xc-3.9*mx+9*i,yc+2.55*my-27*i,R_G);
//4
for(i=0;i<=14;i++)
line(xc+8.1*mx-9*i,yc-2.5*my,xc+8.1*mx-9*i,yc-2.5*my+10.3*i,R_G); for(i=1;i<=5;i++)
line(xc+2.1*mx+9*i,yc-2.55*my,xc+2.1*mx+9*i,yc-2.55*my+27*i,R_G);
//горизонтальные линии
//1
line(xc-8.1*mx,yc-2.5*my,xc+8.1*mx,yc-2.5*my,R_G); line(xc-8.1*mx-1,yc-2.5*my-1,xc+8.1*mx-1,yc-2.5*my-1,R_G);
line(xc-8.1*mx-1,yc-2.5*my+1,xc + 8.1*mx-1,yc-2.5*my+1,R_G);
//2
line(xc-5.25*mx,yc+6.65*my,xc+5.25*mx,yc+6.65*my,R _G);
line(xc-5.25*mx-1,yc+6.65*my-1,xc + 5.25*mx-1,yc+6.65*my-1,R_G);
line(xc-5.25*mx-1,yc+6.65*my+1,xc + 5.25*mx-1,yc+6.65*my+1,R_G);
//3
line(xc-3.8*mx,yc+2.4*my,xc+3.8*mx,yc+2.4*my,R_G); line(xc-3.8*mx-1,yc+2.4*my-1,xc+3.8*mx-1,yc+2.4*my-1,R_G);
line(xc-3.8*mx-1,yc + 2.4* my +1 ,xc + 3.8*mx-1,yc+2.4*my+1,R_G); C_P_C=(TColor)cB; XoY(xc,yc);}
//.......................................................................
void_fa^call TForm1::ShowGrid(int cenx)
{int x,y;
C_P_C=(TColor)R_B; //горизонтальные линии сетки for(y=0;y<=19*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,19*my);}} //....................................................
void_fa^call 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-9.4*my); C_L(cenx,ceny+9.4*my); //стрелка
C_M(cenx-0.25*mx,ceny-9*my); C_L(cenx,ceny-9.4*my); C_L(cenx+0.25*mx,ceny-9*my); C_T(cenx+0.5*mx,ceny-9.6*my,»Y»); C_P_W=1;} //.........................................................
void_faflcall TForm1::line(int x1, int y1, int x2, int y2, int
color)
{float k,x,y,c=0; if (x1==x2) k=y2; else k=(float)(y2-y1)/(x2-x1); C_P[x1][y1]=(TColor)color; if (fabs(x2-x1)>fabs(y2-y1))
{ y=yi; 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=yi;
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_faflcall TForm1::DrawCircle(int cenx, int ceny, int r,
bool dotted, int color) {int x,y,d; x=0;y=r;d=1.25-r; C_P[x][y]=(TColor)color; int counter=0; while (y>x) { if (d<0) { d+=2*x+3; x++; } else
{ d+=2*(x-y)+5;
x++;
y--;}
if (dotted && ((counter %20) !=9) && ((counter %20) !=10)&&
((counter %20!=11))) DrawPoints(cenx,ceny,x,y,color); if (!dotted) DrawDot(cenx,ceny,x,y,color); ++counter; }}
//.......................................................................
void_fa^call TForm1::DrawPoints(int cenx, int ceny, int x,
int y, int color)
{C_P[cenx+x][ceny-y]=(TColor)color;
C_P[cenx+y][ceny+x]=(TColor)color;
C_P[cenx-x][ceny+y]=(TColor)color;
C_P[cenx-y][ceny-x]=(TColor)color;
C_P[cenx-y][ceny+x]=(TColor)color;
C_P[cenx-x][ceny-y]=(TColor)color;
C_P[cenx+y][ceny-x]=(TColor)color;
C_P[cenx+x][ceny+y]=(TColor)color;}
//
void_fa^call TForm1::DrawEll(int cenx, int ceny, int a, int
b,
bool dotted, int color)
{int x,y,a2,b2,a2a,b2b,k, counter=0;
float d,&;
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--;}
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;} //часть 8
d=-a2+b2*(-a+0.25); x=a;y=0;&=sqrt(a2+b2);
while((a2*y<=b2*(x-0.5)) && (x>=a2/&) && (y<=b2/&)) {if (d<0)
{d+=a2*(2*y+3);y++;} else
{d+=b2b*(1-x)+a2*(3+2*y);y++;x--;};
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;
C_P_C=(TColor)color;}}
//-----------------------------------------------------------------------
void_fa^call 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;}
Рисунок 1. Построение заданной фигуры