--- 3d-viewer/3d_draw.cpp.orig 2010-05-28 21:47:32.000000000 +0200
+++ 3d-viewer/3d_draw.cpp 2010-06-08 22:14:59.000000000 +0200
@@ -32,8 +32,8 @@
double width, double holex,
double holey, double holeradius,
double zpos );
-static void Draw3D_ArcSegment( double startx, double starty, double endx,
- double endy, double width, double zpos );
+static void Draw3D_ArcSegment( double startx, double starty, double centrex,
+ double centrey, double arc_angle, double width, double zpos );
static void Draw3D_CircleSegment( double startx, double starty, double endx,
double endy, double width, double zpos );
static int Get3DLayerEnable( int act_layer );
@@ -530,7 +530,7 @@
switch( segment->m_Shape )
{
case S_ARC:
- Draw3D_ArcSegment( x, -y, xf, -yf, w, zpos );
+ Draw3D_ArcSegment( x, -y, xf, -yf, (double) segment->m_Angle, w, zpos );
break;
case S_CIRCLE:
@@ -552,7 +552,7 @@
switch( segment->m_Shape )
{
case S_ARC:
- Draw3D_ArcSegment( x, -y, xf, -yf, w, zpos );
+ Draw3D_ArcSegment( x, -y, xf, -yf, (double) segment->m_Angle, w, zpos );
break;
case S_CIRCLE:
@@ -759,7 +759,7 @@
break;
case S_ARC:
- Draw3D_ArcSegment( x, -y, fx, -fy, w, zpos );
+ Draw3D_ArcSegment( x, -y, fx, -fy, (double) m_Angle, w, zpos );
break;
default:
@@ -1196,27 +1196,42 @@
}
-static void Draw3D_ArcSegment( double startx, double starty, double endx,
- double endy, double width, double zpos )
+static void Draw3D_ArcSegment( double startx, double starty, double centrex,
+ double centrey, double arc_angle, double width, double zpos )
{
- int ii, slice = 36;
- double x, y, hole, rayon;
- int angle;
+ int ii;
+ int slice = 36; // Number of segments to approximate a circle by segments
+ double hole, rayon;
+ double arcStart_Angle;
- angle = static_cast<int>( atan2( startx - endx, starty - endy ) *
- 1800 / M_PI ) + 900;
- rayon = hypot( startx - endx, starty - endy ) + ( width / 2);
+ arcStart_Angle = (atan2( startx - centrex, starty - centrey ) * 1800 / M_PI );
+ rayon = hypot( startx - centrex, starty - centrey ) + ( width / 2);
hole = rayon - width;
+ // Calculate the number of segments to approximate this arc
+ int imax = (int) ( (double) arc_angle * slice / 3600.0 );
+ if( imax < 0 )
+ imax = -imax;
+ if (imax == 0 )
+ imax = 1;
+
+ // Adjust delta_angle to have exactly imax segments in arc_angle
+ // i.e. arc_angle = imax delta_agnle.
+ double delta_angle = (double) arc_angle / imax;
+
glBegin( GL_QUAD_STRIP );
- for( ii = 0; ii <= slice / 4; ii++ )
+ for( ii = 0; ii <= imax; ii++ )
{
- x = hole; y = 0.0;
- RotatePoint( &x, &y, angle + ( ii * 3600 / slice ) );
- glVertex3f( x + startx, y + starty, zpos );
- x = rayon; y = 0.0;
- RotatePoint( &x, &y, angle + ( ii * 3600 / slice ) );
- glVertex3f( x + startx, y + starty, zpos );
+ double angle = (double) ii * delta_angle;
+ angle += arcStart_Angle + 900;
+ double dx = hole;
+ double dy = 0.0;
+ RotatePoint( &dx, &dy, (int)angle );
+ glVertex3f( dx + startx, dy + starty, zpos );
+ dx = rayon;
+ dy = 0.0;
+ RotatePoint( &dx, &dy, (int)angle );
+ glVertex3f( dx + startx, dy + starty, zpos );
}
glEnd();