Polygone régulier en forme d'étoile

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 264 fois - Téléchargée 24 fois

Contenu du snippet

Voici une petite fonction permettant de tracer un polygone régulier (juste régulier, ou en forme d'étoile). J'en avais besoin dans un projet de création d'affiche publicitaire, et n'ayant pas trouvé de source similaire sur le site, j'en profite pour la déposer.

Rien de bien compliqué, seul l'algorithme est intéressant qui consiste à tracer des lignes dont les points sont situées sur deux ellipses : l'une extérieure pour les branches de l'étoile, l'autre intérieure pour la grosseur de l'étoile.

Vous n'avez qu'à passer en paramètre à la fonction le centre des elipses, la dimension du rectangle englobant l'ellipse intérieure et extérieure (ce qui permet de calculer la position des points sur l'ellipse) et enfin le nombre de côtés de l'étoile que vous voulez obtenir.

Source / Exemple :


private Polygon regularPolygonEllipse(Point pCenter, Dimension pSizeOut, Dimension pSizeIn, int iSidesNumber) {
		int [] xpoints = new int[iSidesNumber * 2]; // Les différents points de l'ellipse
		int [] ypoints = new int[iSidesNumber * 2];
		
		double delta = Math.PI * 2 / iSidesNumber; // L'angle de référence entre 2 pointes de l'étoile
		double angle = 0;
		
		for ( int i = 0; i < iSidesNumber; i++ ) {
			if (pSizeIn.width != pSizeOut.width && pSizeIn.height != pSizeOut.height) { // Si la hauteur ou la largeur des 2 elipses sont différents, alors on trace une étoile 
				angle = delta * i + Math.PI / 2; // l'angle sur lequel on se base est augmenté du delta de référence
				xpoints[i * 2] = (int)(pSizeOut.width * Math.cos(angle) + 0.5) + pCenter.x; // on calcule les coordoonées en x du prochain point du polygone = largeur de l'elipse externe * cos(angle) + x du centre 
				ypoints[i * 2] = pCenter.y - (int)(pSizeOut.height * Math.sin(angle) + 0.5); // on calcule les coordoonées en y du prochain point du polygone = hauteur de l'elipse externe * cos(angle) + y du centre 
				angle += delta / 2; // on refait de même avec un angle légérement augmenté (la moitié de l'angle de référence) afin d'obtenir une étoile
				xpoints[i * 2 + 1] = (int)(pSizeIn.width * Math.cos(angle) + 0.5) + pCenter.x;
				ypoints[i * 2 + 1] = pCenter.y - (int)(pSizeIn.height * Math.sin(angle) + 0.5);
			} else { // sinon, on trace un polygône régulier
				angle = delta * i + Math.PI / 2;
				xpoints[i] = (int)(pSizeOut.width * Math.cos(angle) + 0.5) + pCenter.x;
				ypoints[i] = pCenter.y - (int)(pSizeOut.height * Math.sin(angle) + 0.5);			
			}
		}
		return new Polygon(xpoints, ypoints, (pSizeIn.width != pSizeOut.width && pSizeIn.height != pSizeOut.height) ? iSidesNumber * 2 : iSidesNumber);
	}

Conclusion :


Voilà, comme promis, mon code est à jour en se basant non plus sur des cercles mais sur des ellipses, ce qui permet d'obtenir des étoiles plus jolies et plus souples.

A voir également

Ajouter un commentaire Commentaires
Messages postés
358
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
13 avril 2020

des idées pour dessiner différent type d'étoiles :
-avoir un rapport d'homothétie différent en x et y pour les 2 ellipses.
-au lieu d'avoir seulement 2 ellipses en avoir 3 ou 4. àfin des tailles de pointe différente.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Sûrement un problème de cache de ton navigateur, supprime donc le cache de celui-ci, ca devrais résoudre le problème.
Messages postés
5366
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
6 décembre 2021
111
J'oubliai c'est normal que la capture merdouille? je vois pas la meme capture sur la mini que qd je clic dessus
Messages postés
5366
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
6 décembre 2021
111
Ba vi c'est la meme mais je commence plus tard ce qui me va très bien vu que je suis pas trop du matin (j'ai bien mon lit) :P
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Bah vouais, mais y'en a qui bosse aussi ;)
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.