2010-06-11 13 views
9

Ich muss eine Ellipse beliebiger Größe und Ausrichtung Pixel für Pixel zeichnen. Es scheint ziemlich einfach zu sein, eine Ellipse zu zeichnen, deren Haupt- und Nebenachsen mit der x- und y-Achse ausgerichtet sind, aber das Drehen der Ellipse um einen beliebigen Winkel scheint komplizierter zu sein. Zu Beginn würde es vielleicht funktionieren, die nicht rotierte Ellipse zu zeichnen und eine Rotationsmatrix auf jeden Punkt anzuwenden, aber es scheint, als könnte das zu Rundungsfehlern führen, und ich brauche eine ziemlich hohe Präzision.Wie zeichne ich eine Ellipse mit willkürlicher Ausrichtung Pixel für Pixel?

Ist mein Verdacht über diese Methode richtig? Wie könnte ich diese Aufgabe präzisieren?

Ich programmiere in C++ (obwohl das nicht wirklich wichtig sein sollte, da dies eine eher algorithmische Frage ist).

Edit: wie David darauf hingewiesen hat, kann ich mich wirklich wundern, wie man Pixelinterpolation macht.

Antwort

9

Verwendung:

x = X cos(a) - Y sin(a) 
y = Y cos(a) + X sin(a) 

Wo a ist der Winkel der Drehung gegen den Uhrzeigersinn, (x, y) die neuen Koordinaten sind, und (X, Y) sind die alten.

Sie sollten Schwimmer verwenden, um die Genauigkeit zu erhalten. Gehen Sie einfach durch jeden Punkt, wenden Sie die Transformation an und voilà.

Edit: nach ein wenig suchen, hier ist ein Code von Microsoft: http://research.microsoft.com/en-us/um/people/awf/graphics/bres-ellipse.html, die gerastert Kegelschnitte zieht.

+1

entdeckt wurde, ich glaube, das das übliche Risiko mit „vorwärts“ läuft Transformationen: Das Aliasing bewirkt, dass Sie Pixel in den transformierten Koordinaten "überspringen". – dmckee

+0

Ja, deshalb habe ich nach einer anderen Methode gesucht. Gibt es irgendwelche guten Möglichkeiten, mit Aliasing umzugehen? – amc

+0

Ja, ich meine, alles hängt davon ab, mit welcher Bibliothek du deine Zeichnung machst. Aber Aliasing wird jede Art von Rotation vermasseln. Ihre Frage sollte lauten: "Wie mache ich eine Pixelinterpolation?" :) –

1

Verwenden Sie die Bresenham-Methode zum Zeichnen von Ellipsen mit Achsenausrichtung, wenden Sie jedoch eine Scherung auf die gezeichnete Ellipse an. Sie müssen auch die Längen der Achsen ändern. A sheared ellipse is also an ellipse. Diese Methode bewahrt den Vorteil von Bresenham, gefüllte Ellipsen mit horizontalen Liniensegmenten zu zeichnen. Was Sie dazu benötigen, ist die Funktion, die eine Spezifikation einer Ellipse in Bezug auf Achsen und Drehung in einen anderen Achsensatz und eine Scherung abbildet. Eine Lösung ist online verfügbar unter http://scratch.mit.edu/projects/50039326/ mit einer Diskussion über das Verfahren und ein description of the math involved bei http://scratch.mit.edu/discuss/topic/94194/

Die Zuordnung von Nathan Dinsmore (user nXIII am MIT Scratch site)

+0

Das ist erstaunlich.Sollte die beste Antwort sein, da es eine neue, bessere Lösung für eine alte Frage ist. – tukra