Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

POLYGONE RÉGULIER EN FORME D'ÉTOILE


Information sur la source

Catégorie :Java2D Classé sous : etoile, polygon, regulier, ellipse Niveau : Débutant Date de création : 05/07/2006 Date de mise à jour : 07/07/2006 07:59:38 Vu : 8 543

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
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

  • 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);
  • }
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.
 

Historique

07 juillet 2006 07:59:38 :
Code commenté et mis à jour pour tracer des étoiles basées sur des ellipse et non plus des cercles.

Commentaires et avis

signaler à un administrateur
Commentaire de Twinuts le 06/07/2006 16:44:06 administrateur CS

Salut,

Le concepte est sympas et le code pas bien sorcier mais quelques commentaire seraient les bien venue

signaler à un administrateur
Commentaire de DARKSIDIOUS le 06/07/2006 19:40:33 administrateur CS

Ok, je mettrais la source à jour de toute façon lorsque je l'aurais un peu améliorer : prochaine étape, faire des étoiles non plus basées sur des cercles, mais des ovales (sûrement plus compliqué à faire !!!), et du coup je rajouterai des commentaires.

Comme je le disais : ce n'est guère compliqué.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 07/07/2006 08:01:02 administrateur CS

C'est fait, j'ai rajouté des commentaires et je fais le calcul non plus sur des cercles mais sur des ellipses (en fait, l'équation change quasiment pas entre les cercles et les ellipses !).

signaler à un administrateur
Commentaire de Twinuts le 07/07/2006 09:08:12 administrateur CS

Les maths dans un code sont tout de suite plus lisible avec un bon commentaire :P


(tu commence tes journées comme les poules toi ....(08h01 rien que je dors encore à cette heure :P))

signaler à un administrateur
Commentaire de DARKSIDIOUS le 07/07/2006 13:26:13 administrateur CS

Bah vouais, mais y'en a qui bosse aussi ;)

signaler à un administrateur
Commentaire de Twinuts le 07/07/2006 14:02:02 administrateur CS

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

signaler à un administrateur
Commentaire de Twinuts le 07/07/2006 14:02:52 administrateur CS

J'oubliai c'est normal que la capture merdouille? je vois pas la meme capture sur la mini que qd je clic dessus

signaler à un administrateur
Commentaire de DARKSIDIOUS le 07/07/2006 14:06:09 administrateur CS

Sûrement un problème de cache de ton navigateur, supprime donc le cache de celui-ci, ca devrais résoudre le problème.

signaler à un administrateur
Commentaire de kaloway le 08/07/2006 09:17:19

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.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Trouver un polygone [ par GIGN90 ] Bonjour à tous,je vais essayer de vous expliquer mon problème le plus clairement possible.En fait mon problème est plus ou moins la suite de mon post Carte, et point dans polygon ? [ par albert0 ] Bonjour, Voilà, je voulais commencer à dev. un ptit prog en java, pour afficher des cartes interractives. http://www.tsr-rsr.ch/index.html?sit...207


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,41 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.