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.
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.