10
votes

Comment puis-je dessiner une ellipse avec un pixel d'orientation arbitraire par pixel?

Je dois dessiner une ellipse de taille et de pixel d'orientation arbitraire par pixel. Il semble assez facile de dessiner une ellipse dont les axes majeurs et mineurs s'alignent sur les axes X et Y, mais la rotation de l'ellipse par angle arbitraire semble plus approfondie. Initialement, je pense que cela pourrait travailler pour dessiner l'ellipse sans prise et appliquer une matrice de rotation à chaque point, mais il semble que cela puisse causer des erreurs à arrondi, et j'ai besoin d'une précision assez élevée.

Mon soupçon de cette méthode est-il correct? 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 important, car il s'agit d'une question plus orientée vers l'algorithme).

Edit: Comme David l'a souligné, je suppose que je me demande peut-être vraiment comment faire l'interpolation de pixels.


0 commentaires

3 Réponses :


9
votes

Utilisation: xxx

a est l'angle de rotation anticlinois, (x, y) sont les nouvelles coordonnées et (x, y) est l'ancien.

Vous devez utiliser des flotteurs pour préserver la précision. Je viens de passer à travers tous les points, appliquez la transformation et voilà.

Edit: Après une recherche, voici quelques codes de Microsoft: http://research.microsoft.com/en-us/um/people/awf/graphics/brefres-ellipse.html qui dessine des sections de conique rasterd.


8 commentaires

Je crois que cela exécute le risque habituel avec les transformations "avant": que l'aliasing vous causera de "sauter" des pixels dans les coordonnées transformées.


Oui, c'est pourquoi je cherchais une méthode différente. Y a-t-il de bonnes façons de faire face à l'aliasing?


Oui, je veux dire, tout dépend de la bibliothèque que vous utilisez pour faire votre dessin. Mais l'aliasing va bousiller tout type de rotation. Votre question devrait être "Comment puis-je faire une interpolation de pixels?" :)


@AMC: J'ai lu la solution de travail une fois, mais c'est dans un livre quelque part ... je vais le creuser et le poster si je trouve le temps et personne ne me mange.


Génial, merci pour votre aide. Au moins maintenant, je sais quoi de rechercher. :RÉ


L'interpolation est extrêmement générale, mais n'est pas la seule solution et peut être lente par comparaison avec d'autres méthodes. L'exemple classique de la façon dont pas doit interpoler sont les méthodes de Bresenham pour les lignes et les cercles. Je suppose qu'une technique similaire existe pour cette affaire ...


Ajout d'un lien à un code amusant par MS, c'est assez verbeux afin qu'il soit facile de suivre:}


Merci beaucoup! C'est assez génial.



3
votes

Bresenham (célèbre pour son Algorithme de dessin de ligne ) a également un algorithme de dessin une ellipse. Vous pouvez essayer de google Bresenham Ellipse . < / p>


0 commentaires

1
votes

Utilisez la méthode de Bresenham de dessin des ellipses alignés sur l'axe, mais appliquez un cisaillement à l'ellipse dessinée. Vous devrez également modifier les longueurs des axes. Une ellipse cisaille est également une ellipse. Cette méthode conserve le Bresenham Avantage de dessiner des ellipses remplies à l'aide de segments de ligne horizontale. Ce dont vous avez besoin pour faire ceci est la fonction qui mappe une spécification d'une ellipse en termes d'axes et de rotation dans un ensemble d'axes différents et d'un cisaillement. Une solution est disponible en ligne sur http://scratat.mit.edu/projects/50039326/ Avec une discussion sur la méthode et un Description du calcul impliqué chez http://scratat.mit.edu/discuss/topic/94194/ < / p>

La cartographie a été découverte par Nathan Dinsmore (utilisateur NXIII au Site de grattage MIT )


3 commentaires

Ceci est incroyable. Devrait être la meilleure réponse car c'est une nouvelle solution, meilleure, à une ancienne question.


Sans aucun doute, c'est la bonne réponse. Mais pourquoi dans le monde était-ce mis en œuvre dans Scratch: /


Il y a du code JavaScript au pied de g6auc.me.uk/ellipipes/index.html qui peut être plus accessible.