Polygone régulier en forme d'étoile

5/5 (9 avis)

Snippet vu 21 622 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
kaloway Messages postés 358 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 13 avril 2020
8 juil. 2006 à 09:17
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.
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
7 juil. 2006 à 14:06
Sûrement un problème de cache de ton navigateur, supprime donc le cache de celui-ci, ca devrais résoudre le problème.
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
7 juil. 2006 à 14:02
J'oubliai c'est normal que la capture merdouille? je vois pas la meme capture sur la mini que qd je clic dessus
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
7 juil. 2006 à 14:02
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
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
7 juil. 2006 à 13:26
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.