next up previous contents
Nächste Seite: Weitere Ellipsendarstellungsmethoden Aufwärts: Darstellung von Ellipsen Vorherige Seite: Mittelpunkt-Entscheidungsalgorithmus   Inhalt

Bresenham-Ellipsen-Algorithmus

 
void DrawEllipseQuadrant(
  int x0, int y0,
  int rx, int ry,
  int color
) {
  const int rx2(rx*rx);
  const int ry2(ry*ry);
  int F(Round(ry2-rx2*ry+0.25*rx2));
  int ddF_x(0);
  int ddF_y(2*rx2*ry);
  int x(0);
  int y(ry);

  SetPixel(x+x0, y+y0, color);
    // while ( 2*ry2*x < 2*rx2*y ) {  we can use ddF_x and ddF_y
  while( ddF_x < ddF_y ) {
    if(F >= 0) {
      y     -= 1;        // south
      ddF_y -= 2*rx2;
      F     -= ddF_y;
    }
    x     += 1;          // east
    ddF_x += 2*ry2;
    F     += ddF_x + ry2;
    SetPixel(x+x0, y+y0, color);
  }
  F = Round(ry2*(x+0.5)*(x+0.5) + rx2*(y-1)*(y-1) - rx2*ry2);
  while( y > 0 ) {
    if(F <= 0) {
      x     += 1;        // east
      ddF_x += 2*ry2;
      F     += ddF_x;
    }
    y     -=1;           // south
    ddF_y -= 2*rx2;
    F     += rx2 - ddF_y;
    SetPixel(x+x0, y+y0, color);
  }
}

Die Multiplikationen mit 2 können ebenfalls durch vorherige Konstantenberechnung eliminiert werden.

Alle vier Quadranten erhält man einfach durch Ausnutzen der Symmetrie! Man zeichnet 4 Pixel in jeder der Schleifen.

Es ist sehr mühsam diesen Bresenham-Ellipsen-Algorithmus auf rotierte Ellipsen anzuwenden, obwohl prinzipiell möglich.

Es treten folgende Schwierigkeiten auf:



© 2004/2005, A. Formella & D. Fellner, Universität Braunschweig