We help IT Professionals succeed at work.

# Draw Ellipse four control points

on
303 Views
Hi ,
Please help me to draw an ellipse with known 2 diameters and 4 control points(start and end points of the biggest and smallest diameters).

I implemented some algorithm, but I have a problem that in some cases it doesn't work correctly.(example : some of the diameters equal to zero.)

for(float j=-a; j<=a; j=j+1.f) //use the formula for the ellipse to generate the points and draw them on the screen
{
float x0 = center_x;
float y0 = center_y;

float x1 = center_x + (j);

float y1 =0.f;
if (b==0 || a==0)
y1 = center_y;
else
y1 = center_y + (float)(sqrt((b*b)-((b*b*j*j)/(a*a))));

float deltax = x1 - x0;
float deltay = y0 - y1;

float dis = (float)sqrt((deltax*deltax)+(deltay*deltay));

float c_dis = (float)dis;
float s_dis = (float)dis;

float pi = (float)acos(-1);

//-----------------------------------------------------------------------
if(deltay !=0 || deltax!=0)
{

float angle;
if(deltay ==0)
angle = atanf(deltax);
else
angle = (float)atan(deltax/deltay);

if(deltay <0  && deltax >=0)
{
if (deltax == 0)
angle = (float)(pi/2.0) + (float)fabs((atan(deltay)) ) ;
else
angle = (float)(pi/2.0) + (float)fabs((atan(deltay/deltax)) ) ;
}

if(deltay <0 && deltax <=0)
{
angle = (float)fabs(atan(deltax/deltay)) + (float)(pi);

}

if(deltay >0 && deltax <=0)
{
angle = (float)atan(deltax/deltay) ;

}

//---------------------------------------------------------------------

x1 = (float)x0 + (float)(dis*sin(angle+orient+angle_90));
y1 = (float)y0 - (float)(dis*cos(angle+orient+angle_90));

}//end of if (deltay !=0 || deltax!=0)

if(count>0)
{
pDC->MoveTo(endpoint.x,endpoint.y);
find_max_min_x_y_point(endpoint.x,endpoint.y);
pDC->LineTo((int)(x1+0.5),(int)(y1+0.5));
}

endpoint.x = (int)(x1+0.5);
endpoint.y = (int)(y1+0.5);
count++;

x0 = center_x;
y0 = center_y;

x1 = center_x + (j);

if (b==0||a==0)
y1= center_y;
else
y1 = center_y - (float)(sqrt((b*b)-((b*b*j*j)/(a*a))));

deltax = x1 - x0;
deltay = y0 - y1;

dis = (float)sqrt((deltax*deltax)+(deltay*deltay));

c_dis = (float)dis;
s_dis = (float)dis;

pi = (float)acos(-1);

//-----------------------------------------------------------------------
if(deltay !=0 || deltax!=0)
{

float angle =0.f;
if(deltay ==0)
angle = atanf(deltax);
else
angle = (float)atan(deltax/deltay);

if(deltay <0  && deltax >=0)
{
if (deltax == 0)
angle = (float)(pi/2.0) + (float)fabs((atan(deltay)) ) ;
else
angle = (float)(pi/2.0) + (float)fabs((atan(deltay/deltax)) ) ;
}

if(deltay <0 && deltax <=0)
{
angle = (float)fabs(atan(deltax/deltay)) + (float)(pi);
}

if(deltay >0 && deltax <=0)
{

angle = (float)atan(deltax/deltay) ;
}

//---------------------------------------------------------------------

x1 = (float)x0 + (float)(dis*sin(angle+orient+angle_90));
y1 = (float)y0 - (float)(dis*cos(angle+orient+angle_90));

}//end of if (deltay !=0 || deltax!=0)

if(count == 1)
{
endpoint2.x = (int)x1;
endpoint2.y = (int)y1;

}
if(count>0)
{
pDC->MoveTo(endpoint2.x,endpoint2.y);
find_max_min_x_y_point(endpoint2.x,endpoint2.y);
pDC->LineTo((int)(x1+0.5),(int)(y1+0.5));
}

endpoint2.x = (int)(x1+0.5);
endpoint2.y = (int)(y1+0.5);
count++;

}//end of for(j=-a....

Thank you
Comment
Watch Question
Software Architect
Top Expert 2008
Commented:
This problem has been solved!
###### Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

Deciding to stick with EE.

Mohamed Asif

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant