четвер, 23 червня 2011 р.

алгорит побудови еліпса з використанням putpixel

Дещо розібравшись та взнавши що й до чого, намалюю еліпс.
Нічого важкого в цьому не має бути адже код легкий.


#include <graphics.h>
#include <math.h>
#include <iostream.h>

void ci (int x, int y, int rx, int ry,int color)
{
     int x1, y1;
     float dn, n = 0;
     dn = 1.00 / float(rx);
     while (n < 2*M_PI)
     {
            x1 = x + rx*cos(n);
           y1 = y + ry*sin(n);
           putpixel (x1,y1,color);
           n = n + dn;
           }
     };

int main()
{
   
    int gdriver = DETECT, gmode, eror;
    initgraph (&gdriver,&gmode,"");
    eror = graphresult();
    if (eror != grOk)
    {
       cout<<"EROR!!!!\n Number eror = "<<eror;
       getch();
       return 0;     
       }
       ci (220,250,200,90,14);
    getch ();
    return 0;
}


Більш серйозним методом є алгоритм Берзенхема, який я використав...
Теорію ви можете знайти з вище поданого посилання.

#include <graphics.h>
#include <iostream.h>

float x,y;
int xc,yc;
int rx,ry;
int color;
void disp ();


void el ()
{
     float p1, p2;
x=0;
y=ry;
disp();
p1=(ry*ry)-(rx*rx*ry)+(rx*rx)/4;
 while((2.0*ry*ry*x)<=(2.0*rx*rx*y))
 {
   x++;
   if(p1<=0)
    p1=p1+(2.0*ry*ry*x)+(ry*ry);
   else
    {
     y--;
     p1=p1+(2.0*ry*ry*x)-(2.0*rx*rx*y)+(ry*ry);
    }
   disp();
   x=-x;
   disp();
   x=-x;
 }
 //відповідає за малювання країв
   x=rx;
y=0;
disp();
p2=(rx*rx)+2.0*(ry*ry*rx)+(ry*ry)/4;
while((2.0*ry*ry*x)>(2.0*rx*rx*y))
{
y++;
if(p2>0)
p2=p2+(rx*rx)-(2.0*rx*rx*y);
else
{
x--;
p2=p2+(2.0*ry*ry*x)-(2.0*rx*rx*y)+(rx*rx);
}
disp();
y=-y;
disp();
y=-y;
}
}

void disp()
{
putpixel(xc+x,yc+y,color);
putpixel(xc-x,yc+y,color);
putpixel(xc+x,yc-y,color);
putpixel(xc-x,yc-y,color);
}

int main()
{
    int gdriver = DETECT, gmode, eror;
    initgraph (&gdriver,&gmode,"");
    eror = graphresult();
    if (eror != grOk)
    {
       cout<<"EROR !!! = "<< eror<<endl;
       getch();
       return 0;       
    }
    xc = 200;
    yc = 200;
    rx = 80;
    ry = 30;
    color = 15;
    el();
    getch();
    return 0;
    }

Немає коментарів:

Дописати коментар