-void wxDCBase::CalculateEllipticPoints( wxList* points,
- wxCoord xStart, wxCoord yStart,
- wxCoord w, wxCoord h,
- double sa, double ea )
-{
- double pi = M_PI;
- double sar = 0;
- double ear = 0;
- int xsa = 0;
- int ysa = 0;
- int xea = 0;
- int yea = 0;
- int sq = 0;
- int eq = 0;
- bool bUseAngles = false;
- if( w<0 ) w = -w;
- if( h<0 ) h = -h;
- // half-axes
- wxCoord a = w/2;
- wxCoord b = h/2;
- // decrement 1 pixel if ellipse is smaller than 2*a, 2*b
- int decrX = 0;
- if( 2*a == w ) decrX = 1;
- int decrY = 0;
- if( 2*b == h ) decrY = 1;
- // center
- wxCoord xCenter = xStart + a;
- wxCoord yCenter = yStart + b;
- // calculate data for start and end, if necessary
- if( sa != ea )
- {
- bUseAngles = true;
- // normalisation of angles
- while( sa<0 ) sa += 360;
- while( ea<0 ) ea += 360;
- while( sa>=360 ) sa -= 360;
- while( ea>=360 ) ea -= 360;
- // calculate quadrant numbers
- if( sa > 270 ) sq = 3;
- else if( sa > 180 ) sq = 2;
- else if( sa > 90 ) sq = 1;
- if( ea > 270 ) eq = 3;
- else if( ea > 180 ) eq = 2;
- else if( ea > 90 ) eq = 1;
- sar = sa * pi / 180.0;
- ear = ea * pi / 180.0;
- // correct angle circle -> ellipse
- sar = atan( -a/(double)b * tan( sar ) );
- if ( sq == 1 || sq == 2 ) sar += pi;
- ear = atan( -a/(double)b * tan( ear ) );
- if ( eq == 1 || eq == 2 ) ear += pi;
- // coordinates of points
- xsa = xCenter + a * cos( sar );
- if( sq == 0 || sq == 3 ) xsa -= decrX;
- ysa = yCenter + b * sin( sar );
- if( sq == 2 || sq == 3 ) ysa -= decrY;
- xea = xCenter + a * cos( ear );
- if( eq == 0 || eq == 3 ) xea -= decrX;
- yea = yCenter + b * sin( ear );
- if( eq == 2 || eq == 3 ) yea -= decrY;
- } // if iUseAngles
- // calculate c1 = b^2, c2 = b^2/a^2 with a = w/2, b = h/2
- double c1 = b * b;
- double c2 = 2.0 / w;
- c2 *= c2;
- c2 *= c1;
- wxCoord x = 0;
- wxCoord y = b;
- long x2 = 1;
- long y2 = y*y;
- long y2_old = 0;
- long y_old = 0;
- // Lists for quadrant 1 to 4
- wxList pointsarray[4];
- // Calculate points for first quadrant and set in all quadrants
- for( x = 0; x <= a; ++x )
- {
- x2 = x2+x+x-1;
- y2_old = y2;
- y_old = y;
- bool bNewPoint = false;
- while( y2 > c1 - c2 * x2 && y > 0 )
- {
- bNewPoint = true;
- y2 = y2-y-y+1;
- --y;
- }
- // old y now to big: set point with old y, old x
- if( bNewPoint && x>1)
- {
- int x1 = x - 1;
- // remove points on the same line
- pointsarray[0].Insert( (wxObject*) new wxPoint( xCenter + x1 - decrX, yCenter - y_old ) );
- pointsarray[1].Append( (wxObject*) new wxPoint( xCenter - x1, yCenter - y_old ) );
- pointsarray[2].Insert( (wxObject*) new wxPoint( xCenter - x1, yCenter + y_old - decrY ) );
- pointsarray[3].Append( (wxObject*) new wxPoint( xCenter + x1 - decrX, yCenter + y_old - decrY ) );
- } // set point
- } // calculate point
-
- // Starting and/or ending points for the quadrants, first quadrant gets both.
- pointsarray[0].Insert( (wxObject*) new wxPoint( xCenter + a - decrX, yCenter ) );
- pointsarray[0].Append( (wxObject*) new wxPoint( xCenter, yCenter - b ) );
- pointsarray[1].Append( (wxObject*) new wxPoint( xCenter - a, yCenter ) );
- pointsarray[2].Append( (wxObject*) new wxPoint( xCenter, yCenter + b - decrY ) );
- pointsarray[3].Append( (wxObject*) new wxPoint( xCenter + a - decrX, yCenter ) );
-
- // copy quadrants in original list
- if( bUseAngles )