2010-06-11 4 views
9

Je dois dessiner une ellipse de taille et d'orientation arbitraires pixel par pixel. Il semble assez facile de dessiner une ellipse dont les axes majeurs et mineurs s'alignent avec les axes x et y, mais la rotation de l'ellipse par un angle arbitraire semble plus délicate. Au départ, je pense que cela pourrait fonctionner pour dessiner l'ellipse non-appliquée et appliquer une matrice de rotation à chaque point, mais il semble que cela pourrait causer des erreurs d'arrondi, et j'ai besoin d'une grande précision.Comment dessiner une ellipse avec une orientation arbitraire pixel par pixel?

Est-ce que ma méfiance à propos de cette méthode est correcte? Comment pourrais-je accomplir cette tâche plus précisément?

Je suis en train de programmer en C++ (bien que cela ne soit pas vraiment important puisque c'est une question plus orientée algorithme). Edit: comme l'a souligné David, je suppose que je me demande vraiment comment faire une interpolation de pixels.

Répondre

9

Utilisation:

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

a est l'angle de rotation anti-horaire, (x, y) sont les nouvelles coordonnées et (X, Y) sont vieux.

Vous devez utiliser des flotteurs pour préserver la précision. Parcourez chaque point, appliquez la transformation, et voilà. Editer: après quelques recherches, voici un code de Microsoft: http://research.microsoft.com/en-us/um/people/awf/graphics/bres-ellipse.html qui dessine des sections coniques tramées.

+1

Je crois que ce court le risque habituel avec « avant » transformations: que l'aliasing vous fera "sauter" des pixels dans les coordonnées transformées. – dmckee

+0

Oui, c'est pourquoi j'ai cherché une méthode différente. Existe-t-il de bons moyens de gérer les alias? – amc

+0

Ouais, je veux dire, tout dépend de la bibliothèque que vous utilisez pour faire votre dessin. Mais le crénelage va bousiller n'importe quel type de rotation. Votre question devrait être "comment puis-je faire l'interpolation de pixels?" :) –

1

Utilisez la méthode de Bresenham pour dessiner des ellipses alignées sur l'axe, mais appliquez un cisaillement à l'ellipse dessinée. Vous devrez également modifier les longueurs des axes. A sheared ellipse is also an ellipse. Cette méthode préserve l'avantage de Bresenham de dessiner des ellipses remplies à l'aide de segments de ligne horizontaux. Ce dont vous avez besoin pour ce faire, c'est la fonction qui mappe une spécification d'une ellipse en termes d'axes et de rotation dans un ensemble différent d'axes et un cisaillement. Une solution est disponible en ligne à http://scratch.mit.edu/projects/50039326/ avec une discussion sur la méthode et un description of the math involved à http://scratch.mit.edu/discuss/topic/94194/

La cartographie a été découverte par Nathan Dinsmore (utilisateur nXIII au MIT Scratch site)

+0

C'est incroyable.Devrait être la meilleure réponse car c'est une nouvelle, meilleure, solution à une vieille question. – tukra

Questions connexes