2010-05-26 27 views
2

J'ai cherché sur le Web un moyen de tracer une ellipse à partir des coordonnées du rectangle, c'est-à-dire le coin supérieur gauche (x, y) et la taille (largeur et hauteur). Les seuls que je peux trouver partout sont basés sur l'algorithme Midpoint/Bresenham et je ne peux pas l'utiliser parce que lorsque vous travaillez avec des pixels entiers, je perds parce que ces algorithmes precisions utilisent un point central et radians. L'ellipse DOIT être limitée aux coordonnées du rectangle, donc si je le nourris un rectangle où la largeur et la hauteur sont 4 (ou n'importe quel nombre pair), je devrais obtenir une ellipse qui rentre complètement dans un rectangle 4x4, et non celui qui sera 5x5 (comme ce que ces algorithmes me donnent).Tracer l'ellipse à partir du rectangle

Est-ce que quelqu'un sait de toute façon d'y parvenir?

Merci!

+0

Pour être clair, étant donné un cadre de sélection, vous voulez la plus grande ellipse délimitée par cette boîte? Ce –

+0

est ce que je veux. –

Répondre

4

Pouvez-vous obtenir pas la largeur et la hauteur (divisé par 2) et le centre du rectangle puis branchez que dans une routine de dessin ellipse comme principal, axe et centre? Je suppose que je ne vois pas le problème tout le chemin ici.

+0

Non, je ne peux pas, car pour une largeur et une hauteur égales, la largeur et la hauteur de l'ellipse résultante seront incrémentées d'un pixel par rapport à l'original, vu qu'elle trace le pixel au centre + axe et centre-axe. J'ai besoin pour être tout à fait dans les limites, mes « pixels » sont donc ce 32x32 est très visible. –

+0

Le problème est la précision sous-pixel et de réfléchir sur les quarts de cercle est à l'origine d'un écrasement sur certains bords. Étant donné cela, vous devriez être capable de stocker une hauteur de largeur non-entière (ou au moins une valeur de point fixe avec 1 bit pour fraction) pour gérer cela. Ensuite, le problème est de trouver ou d'écrire un générateur d'ellipse qui fonctionne avec des largeurs et des hauteurs non entières. Cela ne devrait pas être trop difficile à trouver, mais je n'ai pas regardé si peut-être pas? –

0

La solution que j'ai trouvée à ce problème était de dessiner l'ellipse plus petite la plus proche avec des dimensions impaires, mais écartée d'un pixel le long de la dimension de longueur égale, répétant les pixels du milieu.

Cela peut se faire facilement en utilisant différents points médians pour les quarts de cercle lors du traçage de chaque pixel:

DrawPixel(midX_high + x, midY_high + y); 
DrawPixel(midX_low - x, midY_high + y); 
DrawPixel(midX_high + x, midY_low - y); 
DrawPixel(midX_low - x, midY_low - y); 

Les valeurs élevées sont le milieu ceil'ed, et les faibles valeurs sont le milieu parqueté.

Une image pour illustrer, avec une largeur des ellipses 15 et 16:

ellipses

Questions connexes