Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Allgo für Ellipse >>>kleiner bug<<<

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.02.2006, 13:22 Uhr
WindDancer1



hi Leutz ,

ich hab hier nen Ellipsen Allgo, das Problem ist, dass er mir nur eine Viertelellipse zeichnet
!
Wie kann ich den Code so abändern, dass eine ganze Ellipse angezeigt wird?.
Der Algo heißt Midpoint Ellipsen Allgo !

Hoffe, dass Ihr mir helfen könnt !
1000 Thx WindDancer

Hier der Code :



C++:
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
    dot.setX(Round(x)); //Setze 4 Punkte
    dot.setY(Round(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(Round(x)); //Setze 4 Punkte
        dot.setY(Round(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(Round(x)); //Setze 4 Punkte
            dot.setY(Round(y));
            drawPoint(dot,c);
        }
    }
}



 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.02.2006, 17:47 Uhr
~Gast
Gast



Code:
    dot.setX(Round(x)); //Setze 4 Punkte
    dot.setY(Round(y));
    drawPoint(dot,c);


zeichnet wahrscheinlich nur einen Punkt.
Du musst folgendes verwenden:

Code:
    dot.setX(Round(-x)); //Setze 4 Punkte
    dot.setY(Round(-y));
    drawPoint(dot,c);
    dot.setX(Round(-x)); //Setze 4 Punkte
    dot.setY(Round(y));
    drawPoint(dot,c);
    dot.setX(Round(x)); //Setze 4 Punkte
    dot.setY(Round(y));
    drawPoint(dot,c);
    dot.setX(Round(x)); //Setze 4 Punkte
    dot.setY(Round(-y));
    drawPoint(dot,c);

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.02.2006, 21:21 Uhr
~WinDancer1
Gast


Hallo ~Gast!
Bei mir wird immer nur der rechte untere Teil der Ellipse gezeichnet, und der Mittelpunkt liegt immer auf den Koordinaten 0,0. Deine Änderungsvorschläge zeichnen leider nur mehrere Punkte nebeneinander... :-(

Probier die Funktion doch bitte mal kurz aus!? Ersetze dot. ... durch ein Zeichnen von Pixeln an der entsprechenden Stelle.

Vielen Dank trotzdem! Wenn du noch eine bessere Idee oder sogar die Lösung herausfindest, wäre ich dankbar was von dir zu hören!

thx
WindDancer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.02.2006, 16:42 Uhr
~WinDancer1
Gast


Hi ~Gast,

vielen Dank jetzt funzt es bestens, machst Du öfter GFX ?
Wenn Du Lust hast könnten wir chatten !?!


WindDancer1
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: