2016-10-31 1 views
2

J'ai une fonction en C++ qui dessine une ellipse. Maintenant, je veux ajouter une option de remplissage à cette ellipse. Comment je fais ça? J'ai essayé d'utiliser l'algorithme de remplissage d'inondation, mais cela ne fonctionne pas correctement lorsque la surface contient déjà des peintures.Comment remplir une ellipse?

Voici mon algorithme actuel:

const double TwoPI = (PI * 2); 
const double Step = (PI/180.0f); 

for(double i = 0; i < TwoPI; i += Step) 
{ 
    float x_offset = (radiusX * cos((float) i)); 
    float y_offset = (radiusY * sin((float) i)); 

    int x = int(a_X + x_offset); 
    int y = int(a_Y + y_offset); 

    if(prevX == -1 && prevY == -1) 
     Plot(x, y, color); 
    else 
     Line(prevX, prevY, x, y, color); 
} 
+2

Quelle bibliothèque utilisez-vous? 'C++' n'a pas de bibliothèque graphique telle que définie par la norme. Parlez-vous d'OpenGL, etc? – CoryKramer

+0

Pourquoi ne remplissez-vous pas lorsque vous dessinez? – stark

+1

@CoryKramer: Pour une question d'algorithme, c'est assez peu pertinent. Évidemment, avec une vraie bibliothèque graphique, la réponse serait "utiliser la fonction' DrawEllipse' fournie ", mais cela aurait déjà été la réponse pour l'ellipse non remplie. – MSalters

Répondre

3

Eh bien, une idée pourrait être de traverser seulement la moitié du cercle, et au lieu de calculer les points qui sont placés symétriquement autour de dire l'axe y. Puis tracez une ligne horizontale entre eux, en remplissant tous les pixels.

+0

Donc, au lieu d'utiliser la fonction 'Line()' directement, je l'utiliserais pour calculer tout pixels entre deux points sur un axe? – Z0q

+0

@Zoq: Non, l'idée est que vous utilisez _do_ Line, mais vous tracez une ligne de (-X, Y) à (X, Y). Si vous utilisiez ensuite des couleurs secondaires pour chaque ligne, vous obtiendriez un motif de bande horizontale. (Mais avec votre taille de pas angulaire _fixed, beaucoup de ces lignes se chevaucheraient.Vous seriez mieux de prendre une étape _fixed vertical_) – MSalters

+0

Je comprends. Lorsque l'ellipse est petite, ils se chevauchent, mais quand l'ellipse est grande, ils seront éloignés les uns des autres. – Z0q

0

Vous voyagez dans les deux sens et drows une ligne d'un bord à l'autre Quelque chose comme ceci: Je n'ai pas essayé de l'exécuter.Il est juste l'idée.Il est censé peindre un cercle rempli.

const double TwoPI = (PI * 2); 
const double Step = (PI/180.0f); 
double start=0; 
for(double i = 0; i < TwoPI; i += Step) 
{ 
    float x_offset = (radiusX * cos((float)start+ i)); 
    float y_offset = (radiusY * sin((float) start+i)); 

    float x2_offset = (radiusX * cos((float)start - i)); 


    int x = int(a_X + x_offset); 
    int x2 = int(a_X + x_offset); 
    int y = int(a_Y + y_offset); 


    Line(x, y, x2, y, color); 
}