Bonjour,
Mathématiquement, un polygone régulier doit avoir tous ses côtés de même longueur. En testant ton code on voit tout de suite que ce n'est pas le cas.
Les sommets d'un polygone régulier sont tous sur un même cercle.
Soit (x0,y0) le centre de ce cercle de rayon R, les sommets du polygone régulier à N côtés peuvent être calculés par :
x[i] = x0+R.cos(2i.pi/N+a)
y[i] = y0+R.sin(2i.pi/N+a)
Où a est un angle de rotation du polygone autour de son centre.
Exemple :
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
public class Polygone extends Component {
private static final long serialVersionUID = 1L;
private final Color color;
private final int[] x;
private final int[] y;
public Polygone(int[] x, int[] y, Color color) {
this.x = x;
this.y = y;
this.color = color;
}
public void paint(Graphics g) {
g.setColor(color);
g.fillPolygon(x, y, x.length);
}
}
import java.awt.Color;
import java.awt.geom.Point2D;
import java.util.function.Function;
public class PolygoneRegulier extends Polygone {
private static final long serialVersionUID = 1L;
private static final int[] compute(double coord0, double rayon, int nbCotes, double rotation, Function<Double, Double> trigo) {
int[] coord = new int[nbCotes];
for (int i = 0; i < nbCotes; i++)
coord[i] = (int) (coord0 + rayon * trigo.apply(2 * i * Math.PI / nbCotes + rotation));
return coord;
}
public PolygoneRegulier(Point2D centre, double rayon, int nbCotes, double rotation, Color color) {
super(compute(centre.getX(), rayon, nbCotes, rotation, Math::cos),
compute(centre.getY(), rayon, nbCotes, rotation, Math::sin),
color);
}
}
import java.awt.Color;
import java.awt.geom.Point2D;
public class Hexagone extends PolygoneRegulier {
private static final long serialVersionUID = 1L;
public Hexagone(Point2D.Double centre, double rayon, double rotation, Color color) {
super(centre, rayon, 6, rotation, color);
}
}
Et dans ta classe Fenetre :
Hexagone hex = new Hexagone(new Point2D.Double(100, 100), 100, 0, Color.GRAY);
Ce qui donne un bel hexagone régulier (aux arrondis double → int près).
La confiance n'exclut pas le contrôle
3 sept. 2015 à 11:17
Cependant ces petits bouts de codes me génèrent des erreurs.
Classe polygoneRegulier:
L'erreur pour cette ligne est donc la suivante:
"The import java.util.function cannot be resolved"
Du coup, cela engendre des erreurs sur les bouts de codes suivants:
et
Dans la classe Fenetre
Cette erreur stipule que ce constructeur n'est pas défini. Pourtant il est bel et bien defini.
Modifié par KX le 3/09/2015 à 11:24
Voici une alternative :
Modifié par fatalerror le 3/09/2015 à 13:23
Mais seulement l'erreur de la classe Fenetre persiste:
Et la suggestion qui m'est faite est de:
- soit modifier le constructeur en ceci...
- soit de créer plutôt le constructeur...
3 sept. 2015 à 13:41
Est-ce que tu as bien les import java.awt.geom.Point2D ?
Parce que Point2D.Double c'est super standard (depuis Java 2 !)
En alternative, tu peux faire new Point(100, 100) avec un java.awt.Point, mais le centre du cercle sera du coup de coordonnées de type int (au lieu de double avec Point2D.Double)
Sinon, tu peux aussi décomposer l'objet Point, en deux paramètres x et y, comme ceci :
Mais bon, tout ça c'est du détail, la vraie réponse à ta question est là :
3 sept. 2015 à 13:48
Je pense pouvoir m'en sortir maintenant!!!