003
28.02.2006, 08:54 Uhr
~Gast
Gast
|
Code: |
void MidpointEllipse(int a, int b, myPoint p1, char c)//Ellipse mit Mittelpunkt { myPoint dot; int x = 0; int y = b; double d = b*b-a*a*b-(a*a/4); //Initialisierung von d für 1. Oktanten //1. Quadrant dot.setX(p1.getX()+x); dot.setY(p1.getY()+y); drawPoint(dot,c); //2. Quadrant dot.setX(p1.getX()+x); dot.setY(p1.getY()-y); drawPoint(dot,c); //3.Quadrant dot.setX(p1.getX()-x); dot.setY(p1.getY()-y); drawPoint(dot,c); //4.Quadrant dot.setX(p1.getX()-x); dot.setY(p1.getY()+y); drawPoint(dot,c);
while( a*a*(y-0.5) > b*b*(x-1)) { if (d < 0) // East { d += b*b*(2*x+3); } else // SouthEast { d += (b*b*(2*x+3)+a*a*(-2*y+2)); y--; } x++; dot.setX(p1.getX()+x); dot.setY(p1.getY()+y); drawPoint(dot,c); dot.setX(p1.getX()+x); dot.setY(p1.getY()-y); drawPoint(dot,c); dot.setX(p1.getX()-x); dot.setY(p1.getY()+y); drawPoint(dot,c); dot.setX(p1.getX()-x); dot.setY(p1.getY()-y); drawPoint(dot,c); } d = b*b*(x+.5)*(x+.5)+a*a*(y-1)*(y-1)-a*a*b*b; // Initialisierung von d while (y > 0) { if (d < 0) { //SouthEast d += b*b*(2*x+2)+a*a*(-2*y+3); x++; } else // South { d += a*a*(-2*y+3); y--; dot.setX(p1.getX()+x); dot.setY(p1.getY()+y); drawPoint(dot,c); dot.setX(p1.getX()+x); dot.setY(p1.getY()-y); drawPoint(dot,c); dot.setX(p1.getX()-x); dot.setY(p1.getY()+y); drawPoint(dot,c); dot.setX(p1.getX()-x); dot.setY(p1.getY()-y); drawPoint(dot,c); } } }
|
Im folgenden PDF: http://epubl.luth.se/1402-1781/2004/15/LTU-CDUPP-0415-SE.pdf im Abschnitt 4.2.3 ist der Midpoint Ellipse Algorithmus beschrieben.
Dass die Ellipse immer um 0,0 gezeichnet wird, liegt daran, dass du p1 in deiener Funktion nie verwendest.
Der Algorithmus wird hier so angewendet: Du rechnest immer nur die Werte für den 1. Quadranten aus und spiegelst dann in die anderen Quadranten. Du musst also 4 mal drawPoint(...) aufrufen.
Wenn es dir nicht unbedingt um den Algorithmus geht, würde ich folgendes machen: [code] #define pi 3.1415926535897932384626433832795f #define step 0.01f
void drawEllipse(float x, float y, float a, float b, char c) { float t=0.0f; while(t <= 2.0f * pi) { drawpoint((int) (x + a * cos(t)), (int) (y + b * sin(t)), c); t=t+step; } } [code]
Nachteil: step muss richtig gewählt werden, sonst dauert es ewig (Pixel werden mehrfach gezeichnet), oder es sind Lücken in der Ellipse (Pixel werden übersprungen). |