package projetia; import javax.imageio.ImageIO; import javafx.application.Application; import static javafx.application.Application.launch; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javafx.embed.swing.SwingFXUtils; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.image.PixelReader; import javafx.scene.image.WritableImage; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Test extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage myStage) { String targetImage = "monaLisa-200.jpg"; Color[][] target = null; int maxX = 0; int maxY = 0; try { BufferedImage bi = ImageIO.read(new File(targetImage)); maxX = bi.getWidth(); maxY = bi.getHeight(); ConvexPolygon.max_X = maxX; ConvexPolygon.max_Y = maxY; target = new Color[maxX][maxY]; for (int i = 0; i < maxX; i++) { for (int j = 0; j < maxY; j++) { int argb = bi.getRGB(i, j); int b = (argb) & 0xFF; int g = (argb >> 8) & 0xFF; int r = (argb >> 16) & 0xFF; int a = (argb >> 24) & 0xFF; target[i][j] = Color.rgb(r, g, b); } } } catch (IOException e) { System.err.println(e); System.exit(9); } System.out.println("Read target image " + targetImage + " " + maxX + "x" + maxY); // génération de 10 triangles List ls = new ArrayList(); List meilleurPolygone = ls; for (int i = 0; i <50; i++) ls.add(new ConvexPolygon(3)); int boucle = 0; WritableImage wimgMeilleur = new WritableImage(maxX, maxY); Group imageMeilleur = new Group(); double resultatAdmissible = 20.0; double res = 1000000000.0; double resMeilleur = 1000000000.0; while (boucle < 400 && res > resultatAdmissible) { // formation de l'image par superposition des polygones System.out.println(" "); System.out.println("boucle=" + boucle); if (boucle > 0) { // System.out.println("Avant-faire ls = creationEnfants(ls);"); ls = creationEnfants(ls); // System.out.println("Apres-faire ls = creationEnfants(ls);"); } Group image = new Group(); for (ConvexPolygon p : ls) image.getChildren().add(p); // Calcul de la couleur de chaque pixel.Pour cela, on passe par une instance de // WritableImage, qui possède une méthode pour obtenir un PixelReader. WritableImage wimg = new WritableImage(maxX, maxY); image.snapshot(null, wimg); PixelReader pr = wimg.getPixelReader(); // On utilise le PixelReader pour lire chaque couleur // ici, on calcule la somme de la distance euclidienne entre le vecteur (R,G,B) // de la couleur du pixel cible et celui du pixel de l'image générée int distanceP2 = 0; for (int i = 0; i creationEnfants(List ls) { List enfants = new ArrayList(); int taille = ls.size(); for (int i = 0; i < taille; i++) { int ipere = (int) (Math.random() * taille); int imere = (int) (Math.random() * taille); while(imere==ipere){ imere = (int) (Math.random() * taille); } // System.out.println("creationEnfants i =" + i + " ipere=" + ipere + " imere=" + imere); ConvexPolygon pere = ls.get(ipere); // System.out.println("creationEnfants_pere=" + pere.toString()); ConvexPolygon mere = ls.get(imere); // System.out.println("creationEnfants_mere=" + mere.toString()); ConvexPolygon enfant = pere.reproduire(mere); enfants.add(enfant); } return enfants; } }