TheDeveloperBlog.com

Home | Contact Us

C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML

Computer Graphics Midpoint Ellipse Algorithm

Computer Graphics Midpoint Ellipse Algorithm with Computer Graphics Tutorial, Line Generation Algorithm, 2D Transformation, 3D Computer Graphics, Types of Curves, Surfaces, Computer Animation, Animation Techniques, Keyframing, Fractals etc.

<< Back to COMPUTER

Midpoint Ellipse Algorithm:

This is an incremental method for scan converting an ellipse that is centered at the origin in standard position i.e., with the major and minor axis parallel to coordinate system axis. It is very similar to the midpoint circle algorithm. Because of the four-way symmetry property we need to consider the entire elliptical curve in the first quadrant.

Let's first rewrite the ellipse equation and define the function f that can be used to decide if the midpoint between two candidate pixels is inside or outside the ellipse:

Midpoint Ellipse Algorithm
Midpoint Ellipse Algorithm

Now divide the elliptical curve from (0, b) to (a, 0) into two parts at point Q where the slope of the curve is -1.

Slope of the curve is defined by the f(x, y) = 0 isMidpoint Ellipse Algorithmwhere fx & fy are partial derivatives of f(x, y) with respect to x & y.

We have fx = 2b2 x, fy=2a2 y & Midpoint Ellipse Algorithm Hence we can monitor the slope value during the scan conversion process to detect Q. Our starting point is (0, b)

Suppose that the coordinates of the last scan converted pixel upon entering step i are (xi,yi). We are to select either T (xi+1),yi) or S (xi+1,yi-1) to be the next pixel. The midpoint of T & S is used to define the following decision parameter.

pi = f(xi+1),yi-Midpoint Ellipse Algorithm)
pi=b2 (xi+1)2+a2 (yi-Midpoint Ellipse Algorithm)2-a2 b2

If pi<0, the midpoint is inside the curve and we choose pixel T.

If pi>0, the midpoint is outside or on the curve and we choose pixel S.

Decision parameter for the next step is:

pi+1=f(xi+1+1,yi+1-Midpoint Ellipse Algorithm)
          = b2 (xi+1+1)2+a2 (yi+1-Midpoint Ellipse Algorithm)2-a2 b2

Since xi+1=xi+1,we have
          pi+1-pi=b2[((xi+1+1)2+a2 (yi+1-Midpoint Ellipse Algorithm)2-(yi -Midpoint Ellipse Algorithm)2]
          pi+1= pi+2b2 xi+1+b2+a2 [(yi+1-Midpoint Ellipse Algorithm)2-(yi -Midpoint Ellipse Algorithm)2]

If T is chosen pixel (pi<0), we have yi+1=yi.

If S is chosen pixel (pi>0) we have yi+1=yi-1. Thus we can express

          pi+1in terms of pi and (xi+1,yi+1):           pi+1= pi+2b2 xi+1+b2          if pi<0           = pi+2b2 xi+1+b2-2a2 yi+1 if pi>0

The initial value for the recursive expression can be obtained by the evaluating the original definition of pi with (0, b):

p1 = (b2+a2 (b-Midpoint Ellipse Algorithm)2-a2 b2
= b2-a2 b+a2/4

Suppose the pixel (xj yj) has just been scan converted upon entering step j. The next pixel is either U (xj ,yj-1) or V (xj+1,yj-1). The midpoint of the horizontal line connecting U & V is used to define the decision parameter:

qj=f(xj+Midpoint Ellipse Algorithm,yj-1)
qj=b2 (xj+Midpoint Ellipse Algorithm)2+a2 (yj -1)2-a2 b2

If qj<0, the midpoint is inside the curve and we choose pixel V.

If qj≥0, the midpoint is outside the curve and we choose pixel U.Decision parameter for the next step is:

qj+1=f(xj+1+Midpoint Ellipse Algorithm,yj+1-1)
          = b2 (xj+1+Midpoint Ellipse Algorithm)2+ a2 (yj+1-1)2- a2 b2

Since yj+1=yj-1,we have
qj+1-qj=b2 [(xj+1+Midpoint Ellipse Algorithm)2-(xj +Midpoint Ellipse Algorithm)2 ]+a2 (yj+1-1)2-( yj+1)2 ]
qj+1=qj+b2 [(xj+1+Midpoint Ellipse Algorithm)2-(xj +Midpoint Ellipse Algorithm)2]-2a2 yj+1+a2

If V is chosen pixel (qj<0), we have xj+1=xj.

If U is chosen pixel (pi>0) we have xj+1=xj. Thus we can express

qj+1in terms of qj and (xj+1,yj+1 ):
qj+1=qj+2b2 xj+1-2a2 yj+1+a2          if qj < 0
=qj-2a2 yj+1+a2          if qj>0

The initial value for the recursive expression is computed using the original definition of qj. And the coordinates of (xk yk) of the last pixel choosen for the part 1 of the curve:

q1 = f(xk+Midpoint Ellipse Algorithm,yk-1)=b2 (xk+Midpoint Ellipse Algorithm)2-a2 (yk-1)2- a2 b2

Algorithm:

int x=0, y=b; [starting point]
int fx=0, fy=2a2 b [initial partial derivatives]
int p = b2-a2 b+a2/4
while (fx2;
	if (p<0)
	p = p + fx +b2;
	else
	{
		y--;
		fy=fy-2a2
		p = p + fx +b2-fy;
	}
}
Setpixel (x, y);
p=b2(x+0.5)2+ a2 (y-1)2- a2 b2
while (y>0)
{
	y--;
	fy=fy-2a2;
	if (p>=0)
	p=p-fy+a2
           else
	{
		x++;
		fx=fx+2b2
		p=p+fx-fy+a2;
	}
	Setpixel (x,y);
}

Program to draw an ellipse using Midpoint Ellipse Algorithm:

#include 
#include 
#include 
#include 
#include 
#include 

class bresen
{
	float x,y,a, b,r,p,h,k,p1,p2;
	public:
	void get ();
	void cal ();
};
	void main ()
    {
	bresen b;
	b.get ();
	b.cal ();
	getch ();
   }
	void bresen :: get ()
   {
	cout<<"\n ENTER CENTER OF ELLIPSE";
	cout<<"\n ENTER (h, k) ";	
           cin>>h>>k;
	cout<<"\n ENTER LENGTH OF MAJOR AND MINOR AXIS";
	cin>>a>>b;
  }
void bresen ::cal ()
{
	/* request auto detection */
	int gdriver = DETECT,gmode, errorcode;
	int midx, midy, i;
	/* initialize graphics and local variables */
	initgraph (&gdriver, &gmode, " ");
	/* read result of initialization */
	errorcode = graphresult ();
	if (errorcode ! = grOK)    /*an error occurred */
	{
 		printf("Graphics error: %s \n", grapherrormsg (errorcode);
		printf ("Press any key to halt:");
		getch ();
		exit (1); /* terminate with an error code */
	}
	x=0;
	y=b;
	// REGION 1
	p1 =(b * b)-(a * a * b) + (a * a)/4);
	{
		putpixel (x+h, y+k, RED);
		putpixel (-x+h, -y+k, RED);
		putpixel (x+h, -y+k, RED);
		putpixel (-x+h, y+k, RED);
		if (p1 < 0)
			p1 += ((2 *b * b) *(x+1))-((2 * a * a)*(y-1)) + (b * b);
		else
		{
			p1+= ((2 *b * b) *(x+1))-((2 * a * a)*(y-1))-(b * b);
			y--;		
		}
		x++;
	}
	//REGION 2
	p2 =((b * b)* (x + 0.5))+((a * a)*(y-1) * (y-1))-(a * a *b * b);
	while (y>=0)
	{
		If (p2>0)
		p2=p2-((2 * a * a)* (y-1))+(a *a);
		else
		{
		p2=p2-((2 * a * a)* (y-1))+((2 * b * b)*(x+1))+(a * a);
		x++;
		}
		y--;
		putpixel (x+h, y+k, RED);
		putpixel (-x+h, -y+k, RED);
		putpixel (x+h, -y+k, RED);
		putpixel (-x+h, y+k, RED);
	}
	getch();
}

Output:

Midpoint Ellipse Algorithm




Related Links:


Related Links

Adjectives Ado Ai Android Angular Antonyms Apache Articles Asp Autocad Automata Aws Azure Basic Binary Bitcoin Blockchain C Cassandra Change Coa Computer Control Cpp Create Creating C-Sharp Cyber Daa Data Dbms Deletion Devops Difference Discrete Es6 Ethical Examples Features Firebase Flutter Fs Git Go Hbase History Hive Hiveql How Html Idioms Insertion Installing Ios Java Joomla Js Kafka Kali Laravel Logical Machine Matlab Matrix Mongodb Mysql One Opencv Oracle Ordering Os Pandas Php Pig Pl Postgresql Powershell Prepositions Program Python React Ruby Scala Selecting Selenium Sentence Seo Sharepoint Software Spellings Spotting Spring Sql Sqlite Sqoop Svn Swift Synonyms Talend Testng Types Uml Unity Vbnet Verbal Webdriver What Wpf