1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.TexturePaint;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TexturePanel extends JPanel {
private Paint paint;
public TexturePanel() {
}
public TexturePanel(Paint paint) {
this.paint=paint;
}
public void setPaint(Paint paint) {
this.paint=paint;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
if ( paint!=null ) {
((Graphics2D)g).setPaint(paint);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Démo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
double offsetx=-15;
double offsety=10;
double diam=20;
double pas=40;
double angle=Math.toRadians(60);
Color color = Color.BLACK;
Color bgcolor = Color.LIGHT_GRAY;
BufferedImage tole = createTile(diam, pas, angle, color);
TexturePanel panel = new TexturePanel(new TexturePaint(tole, new Rectangle2D.Double(offsetx, offsety, tole.getWidth(), tole.getHeight())));
panel.setBackground(bgcolor);
frame.add(panel);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static BufferedImage createTile(double diam, double step, double angle, Color color) {
double cx=diam/2; // x du centre du cercle de la première ligne
double cy=diam/2; // y du centre du cercle de la première ligne
double space = step-diam; // espace entre cercles (entre centres)
double cx2=cx + (diam + space) * Math.cos(angle); // x du centre du cercle de la seconde ligne
double cy2=cy + (diam + space) * Math.sin(angle); // y du centre du cercle de la seconde ligne
double cx3=cx2 + (diam + space) * Math.cos(angle); // x du second cercle, pour calculer lespace inter cercle
double spacev = cy2-cy-diam; // espace vertical entre cercles
double spaceh = cx3-cx2-diam; // espace horizontal entre cercles
Rectangle2D bounds1 = new Rectangle2D.Double(0, 0, diam, diam); // les bounds du cercle de la première ligne
Rectangle2D bounds2 = new Rectangle2D.Double(cx2-diam/2, cy2-diam/2, diam+spaceh, diam+spacev); // les bounds du cercle de la seconde ligne
Rectangle2D imageBounds = bounds1.getBounds2D().createUnion(bounds2.getBounds2D()); // on calcule la taille de la texture par union (on veut pouvoir habiller n'importe quel espace avec des textures répétitives)
BufferedImage image = new BufferedImage((int)imageBounds.getWidth(), (int)imageBounds.getHeight(), BufferedImage.TYPE_INT_ARGB); // je fais une texture transparent : la couleur de fond sera gérée dans le panel
Graphics2D g = image.createGraphics();
try {
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // améliore la qualité du dessin
g.setColor(color); // sélection couleur
for(double x=-step; x<imageBounds.getWidth(); x+=step) { // on couvre tout l'espace répétable en horizontal
g.fill(new Ellipse2D.Double(x, 0, diam, diam)); // dessin du cercle de la première ligne
g.fill(new Ellipse2D.Double(x+cx2-diam/2, cy2-diam/2, diam, diam)); // dessin du cercle de la seconde
}
}
finally {
g.dispose();
}
return image;
}
} |
Partager