Ellipse zeichnen



  • Hallo,

    ich habe gerade ein Problem mit einem Algorithmus zum rastern einer Ellipse. Der Code sieht wie folgt aus:

    void ImageWidget::drawEllipse(int x, int y, int rx, int ry, int phi) {
        QPainter painter(image);
        painter.setPen(Qt::green);
    
        double pi = 4 * std::atan(1);
        double cosphi = std::cos(phi);
        double sinphi = std::sin(phi);
        double a = rx * cosphi;
        double b = ry * sinphi;
        double c = rx * sinphi;
        double d = ry * cosphi;
        double x0 = a + x;
        double y0 = c + y;
        double theta = 0;
        int n = 100;
        double incr = 2 * pi / n;
        for(int j = 0; j <= n; j++) {
            theta += incr;
            double costheta = std::cos(theta);
            double sintheta = std::sin(theta);
            double x1 = a * costheta - b * sintheta + x;
            double y1 = c * costheta + d * sintheta + y;
            painter.drawLine(x0, y0, x1, y1);
            x0 = x1;
            y0 = y1;
        }
    
        update();
    }
    

    Zum testen sollte eine Ellipse im 90° Winkel gezeichnet werden. Wie man jedoch unschwer am angehängten Bild erkennen kann ist das Ergebnis alles andere als korrekt. Problem ist nun, dass ich meinen Fehler einfach nicht sehe...

    http://s14.directupload.net/images/120520/ybvbr4du.jpg



  • Hey,

    dein cos(phi) bzw. sin(phi) sorgt dafür, dass die Elipse um die X-Achse rotiert !
    Wenn ich das richtig verstanden habe, möchtest du, dass die Hauptachse parallel zur X-Achse verläuft !?



  • BTW: Wenn die Ellipse immer Axis-Aligned ist könntest du einen "Bresenham Style" Algorithmus verwenden:
    http://www.gamedev.sk/bresenham-s-ellipse-algorithm



  • smoon schrieb:

    Zum testen sollte eine Ellipse im 90° Winkel gezeichnet werden. Wie man jedoch unschwer am angehängten Bild erkennen kann ist das Ergebnis alles andere als korrekt. Problem ist nun, dass ich meinen Fehler einfach nicht sehe...

    Ich rate jetzt nur; wenn Du von 90° sprichst, meinst Du damit, dass die Ellipse quasi 'hochkant' auf der Spitze steht? Falls ja, welchen Wert uebergibst Du beim Funktionsaufruf an phi? Etwa 90? Da alles im Bogenmass ist, waere der richtige Wert pi/2, aber da Du dort eine int Variable uebergibst, kannst Du damit pi/2 nicht abbilden.
    [Teilweise geloescht aufgrund voreiliger Schlussfolgerung 😉 ]



  • Danke dort lag wirklich der Fehler. Richtig ist es natürlich so:

    double convert = pi /180;
    double cosphi = std::cos(phi*convert);
    double sinphi = std::sin(phi*convert);
    

    Jetzt funktionierts 🙂


Anmelden zum Antworten