Premier commit - Introduction au système git

This commit is contained in:
Mysaa 2021-05-27 21:24:28 +02:00
commit 0d76df4ea4
26 changed files with 3805 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
.classpath
.metadata
.project
.settings
bin/

View File

@ -0,0 +1,110 @@
package com.bernard.cercloide;
import static java.lang.Math.abs;
import static java.lang.Math.pow;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.bernard.cercloide.theory.plan.Point;
/**
*
* @author Zlopeg
* @version 0.893
*/
public class TestDistance {
public static double getDistance(Point A, Point[] F, double P) {
double sigmaN = 0.0d, sigmaD = 0.0d;
int N = F.length, D = A.getCoords().length, Dmax = D;
for (int n = 0; n < N; n++) {
if (F[n].coords.length != D) {
int[] change = new int[Dmax];
if (F[n].coords.length != Dmax) {
for (int dm = 0; dm < Dmax; dm++)
change[dm] = (dm < F[n].coords.length) ? (F[n].getCoord(dm + 1)) : 0;
F[n].coords = change;
}
}
if (F[n].coords.length > Dmax) {
System.out.println("Dmax passe de " + Dmax + " à " + F[n].coords.length);
Dmax = F[n].coords.length;
}
}
for (int n = 0; n < N; n++) {
sigmaD = 0.0d;
for (int d = 1; d <= D; d++)
sigmaD += pow(abs(A.getCoord(d) - F[n].getCoord(d)), P);
sigmaN += pow(sigmaD, 1.0 / P);
}
return sigmaN;
}
// lorsque P tend vers PosInf
public static double getDistancePI(Point A, Point[] F) {
double sigmaN = 0.0d;
int N = F.length, D = A.getCoords().length, Dmax = D;
for (int n = 0; n < N; n++) {
if (F[n].coords.length != D) {
int[] change = new int[Dmax];
if (F[n].coords.length != Dmax) {
for (int dm = 0; dm < Dmax; dm++)
change[dm] = (dm < F[n].coords.length) ? (F[n].getCoord(dm + 1)) : 0;
F[n].coords = change;
}
}
if (F[n].coords.length > Dmax) {
System.out.println("Dmax passe de " + Dmax + " à " + F[n].coords.length);
Dmax = F[n].coords.length;
}
}
List<Double> temp = new ArrayList<>();
for (int n = 0; n < N; n++) {
temp.clear();
for (int d = 1; d <= D; d++)
temp.add(abs((double) A.getCoord(d) - (double) F[n].getCoord(d)));
sigmaN += Collections.max(temp);
}
return sigmaN;
}
public static double getDistanceMI(Point A, Point[] F) {
double sigmaN = 0.0d;
int N = F.length, D = A.getCoords().length, Dmax = D;
for (int n = 0; n < N; n++) {
if (F[n].coords.length != D) {
int[] change = new int[Dmax];
if (F[n].coords.length != Dmax) {
for (int dm = 0; dm < Dmax; dm++)
change[dm] = (dm < F[n].coords.length) ? (F[n].getCoord(dm + 1)) : 0;
F[n].coords = change;
}
}
if (F[n].coords.length > Dmax) {
System.out.println("Dmax passe de " + Dmax + " à " + F[n].coords.length);
Dmax = F[n].coords.length;
}
}
List<Double> temp = new ArrayList<>();
for (int n = 0; n < N; n++) {
temp.clear();
for (int d = 1; d <= D; d++)
temp.add(abs((double) A.getCoord(d) - (double) F[n].getCoord(d)));
sigmaN += Collections.min(temp);
}
return sigmaN;
}
}

View File

@ -0,0 +1,29 @@
package com.bernard.cercloide;
import java.awt.Component;
import java.awt.Container;
public class ViewUtil
{
public static final void printPanel(Container p)
{
printPanel(p, 0);
}
private static final void printPanel(Container p, int tab)
{
if(p==null) return;
for(Component c : p.getComponents())
{
for(int i = 0; i < tab; i++)
{
System.out.print("\t");
}
System.out.println(c);
if(c instanceof Container)
printPanel((Container)c, tab + 1);
}
}
}

View File

@ -0,0 +1,151 @@
package com.bernard.cercloide.colorset;
import java.awt.Color;
public enum ColorSet {
BlackWhite("Black->White") {
@Override
public Color getByInt(long l) {
return new Color((int) (l % 256), (int) (l % 256), (int) (l % 256));
}
},
BlackWhiteBlack("Black->White->Black") {
@Override
public Color getByInt(long l) {
return new Color((int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510),
(int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510),
(int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510));
}
},
BlackBlue("Black->Blue") {
@Override
public Color getByInt(long l) {
return new Color(0, 0, (int) (l % 256));
}
},
BlackBlueBlack("Black->Blue->Black") {
@Override
public Color getByInt(long l) {
return new Color(0, 0, (int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510));
}
},
BlackGreen("Black->Green") {
@Override
public Color getByInt(long l) {
return new Color(0, (int) (l % 256), 0);
}
},
BlackGreenBlack("Black->Green->Black") {
@Override
public Color getByInt(long l) {
return new Color(0, (int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510), 0);
}
},
BlackRed("Black->Red") {
@Override
public Color getByInt(long l) {
return new Color((int) (l % 256), 0, 0);
}
},
BlackRedBlack("Black->Red->Black") {
@Override
public Color getByInt(long l) {
return new Color((int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510), 0, 0);
}
},
BlackMagenta("Black->Magenta") {
@Override
public Color getByInt(long l) {
return new Color((int) (l % 256), 0, (int) (l % 256));
}
},
BlackMagentaBlack("Black->Magenta->Black") {
@Override
public Color getByInt(long l) {
return new Color((int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510), 0,
(int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510));
}
},
BlackYellow("Black->Yellow") {
@Override
public Color getByInt(long l) {
return new Color((int) (l % 256), (int) (l % 256), 0);
}
},
BlackYellowBlack("Black->Yellow->Black") {
@Override
public Color getByInt(long l) {
return new Color((int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510),
(int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510), 0);
}
},
BlackCyan("Black->Cyan") {
@Override
public Color getByInt(long l) {
return new Color(0, (int) (l % 256), (int) (l % 256));
}
},
BlackCyanBlack("Black->Cyan->Black") {
@Override
public Color getByInt(long l) {
return new Color(0, (int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510),
(int) ((l % 510 > 255) ? 510 - (l % 510) : l % 510));
}
},
WhyAreYouAVariable(" ") {
@Override
public Color getByInt(long l) {
int tl = ((int) (l % 14))*3;
switch (tl) {
case 0:
return Color.RED;
case 3:
return Color.GREEN;
case 6:
return Color.BLUE;
case 9:
return Color.MAGENTA;
case 12:
return Color.CYAN;
case 15:
return Color.DARK_GRAY;
case 18:
return Color.WHITE;
case 21:
return Color.GRAY;
case 24:
return Color.WHITE;
case 27:
return Color.YELLOW;
case 30:
return Color.LIGHT_GRAY;
case 33:
return Color.ORANGE;
case 36:
return Color.PINK;
default:
return new Color(42,110,196);
}
}
};
String displayName;
private ColorSet(String displayedName) {
this.displayName = displayedName;
}
public abstract Color getByInt(long l);
@Override
public String toString() {
return displayName;
}
}

View File

@ -0,0 +1,731 @@
package com.bernard.cercloide.factory;
import static java.lang.Math.*;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Arrays;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import com.bernard.cercloide.TestDistance;
import com.bernard.cercloide.colorset.ColorSet;
import com.bernard.cercloide.theory.plan.Point;
import com.bernard.cercloide.view.VarSetFrame;
import com.bernard.cercloide.view.ViewDrawingProgress;
import com.bernard.cercloide.view.WaitFrame;
public class ImageCreator
{
/**
* Iter all the picture and applics the color gave by the ColorSet at all
* pixels according to the rayon
* @param frame
* The main frame , for the endProcess() method
* @param imagePath
* The path where save the image
* @param foyers
* A point array representing all the centers of the cercloid
* @param p
* Value of P
* @param colorSet
* The colorSet for having the paint color
* @param width
* the widtrh of the final image
* @param height
* the height of the final image
* @param foyColor
* the color of the centers
* @param foyCrossConvention
* A char representing how to draw centers
* @param foyCrossSize
* the size of the drawed centers ( if drawed)
* @param progressing
* A frame for viewing draw process : if null , a WaitFrame will
* be shown
*/
public static void createImage(VarSetFrame frame, Path imagePath, Point[] foyers, Double p, ColorSet colorSet, int width, int height, Color foyColor, char foyCrossConvention, int foyCrossSize, ViewDrawingProgress progressing)
{
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
long total = width * height;
WaitFrame wf = (progressing == null) ? new WaitFrame(total) : null;
long progress = 0;
if(p.equals(Double.POSITIVE_INFINITY))
{
for(int w = 0; w < width; w++)
{
progress++;
for(int h = 0; h < height; h++)
{
progress++;
if(wf != null)
wf.progressBar.setValue((int)progress);
bi.setRGB(w, h, colorSet.getByInt((long)TestDistance.getDistancePI(new Point(w, h), foyers)).getRGB());
bi.flush();
}
if(progressing != null)
progressing.updateWithImage(bi);
}
}
else if(p.equals(Double.NEGATIVE_INFINITY))
{
for(int w = 0; w < width; w++)
{
progress++;
for(int h = 0; h < height; h++)
{
progress++;
if(wf != null)
wf.progressBar.setValue((int)progress);
bi.setRGB(w, h, colorSet.getByInt((long)TestDistance.getDistanceMI(new Point(w, h), foyers)).getRGB());
bi.flush();
}
if(progressing != null)
progressing.updateWithImage(bi);
}
}
else
{
for(int w = 0; w < width; w++)
{
progress++;
for(int h = 0; h < height; h++)
{
progress++;
if(wf != null)
wf.progressBar.setValue((int)progress);
bi.setRGB(w, h, colorSet.getByInt((long)TestDistance.getDistance(new Point(w, h), foyers, p)).getRGB());
bi.flush();
}
if(progressing != null)
progressing.updateWithImage(bi);
}
}
/**
* String convention : "a"+45 == absolu de 45 "r"+142 == relatif de 12
* "d"+0 = valeur par defaut "n"+0 = pas de croix
*/
int pxMax = 0;
boolean doCross = true;
switch(foyCrossConvention)
{
case 'd':
pxMax = (int)((2.0 * (double)height) / 500.0);
break;
case 'a':
pxMax = foyCrossSize;
break;
case 'r':
pxMax = (int)(((double)foyCrossSize * (double)height) / 500.0);
break;
case 'n':
pxMax = (int)((2.0 * (double)height) / 500.0);
doCross = false;
break;
default:
break;
}
if(doCross)
{
for(Point f : foyers)
{
int x = f.getCoord(1);
int y = f.getCoord(2);
int rgb = foyColor.getRGB();
for(int i = 1; i <= pxMax; i++)
{
try
{
bi.setRGB(x - i, y, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x, y - i, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x + i, y, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x, y + i, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x, y, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
bi.flush();
}
}
}
System.out.println("Image crée");
try
{
imagePath.getParent().toFile().mkdirs();
imagePath.toFile().createNewFile();
ImageIO.write(bi, "png", imagePath.toFile());
}
catch(IOException e)
{
System.err.println("Erreur lers de la création de l'image au path " + imagePath.toString());
e.printStackTrace();
}
System.out.println("Done");
if(wf != null)
wf.setVisible(false);
if(progressing != null)
progressing.setVisible(false);
if(frame != null)
endProcess(imagePath.toAbsolutePath().toString(), frame);
}
/**
* Draws a cercloid with an iteration (long and no-smart algo)
* @param frame
* The main frame , for the endProcess() method
* @param imagePath
* The path where save the image
* @param foyers
* A point array representing all the centers of the cercloid
* @param p
* Value of P
* @param cercloidColor
* The color for drawing the Cercloid
* @param cercloidRayon
* The Rayon of the cercloid
* @param cercloidFourch
* The size of the cercloid "trait"
* @param width
* the widtrh of the final image
* @param height
* the height of the final image
* @param foyColor
* the color of the centers
* @param foyCrossConvention
* A char representing how to draw centers
* @param foyCrossSize
* the size of the drawed centers ( if drawed)
* @param progressing
* A frame for viewing draw process : if null , a WaitFrame will
* be shown
*/
public static void createImage(VarSetFrame frame, Path imagePath, Point[] foyers, Double p, Color cercloidColor, long cercloidRayon, int cercloidFourch, int width, int height, Color foyColor, char foyCrossConvention, int foyCrossSize, ViewDrawingProgress progressing)
{
long rayonMax = cercloidRayon + cercloidFourch, rayonMin = cercloidRayon - cercloidFourch;
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
long total = width * height;
WaitFrame wf = (progressing == null) ? new WaitFrame(total) : null;
long progress = 0;
if(p.equals(Double.POSITIVE_INFINITY))
{
for(int w = 0; w < width; progress++, w++)
{
for(int h = 0; h < height; progress++, h++)
{
if(wf != null)
wf.progressBar.setValue((int)progress);
long dis = (long)TestDistance.getDistancePI(new Point(w, h), foyers);
if(rayonMin <= dis && dis <= rayonMax)
{
bi.setRGB(w, h, cercloidColor.getRGB());
}
else
{
bi.setRGB(w, h, Color.WHITE.getRGB());
}
bi.flush();
}
if(progressing != null)
progressing.updateWithImage(bi);
}
}
else if(p.equals(Double.NEGATIVE_INFINITY))
{
for(int w = 0; w < width; w++)
{
progress++;
for(int h = 0; h < height; h++)
{
if(wf != null)
wf.progressBar.setValue((int)progress);
long dis = (long)TestDistance.getDistanceMI(new Point(w, h), foyers);
if(rayonMin <= dis && dis <= rayonMax)
{
bi.setRGB(w, h, cercloidColor.getRGB());
}
else
{
bi.setRGB(w, h, Color.WHITE.getRGB());
}
bi.flush();
}
if(progressing != null)
progressing.updateWithImage(bi);
}
}
else
{
for(int w = 0; w < width; progress++, w++)
{
for(int h = 0; h < height; progress++, h++)
{
if(wf != null)
wf.progressBar.setValue((int)progress);
long dis = (long)TestDistance.getDistance(new Point(w, h), foyers, p);
if(rayonMin <= dis && dis <= rayonMax)
{
bi.setRGB(w, h, cercloidColor.getRGB());
}
else
{
bi.setRGB(w, h, Color.WHITE.getRGB());
}
bi.flush();
}
if(progressing != null)
progressing.updateWithImage(bi);
}
}
/**
* String convention : "a"+45 == absolu de 45 "r"+142 == relatif de 12
* "d"+0 = valeur par defaut "n"+0 = pas de croix
*/
int pxMax = 0;
boolean doCross = true;
switch(foyCrossConvention)
{
case 'd':
pxMax = (int)((2.0 * (double)height) / 500.0);
break;
case 'a':
pxMax = foyCrossSize;
break;
case 'r':
pxMax = (int)(((double)foyCrossSize * (double)height) / 500.0);
break;
case 'n':
pxMax = (int)((2.0 * (double)height) / 500.0);
doCross = false;
break;
default:
break;
}
if(doCross)
{
for(Point f : foyers)
{
int x = f.getCoord(1);
int y = f.getCoord(2);
int rgb = foyColor.getRGB();
for(int i = 1; i <= pxMax; i++)
{
try
{
bi.setRGB(x - i, y, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x, y - i, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x + i, y, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x, y + i, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
bi.setRGB(x, y, rgb);
bi.flush();
}
}
}
System.out.println("Image crée");
try
{
ImageIO.write(bi, "png", imagePath.toFile());
}
catch(IOException e)
{
System.err.println("Erreur lers de la création de l'image au path " + imagePath.toString());
e.printStackTrace();
}
System.out.println("Done");
if(wf != null)
wf.setVisible(false);
if(progressing != null)
progressing.setVisible(false);
if(frame != null)
{
endProcess(imagePath.toAbsolutePath().toString(), frame);
}
}
/**
* Create and save a Image af the cercloid specified with arguments (smart
* algo normalerweise)
* @param frame
* The main frame , for the endProcess() method
* @param imagePath
* The path where save the image
* @param foyers
* A point array representing all the centers of the cercloid
* @param p
* Value of P
* @param cercloidColor
* The color for drawing the Cercloid
* @param cercloidRayon
* The Rayon of the cercloid
* @param width
* the widtrh of the final image
* @param height
* the height of the final image
* @param foyColor
* the color of the centers
* @param foyCrossConvention
* A char representing how to draw centers
* @param foyCrossSize
* the size of the drawed centers ( if drawed)
* @param progressing
* A frame for viewing draw process : if null , a WaitFrame will
* be shown
*/
public static void createImage(VarSetFrame frame, Path imagePath, Point[] foyers, Double p, Color cercloidColor, long cercloidRayon, int width, int height, Color foyColor, char foyCrossConvention, int foyCrossSize, ViewDrawingProgress progressing)
{
System.out.println(Arrays.toString(foyers));
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bi.getGraphics().fillRect(0, 0, width, height);
if(p > 0.0)
{
Point barycentre = Point.findBarycentre(foyers);
Point pointNE = barycentre.clone();
Point pointNO = barycentre.clone();
Point pointSO = barycentre.clone();
Point pointSE = barycentre.clone();
double error = -1.0;
while(error < 0)
{
pointNE.incrementCoord(1);
error = TestDistance.getDistance(pointNE, foyers, p) - cercloidRayon;
}
error = -1.0;
while(error < 0)
{
pointNO.incrementCoord(2);
error = TestDistance.getDistance(pointNO, foyers, p) - cercloidRayon;
}
error = -1.0;
while(error < 0)
{
pointSO.decrementCoord(1);
error = TestDistance.getDistance(pointSO, foyers, p) - cercloidRayon;
}
error = -1.0;
while(error < 0)
{
pointSE.decrementCoord(2);
error = TestDistance.getDistance(pointSE, foyers, p) - cercloidRayon;
}
pointNE.decrementCoord(1);
pointNO.decrementCoord(2);
pointSO.incrementCoord(1);
pointSE.incrementCoord(2);
Point firstPointNE = pointNE.clone();
System.out.println(pointNE + "," + pointNO + "," + pointSO + "," + pointSE);
// List<Point> figure = new ArrayList<>();
int[][] MODIFIED_COORDS = {{-1, 0}, {0, +1}, {-1, +1}};
while(pointNE.getCoord(1)>pointNO.getCoord(1))
{
// figure.add(pointNE);
System.out.println(pointNE);
try
{
bi.setRGB(pointNE.getCoord(1), pointNE.getCoord(2), cercloidColor.getRGB());
}
catch(ArrayIndexOutOfBoundsException e)
{
System.err.println("error");
}
pointNE = getBetter(foyers, p, cercloidRayon, pointNE.withModifiedCoords(MODIFIED_COORDS[0]), pointNE.withModifiedCoords(MODIFIED_COORDS[1]), pointNE.withModifiedCoords(MODIFIED_COORDS[2]));
}
MODIFIED_COORDS = new int[][] {{-1, 0}, {0, -1}, {-1, -1}};
while(pointNO.getCoord(2)>pointSO.getCoord(2))
{
// figure.add(pointNO);
try
{
bi.setRGB(pointNO.getCoord(1), pointNO.getCoord(2), cercloidColor.getRGB());
}
catch(ArrayIndexOutOfBoundsException e)
{
System.err.println("error");
}
pointNO = getBetter(foyers, p, cercloidRayon, pointNO.withModifiedCoords(MODIFIED_COORDS[0]), pointNO.withModifiedCoords(MODIFIED_COORDS[1]), pointNO.withModifiedCoords(MODIFIED_COORDS[2]));
}
MODIFIED_COORDS = new int[][] {{+1, 0}, {0, -1}, {+1, -1}};
while(pointSO.getCoord(1)<pointSE.getCoord(1))
{
// figure.add(pointSO);
try
{
bi.setRGB(pointSO.getCoord(1), pointSO.getCoord(2), cercloidColor.getRGB());
}
catch(ArrayIndexOutOfBoundsException e)
{
System.err.println("error");
}
pointSO = getBetter(foyers, p, cercloidRayon, pointSO.withModifiedCoords(MODIFIED_COORDS[0]), pointSO.withModifiedCoords(MODIFIED_COORDS[1]), pointSO.withModifiedCoords(MODIFIED_COORDS[2]));
}
MODIFIED_COORDS = new int[][] {{+1, 0}, {0, +1}, {+1, +1}};
while(pointSE.getCoord(2)<firstPointNE.getCoord(2))
{
// figure.add(pointSE);
try
{
bi.setRGB(pointSE.getCoord(1), pointSE.getCoord(2), cercloidColor.getRGB());
}
catch(ArrayIndexOutOfBoundsException e)
{
System.err.println("error");
}
pointSE = getBetter(foyers, p, cercloidRayon, pointSE.withModifiedCoords(MODIFIED_COORDS[0]), pointSE.withModifiedCoords(MODIFIED_COORDS[1]), pointSE.withModifiedCoords(MODIFIED_COORDS[2]));
}
bi.flush();
}
else
{
createImage(frame, imagePath, foyers, p, cercloidColor, cercloidRayon, 1, width, height, foyColor, foyCrossConvention, foyCrossSize, progressing);
}
/**
* String convention : "a"+45 == absolu de 45 "r"+142 == relatif de 12
* "d"+0 = valeur par defaut "n"+0 = pas de croix
*/
int pxMax = 0;
boolean doCross = true;
switch(foyCrossConvention)
{
case 'd':
pxMax = (int)((2.0 * (double)height) / 500.0);
break;
case 'a':
pxMax = foyCrossSize;
break;
case 'r':
pxMax = (int)(((double)foyCrossSize * (double)height) / 500.0);
break;
case 'n':
pxMax = (int)((2.0 * (double)height) / 500.0);
doCross = false;
break;
default:
break;
}
if(doCross)
{
for(Point f : foyers)
{
int x = f.getCoord(1);
int y = f.getCoord(2);
int rgb = foyColor.getRGB();
for(int i = 1; i <= pxMax; i++)
{
try
{
bi.setRGB(x - i, y, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x, y - i, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x + i, y, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
try
{
bi.setRGB(x, y + i, rgb);
bi.flush();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Drawing cross out of bounds");
}
bi.setRGB(x, y, rgb);
bi.flush();
}
}
}
System.out.println("Image crée");
try
{
ImageIO.write(bi, "png", imagePath.toFile());
}
catch(IOException e)
{
System.err.println("Erreur lers de la création de l'image au path " + imagePath.toString());
e.printStackTrace();
}
System.out.println("Done");
if(frame != null)
{
endProcess(imagePath.toAbsolutePath().toString(), frame);
}
}
public static Point getBetter(Point[] foyers, double p, long rayon, Point... points)
{
Point closerPoint = null;
double closerPointDelta = Double.POSITIVE_INFINITY;
System.out.print("{");
for(Point point : points)
{
double currentD = abs(TestDistance.getDistance(point, foyers, p) - (double)rayon);
System.out.print(currentD+",");
if(currentD < closerPointDelta)
{
closerPoint = point;
closerPointDelta = currentD;
}
}
System.out.println("}");
return closerPoint;
}
public static byte getLittelestPos(double[] tab)
{
double minValue = Double.POSITIVE_INFINITY;
byte lastRetenedByte = -1;
for(int i = 0; i < tab.length; i++)
{
if(tab[i] < minValue)
{
minValue = tab[i];
lastRetenedByte = (byte)i;
}
}
return lastRetenedByte;
}
private static void endProcess(String path, VarSetFrame main)
{
int option = JOptionPane.showConfirmDialog(null, "Voulez-vous ouvrir l'image ?", "Ouvrir l'image", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if(option == JOptionPane.YES_OPTION)
{
RunnerFactory.openImage(path);
}
String[] items = {"Refaire avec les mêmes paramètres", "Refaire une autre image", "Fermer"};
int rang = JOptionPane.showOptionDialog(null, "Quoi que c'est qu'on fait maintenant", "Hein ... ?", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, items, items[2]);
switch(rang)
{
case 0:
main.setVisible(true);
break;
case 1:
main.init();
main.setVisible(true);
break;
case 2:
System.exit(0);
break;
}
}
}

View File

@ -0,0 +1,18 @@
package com.bernard.cercloide.factory;
import javax.swing.JOptionPane;
public class JOptPaneCreator {
public static final void newErrorPane(Exception e, String error) {
JOptionPane.showMessageDialog(null, error + '\n' + e.getMessage(),
"An " + e.getClass().toGenericString() + " occured", JOptionPane.ERROR_MESSAGE);
}
public static final void newErrorPane(Exception e) {
newErrorPane(e, "");
}
public static void argumentError(String text) {
JOptionPane.showMessageDialog(null,text,"Erreur d'argument", JOptionPane.ERROR_MESSAGE);
}
}

View File

@ -0,0 +1,61 @@
package com.bernard.cercloide.factory;
import java.awt.Color;
import java.nio.file.Paths;
import javax.swing.JOptionPane;
import com.bernard.cercloide.colorset.ColorSet;
import com.bernard.cercloide.theory.iter.IterOptions;
import com.bernard.cercloide.theory.plan.Point;
import com.bernard.cercloide.view.VarSetFrame;
import com.bernard.cercloide.view.ViewDrawingProgress;
import com.bernard.cercloide.view.WaitFrame;
public class LoopingImageCreator {
public static final void createImageWithLoopedParams(IterOptions pIter, IterOptions wIter, IterOptions hIter,
IterOptions rIter, IterOptions fIter, boolean withRay, Point[] foyers, ColorSet colorSet, Color foyColor,
char foyCrossConvention, int foyCrossSize, Color rayColor) {
long total = pIter.getMal() * wIter.getMal() * hIter.getMal() * rIter.getMal() * fIter.getMal();
long progress = 0;
WaitFrame wf = new WaitFrame(total);
wf.setLocation(0, 0);
System.out.println(pIter);
for (Double p : pIter) {
for (Double w : wIter) {
for (Double h : hIter) {
for (Double r : rIter) {
for (Double f : fIter) {
if (withRay) {
ImageCreator.createImage(null,
Paths.get("cercloid_outs/"+VarSetFrame.getFileName(p, w.intValue(), h.intValue(),
foyCrossConvention, foyCrossSize, withRay, r.toString(), rayColor,
f.toString(), colorSet)+".png").toAbsolutePath(),
foyers, p, rayColor, r.longValue(), f.intValue(), w.intValue(), h.intValue(),
foyColor, foyCrossConvention, foyCrossSize,new ViewDrawingProgress());
} else {
ImageCreator.createImage(null,
Paths.get("cercloid_outs/"+VarSetFrame.getFileName(p, w.intValue(), h.intValue(),
foyCrossConvention, foyCrossSize, withRay, r.toString(), rayColor,
f.toString(), colorSet)+".png").toAbsolutePath(),
foyers, p, colorSet, w.intValue(), h.intValue(), foyColor, foyCrossConvention,
foyCrossSize,new ViewDrawingProgress());
}
progress++;
wf.progressBar.setValue((int) progress);
}
fIter.reInit();
}
rIter.reInit();
}
hIter.reInit();
}
wIter.reInit();
}
wf.setVisible(false);
JOptionPane.showMessageDialog(null, "Vos images ont bien été générées !!!", "Images générées !!!", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}

View File

@ -0,0 +1,67 @@
package com.bernard.cercloide.factory;
public class NumberAnalyser {
static final Character eszett = new Character((char) 255);
public static final Double parseDouble(String s) {
switch (s.toUpperCase()) {
case "NAN":
return Double.NaN;
case "+INF":
return Double.POSITIVE_INFINITY;
case "-INF":
return Double.NEGATIVE_INFINITY;
case "INF":
return Double.POSITIVE_INFINITY;
case "MAX":
return Double.MAX_VALUE;
case "MIN":
return Double.MIN_VALUE;
case "LUCAS":
return Double.valueOf(0.110);
case "LUCA":
return Double.valueOf(110);
case "PI":
return Math.PI;
case "E":
return Math.E;
case "GOGOL":
return Double.valueOf(Math.pow(10, 100));
case "SQRT(2)":
return Double.valueOf(Math.sqrt(2));
default:
try {
return Double.parseDouble(s);
} catch (NumberFormatException e) {
if (s.charAt(0) == 'ß') {
return Double.valueOf(4.55455);
}
System.out.println("Akeuh je connais pas " + s);
throw new NumberFormatException();
}
}
}
public static final Long parseLong(String s) {
switch (s.toUpperCase()) {
case "MAX":
return Long.MAX_VALUE;
case "MIN":
return Long.MIN_VALUE;
case "LUCAS":
return Long.valueOf(110);
case "GOGOL":
return Long.valueOf((long) Math.pow(10, 100));
default:
try {
return Long.parseLong(s);
} catch (NumberFormatException e) {
if (s.equals(eszett)) {
return Long.valueOf(455455);
}
System.out.println("Akeuh je connais pas l'entier" + s);
throw new NumberFormatException();
}
}
}
}

View File

@ -0,0 +1,28 @@
package com.bernard.cercloide.factory;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
//%ProgramFiles%\Windows Photo Gallery\WindowsPhotoGallery.exe
public class RunnerFactory {
public static final void openImage2(String path) {
Runtime runt = Runtime.getRuntime();
try {
runt.exec(new String[] { System.getenv("ProgramFiles") + "\\Windows Photo Gallery\\WindowsPhotoGallery.exe",
path });
} catch (IOException e) {
e.printStackTrace();
}
}
public static final void openImage(String path) {
try {
Desktop.getDesktop().open(new File(path));
} catch (IOException e) {
System.err.println("Erreur d'IO lors de l'ouverture du fichier \""+path+"\" avec la visionneuse windows");
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,10 @@
package com.bernard.cercloide.main;
import java.awt.Color;
public class Config
{
public static int selectPointPosColorBackground = Color.CYAN.getRGB();
public static int selectPointPosColorCross = Color.RED.getRGB();
}

View File

@ -0,0 +1,36 @@
package com.bernard.cercloide.main;
import com.bernard.cercloide.factory.RunnerFactory;
import com.bernard.cercloide.theory.iter.IterEnsemble;
import com.bernard.cercloide.theory.iter.IterOptions;
import com.bernard.cercloide.theory.plan.Point;
import com.bernard.cercloide.view.LoopUtilFrame;
import com.bernard.cercloide.view.MainFrame;
import com.bernard.cercloide.view.VarSetFrame;
import com.bernard.console.Console;
//Screen : 1280/1024
public class Main {
public static Point[] foyers = {};
public static MainFrame mainFrame;
public static VarSetFrame varSetFrame;
public static LoopUtilFrame loopUtilFrame;
public static void main(String[] args) {
Console.createConsole();
mainFrame = new MainFrame();
}
public static void main2(String[] args) {
RunnerFactory.openImage("F:\\Bernard\\cercloids_outs\\out1463034719758.png");
}
public static void main3(String[] args) {
System.out.println("Start");
IterOptions iter = new IterEnsemble(new Double[]{1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0},-1);
System.out.println(iter);
for(Double d : iter){
System.out.println(d);
}
System.out.println("End");
}
}

View File

@ -0,0 +1,10 @@
package com.bernard.cercloide.main;
public class Sprach
{
public static String COORD_LIST = "X\u892145YZABCDEFGHIJKLMNOPQRSTUVW";
public static String tabMode = "Passer en mode tableau";
public static String graphMode = "Passer en mode graphique";
}

View File

@ -0,0 +1,29 @@
package com.bernard.cercloide.theory;
import java.util.Iterator;
import com.bernard.cercloide.theory.plan.Point;
public class PointIterator implements Iterator<Point>{
int[] xs,ys;
int xpos,ypos;
@Override
public boolean hasNext() {
return xpos+1==xs.length && ypos+1==ys.length;
}
@Override
public Point next() {
if(xpos+1 == xs.length){
if(ypos+1 == ys.length){
return null;
}
ypos++;
xpos = 0;
}
return new Point(xs[xpos],ys[ypos]);
}
}

View File

@ -0,0 +1,80 @@
package com.bernard.cercloide.theory.iter;
import java.util.Arrays;
import java.util.Iterator;
public class IterEnsemble implements IterOptions {
Double[] values;
int randMal;
int actualPos = 0;
long totalIter;
public IterEnsemble(Double[] doubles, int randMal) {
this.values = doubles;
this.randMal = randMal;
this.totalIter = getMal();
}
public Double[] getValues() {
return values;
}
public void setValues(Double[] values) {
this.values = values;
}
public int getRandMal() {
return randMal;
}
public void setRandMal(int randMal) {
this.randMal = randMal;
}
@Override
public String toString() {
return "IterEnsemble [values=" + Arrays.toString(values) + ", randMal=" + randMal + "]";
}
@Override
public long getMal() {
if (randMal == -1) {
return values.length;
} else {
return randMal;
}
}
@Override
public boolean hasNext() {
return actualPos <= totalIter-1;
}
@Override
public Double next() {
if(hasNext()){
if(randMal == -1){
Double d = values[actualPos];
actualPos++;
return d;
}else{
Double d = values[(int) Math.floor(Math.random()*values.length)];
actualPos++;
return d;
}
}
return null;
}
@Override
public Iterator<Double> iterator() {
return this;
}
@Override
public void reInit() {
this.actualPos = 0;
}
}

View File

@ -0,0 +1,115 @@
package com.bernard.cercloide.theory.iter;
import java.util.Iterator;
public class IterIntervale implements IterOptions {
Double a, b, pas;
int randNumber;
Double actualPos;
long totalIter = getMal();
public IterIntervale(Double iA, Double iB, Double iP, int randNumber) {
this.a = iA;
this.b = iB;
this.pas = iP;
this.randNumber = randNumber;
if(randNumber == -1){
actualPos = a;
}else{
actualPos = 0.0;
}
}
public Double getA() {
return a;
}
public void setA(Double a) {
this.a = a;
}
public Double getB() {
return b;
}
public void setB(Double b) {
this.b = b;
}
public Double getPas() {
return pas;
}
public void setPas(Double pas) {
this.pas = pas;
}
public int getRandNumber() {
return randNumber;
}
public void setRandNumber(int randNumber) {
this.randNumber = randNumber;
}
@Override
public String toString() {
return "IterIntervale [a=" + a + ", b=" + b + ", pas=" + pas + ", randNumber=" + randNumber + "]";
}
@Override
public long getMal() {
if (randNumber == -1) {
int i = 0;
Double e = a;
while (e < b) {
i++;
e += pas;
}
return i;
} else {
return randNumber;
}
}
@Override
public boolean hasNext() {
if (randNumber == -1) {
return actualPos-(actualPos%pas) < b;
} else {
return actualPos < randNumber;
}
}
@Override
public Double next() {
if (hasNext()) {
if (randNumber == -1) {
Double d = actualPos;
actualPos += pas;
return d.doubleValue();
} else {
Double d = a+(b-a)*Math.random();
d-=d%pas;
actualPos += 1.0;
return d;
}
}
return null;
}
@Override
public Iterator<Double> iterator() {
return this;
}
@Override
public void reInit() {
if(randNumber == -1){
actualPos = a;
}else{
actualPos = 0.0;
}
}
}

View File

@ -0,0 +1,8 @@
package com.bernard.cercloide.theory.iter;
import java.util.Iterator;
public interface IterOptions extends Iterable<Double> ,Iterator<Double>{
long getMal();
void reInit();
}

View File

@ -0,0 +1,136 @@
package com.bernard.cercloide.theory.plan;
import java.util.Arrays;
/**
* This class represents a point defined by a coordinates tab
* the coord 0 does not exists : coords count start at 1
*
* @author mysaa
*
*/
public class Point {
public int[] coords;
public Point(int... cords) {
coords = cords;
}
public int getCoord(int i) {
return coords[i - 1];
}
public int[] getCoords() {
return coords;
}
public void setCoords(int[] coords) {
this.coords = coords;
}
public void setCoord(int i,int value) {
this.coords[i-1] = value;
}
@Override
public String toString() {
return "Point [coords=" + Arrays.toString(coords) + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(coords);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (!Arrays.equals(coords, other.coords))
return false;
return true;
}
public static Point findBarycentre(Point[] foyers) {
final int coordNumber = foyers[0].coords.length;
long[] coordsSum = new long[coordNumber];
Arrays.fill(coordsSum, 0L);
for (Point p : foyers) {
System.out.println(foyers[0]);
if (p.coords.length != coordNumber) {
throw new IllegalArgumentException("Les points ne sont pas de m<>me dimension !!!");
}
for (int i = 0; i < p.getCoords().length; i++) {
coordsSum[i] += p.getCoord(i+1);
}
}
int[] coords = new int[coordsSum.length];
for (int i = 0; i < coordsSum.length; i++) {
coords[i] = (int) Math.floorDiv(coordsSum[i], foyers.length);
}
return new Point(coords);
}
public Point incrementCoord(int i) {
coords[i-1]++;
return this;
}
public Point decrementCoord(int i) {
coords[i-1]--;
return this;
}
/**
* Modify coords by adding modified tab to coords tab (with clone())
* @param modified The modified coords
* @return a new Point(cloned) with coords modified
*/
public Point withModifiedCoords(int ... modified) {
Point p2 = this.clone();
for (int i = 0; i < modified.length; i++) {
p2.setCoord(i+1, p2.getCoord(i+1)+modified[i]);
}
return p2;
}
public Point withModifiedCoords(int direction) {
switch (direction) {
case 0:
return this.withModifiedCoords(0,-1);
case 1:
return this.withModifiedCoords(+1,-1);
case 2:
return this.withModifiedCoords(+1,0);
case 3:
return this.withModifiedCoords(+1,+1);
case 4:
return this.withModifiedCoords(0,+1);
case 5:
return this.withModifiedCoords(-1,+1);
case 6:
return this.withModifiedCoords(-1,0);
case 7:
return this.withModifiedCoords(-1,-1);
default:
return this.withModifiedCoords(0,0);
}
}
@Override
public Point clone(){
return new Point(Arrays.copyOf(coords, coords.length));
}
public boolean isAround9(Point point) {
int i = getCoord(1)-point.getCoord(1);
int j = getCoord(2)-point.getCoord(2);
return (i>=-1 && i<=1) || (j>=-1 || j<=1);
}
}

View File

@ -0,0 +1,168 @@
package com.bernard.cercloide.varSets;
import java.awt.Color;
import java.nio.file.Path;
import java.util.Arrays;
import com.bernard.cercloide.colorset.ColorSet;
import com.bernard.cercloide.theory.plan.Point;
public class CercloidWithGradientArgs {
Path imagePath;
Point[] foyers;
Double p;
ColorSet colorSet;
int width;
int height;
Color foyColor;
char foyCrossConvention;
int foyCrossSize7;
public CercloidWithGradientArgs(Path imagePath, Point[] foyers, Double p, ColorSet colorSet, int width, int height,
Color foyColor, char foyCrossConvention, int foyCrossSize7) {
this.imagePath = imagePath;
this.foyers = foyers;
this.p = p;
this.colorSet = colorSet;
this.width = width;
this.height = height;
this.foyColor = foyColor;
this.foyCrossConvention = foyCrossConvention;
this.foyCrossSize7 = foyCrossSize7;
}
public Path getImagePath() {
return imagePath;
}
public void setImagePath(Path imagePath) {
this.imagePath = imagePath;
}
public Point[] getFoyers() {
return foyers;
}
public void setFoyers(Point[] foyers) {
this.foyers = foyers;
}
public Double getP() {
return p;
}
public void setP(Double p) {
this.p = p;
}
public ColorSet getColorSet() {
return colorSet;
}
public void setColorSet(ColorSet colorSet) {
this.colorSet = colorSet;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public Color getFoyColor() {
return foyColor;
}
public void setFoyColor(Color foyColor) {
this.foyColor = foyColor;
}
public char getFoyCrossConvention() {
return foyCrossConvention;
}
public void setFoyCrossConvention(char foyCrossConvention) {
this.foyCrossConvention = foyCrossConvention;
}
public int getFoyCrossSize7() {
return foyCrossSize7;
}
public void setFoyCrossSize7(int foyCrossSize7) {
this.foyCrossSize7 = foyCrossSize7;
}
@Override
public String toString() {
return "CercloidWithGradientArgs [imagePath=" + imagePath + ", foyers=" + Arrays.toString(foyers) + ", p=" + p
+ ", colorSet=" + colorSet + ", width=" + width + ", height=" + height + ", foyColor=" + foyColor
+ ", foyCrossConvention=" + foyCrossConvention + ", foyCrossSize7=" + foyCrossSize7 + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((colorSet == null) ? 0 : colorSet.hashCode());
result = prime * result + ((foyColor == null) ? 0 : foyColor.hashCode());
result = prime * result + foyCrossConvention;
result = prime * result + foyCrossSize7;
result = prime * result + Arrays.hashCode(foyers);
result = prime * result + height;
result = prime * result + ((imagePath == null) ? 0 : imagePath.hashCode());
result = prime * result + ((p == null) ? 0 : p.hashCode());
result = prime * result + width;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CercloidWithGradientArgs other = (CercloidWithGradientArgs) obj;
if (colorSet != other.colorSet)
return false;
if (foyColor == null) {
if (other.foyColor != null)
return false;
} else if (!foyColor.equals(other.foyColor))
return false;
if (foyCrossConvention != other.foyCrossConvention)
return false;
if (foyCrossSize7 != other.foyCrossSize7)
return false;
if (!Arrays.equals(foyers, other.foyers))
return false;
if (height != other.height)
return false;
if (imagePath == null) {
if (other.imagePath != null)
return false;
} else if (!imagePath.equals(other.imagePath))
return false;
if (p == null) {
if (other.p != null)
return false;
} else if (!p.equals(other.p))
return false;
if (width != other.width)
return false;
return true;
}
}

View File

@ -0,0 +1,357 @@
package com.bernard.cercloide.view;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import com.bernard.cercloide.factory.JOptPaneCreator;
import com.bernard.cercloide.factory.NumberAnalyser;
import com.bernard.cercloide.theory.iter.IterEnsemble;
import com.bernard.cercloide.theory.iter.IterIntervale;
import com.bernard.cercloide.theory.iter.IterOptions;
public class LoopSetFrame2 extends JFrame {
private static final long serialVersionUID = -6114568748667688509L;
public static final String ENSEMBLE = "ensemble";
public static final String INTERVALE = "intervale";
public static final String RAND_ENSEMBLE = "rand_ensemble";
public static final String RAND_INTERVALE = "rand_intervale";
ButtonGroup choiceGroup;
JRadioButton choiceEnsemble, choiceIntervale, choiceRandEnsemble, choiceRandIntervale;
JTextField intervaleA, intervaleB, intervalePas, randIntervaleA, randIntervaleB, randIntervalePas, randIntervaleMal;
JTextField ensemble, randEnsemble, randEnsembleMal;
JPanel settingsPanel;
CardLayout settingsCard;
JButton finish;
boolean finished;
IterOptions output;
GlobalListener globalListener = new GlobalListener();
public LoopSetFrame2(IterOptions pIter) {
finished = false;
this.setTitle("Cercloïdator");
this.setSize(1000, 110);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
choiceEnsemble.setSelected(false);
choiceIntervale.setSelected(false);
choiceRandEnsemble.setSelected(false);
choiceRandIntervale.setSelected(false);
if (pIter instanceof IterEnsemble) {
IterEnsemble iterEnsemble = (IterEnsemble) pIter;
String[] out = new String[iterEnsemble.getValues().length];
for (int i = 0; i < iterEnsemble.getValues().length; i++) {
out[i] = iterEnsemble.getValues()[i].toString();
}
if (iterEnsemble.getRandMal() == -1) {
ensemble.setText(String.join(",", out));
choiceEnsemble.setSelected(true);
settingsCard.show(settingsPanel, ENSEMBLE);
} else {
randEnsemble.setText(String.join(",", out));
choiceRandEnsemble.setSelected(true);
settingsCard.show(settingsPanel, RAND_ENSEMBLE);
randEnsembleMal.setText(Integer.toString(iterEnsemble.getRandMal(), 10));
}
} else if (pIter instanceof IterIntervale) {
IterIntervale iterIntervale = (IterIntervale) pIter;
if (iterIntervale.getRandNumber() == -1) {
intervaleA.setText(iterIntervale.getA().toString());
intervaleB.setText(iterIntervale.getB().toString());
intervalePas.setText(iterIntervale.getPas().toString());
choiceIntervale.setSelected(true);
settingsCard.show(settingsPanel, INTERVALE);
} else {
randIntervaleA.setText(iterIntervale.getA().toString());
randIntervaleB.setText(iterIntervale.getB().toString());
randIntervalePas.setText(iterIntervale.getPas().toString());
choiceRandIntervale.setSelected(true);
settingsCard.show(settingsPanel, RAND_INTERVALE);
randIntervaleMal.setText(Integer.toString(iterIntervale.getRandNumber(), 10));
}
} else {
choiceEnsemble.setSelected(true);
}
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private void init() {
final Font generalFont = new Font("OCR A Extended", Font.ITALIC, 20);
JPanel choicePanel = new JPanel();
choicePanel.setLayout(new BoxLayout(choicePanel, BoxLayout.LINE_AXIS));
choiceGroup = new ButtonGroup();
choiceEnsemble = new JRadioButton("{a,b,c}");
choiceEnsemble.addActionListener(globalListener);
choiceEnsemble.setSelected(true);
choiceGroup.add(choiceEnsemble);
choiceIntervale = new JRadioButton("[a;b[");
choiceIntervale.addActionListener(globalListener);
choiceGroup.add(choiceIntervale);
choiceRandEnsemble = new JRadioButton("RAND( {a,b,c} )");
choiceRandEnsemble.addActionListener(globalListener);
choiceGroup.add(choiceRandEnsemble);
choiceRandIntervale = new JRadioButton("RAND( [a;b[ )");
choiceRandIntervale.addActionListener(globalListener);
choiceGroup.add(choiceRandIntervale);
choicePanel.add(choiceEnsemble);
choicePanel.add(choiceIntervale);
choicePanel.add(choiceRandEnsemble);
choicePanel.add(choiceRandIntervale);
settingsPanel = new JPanel();
settingsCard = new CardLayout();
settingsPanel.setLayout(settingsCard);
JPanel ensemblePanel = new JPanel();
ensemblePanel.setLayout(new BorderLayout());
JLabel ensembleSelectionLabel = new JLabel("Ensemble : {");
ensembleSelectionLabel.setFont(generalFont);
ensemble = new JTextField();
ensemble.setFont(generalFont);
ensemble.setToolTipText("Sous la forme \"a,b,c,d,e,f\"");
JLabel ensembleSelectionLabelEnd = new JLabel("}");
ensembleSelectionLabelEnd.setFont(generalFont);
ensemblePanel.add(ensembleSelectionLabel, BorderLayout.WEST);
ensemblePanel.add(ensembleSelectionLabelEnd, BorderLayout.EAST);
ensemblePanel.add(ensemble, BorderLayout.CENTER);
JPanel intervalePanel = new JPanel();
intervalePanel.setLayout(new BoxLayout(intervalePanel, BoxLayout.LINE_AXIS));
JLabel intervaleLabel1 = new JLabel("Parcourir l'intervale [");
intervaleLabel1.setFont(generalFont);
intervaleA = new JTextField();
intervaleA.setFont(generalFont);
JLabel intervaleLabel2 = new JLabel(";");
intervaleLabel2.setFont(generalFont);
intervaleB = new JTextField();
intervaleB.setFont(generalFont);
JLabel intervaleLabel3 = new JLabel("[ avec un pas de ");
intervaleLabel3.setFont(generalFont);
intervalePas = new JTextField();
intervalePas.setFont(generalFont);
intervalePanel.add(intervaleLabel1);
intervalePanel.add(intervaleA);
intervalePanel.add(intervaleLabel2);
intervalePanel.add(intervaleB);
intervalePanel.add(intervaleLabel3);
intervalePanel.add(intervalePas);
JPanel randEnsemblePanel = new JPanel();
randEnsemblePanel.setLayout(new BoxLayout(randEnsemblePanel, BoxLayout.LINE_AXIS));
JLabel randEnsembleSelectionLabel = new JLabel("Nombre dans l'ensemble : {");
randEnsembleSelectionLabel.setFont(generalFont);
randEnsemble = new JTextField();
randEnsemble.setFont(generalFont);
randEnsemble.setToolTipText("Sous la forme \"a,b,c,d,e,f\"");
JLabel randEnsembleSelectionLabelEnd = new JLabel("}");
randEnsembleSelectionLabelEnd.setFont(generalFont);
JLabel randEnsembleLabel4 = new JLabel(", ");
randEnsembleLabel4.setFont(generalFont);
randEnsembleMal = new JTextField();
randEnsembleMal.setFont(generalFont);
JLabel randEnsembleLabel5 = new JLabel("fois");
randEnsembleLabel5.setFont(generalFont);
randEnsemblePanel.add(randEnsembleSelectionLabel);
randEnsemblePanel.add(randEnsembleSelectionLabelEnd);
randEnsemblePanel.add(randEnsemble);
randEnsemblePanel.add(randEnsembleLabel4);
randEnsemblePanel.add(randEnsembleMal);
randEnsemblePanel.add(randEnsembleLabel5);
JPanel randIntervalePanel = new JPanel();
randIntervalePanel.setLayout(new BoxLayout(randIntervalePanel, BoxLayout.LINE_AXIS));
JLabel randIntervaleLabel1 = new JLabel("Nombre dans l'intervale [");
randIntervaleLabel1.setFont(generalFont);
randIntervaleA = new JTextField();
randIntervaleA.setFont(generalFont);
JLabel randIntervaleLabel2 = new JLabel(";");
randIntervaleLabel2.setFont(generalFont);
randIntervaleB = new JTextField();
randIntervaleB.setFont(generalFont);
JLabel randIntervaleLabel3 = new JLabel("[ avec un pas de ");
randIntervaleLabel3.setFont(generalFont);
randIntervalePas = new JTextField();
randIntervalePas.setFont(generalFont);
JLabel randIntervaleLabel4 = new JLabel(", ");
randIntervaleLabel4.setFont(generalFont);
randIntervaleMal = new JTextField();
randIntervaleMal.setFont(generalFont);
JLabel randIntervaleLabel5 = new JLabel("fois");
randIntervaleLabel5.setFont(generalFont);
randIntervalePanel.add(randIntervaleLabel1);
randIntervalePanel.add(randIntervaleA);
randIntervalePanel.add(randIntervaleLabel2);
randIntervalePanel.add(randIntervaleB);
randIntervalePanel.add(randIntervaleLabel3);
randIntervalePanel.add(randIntervalePas);
randIntervalePanel.add(randIntervaleLabel4);
randIntervalePanel.add(randIntervaleMal);
randIntervalePanel.add(randIntervaleLabel5);
settingsPanel.add(ensemblePanel, ENSEMBLE);
settingsPanel.add(intervalePanel, INTERVALE);
settingsPanel.add(randEnsemblePanel, RAND_ENSEMBLE);
settingsPanel.add(randIntervalePanel, RAND_INTERVALE);
settingsCard.show(settingsPanel, ENSEMBLE);
finish = new JButton("Terminé !");
finish.setFont(generalFont);
finish.addActionListener(globalListener);
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.PAGE_AXIS));
this.getContentPane().add(choicePanel);
this.getContentPane().add(settingsPanel);
this.getContentPane().add(finish);
}
public IterOptions waitFinish() {
while (!finished) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return output;
}
private IterOptions testVars() {
if (choiceEnsemble.isSelected()) {
List<Double> doubletab = new ArrayList<Double>();
try {
for (String s : ensemble.getText().split(",")) {
doubletab.add(NumberAnalyser.parseDouble(s));
}
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("L'ensemble ne peut pas etre égal à " + ensemble.getText());
return null;
}
return new IterEnsemble((Double[]) doubletab.toArray(new Double[doubletab.size()]), -1);
} else if (choiceIntervale.isSelected()) {
Double iA, iB, iP;
try {
iA = NumberAnalyser.parseDouble(intervaleA.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("L'intervale ne peut pas partir de " + intervaleA.getText());
return null;
}
try {
iB = NumberAnalyser.parseDouble(intervaleB.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("L'intervale ne peut pas finir à " + intervaleB.getText());
return null;
}
try {
iP = NumberAnalyser.parseDouble(intervalePas.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("L'intervale ne peut pas avoir un pas de " + intervalePas.getText());
return null;
}
return new IterIntervale(iA, iB, iP, -1);
} else if (choiceRandEnsemble.isSelected()) {
List<Double> doubletab = new ArrayList<Double>();
try {
for (String s : randEnsemble.getText().split(",")) {
doubletab.add(NumberAnalyser.parseDouble(s));
}
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("L'ensemble ne peut pas etre égal à " + randEnsemble.getText());
return null;
}
int rand = -1;
try {
rand = NumberAnalyser.parseLong(randEnsembleMal.getText()).intValue();
} catch (NumberFormatException e) {
JOptPaneCreator
.argumentError("L'iteration ne peut pas s'effectuer " + randEnsembleMal.getText() + " fois");
return null;
}
return new IterEnsemble((Double[]) doubletab.toArray(new Double[doubletab.size()]), rand);
} else if (choiceRandIntervale.isSelected()) {
Double iA, iB, iP;
try {
iA = NumberAnalyser.parseDouble(randIntervaleA.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("L'intervale ne peut pas partir de " + randIntervaleA.getText());
return null;
}
try {
iB = NumberAnalyser.parseDouble(randIntervaleB.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("L'intervale ne peut pas finir à " + randIntervaleB.getText());
return null;
}
try {
iP = NumberAnalyser.parseDouble(randIntervalePas.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("L'intervale ne peut pas avoir un pas de " + randIntervalePas.getText());
return null;
}
int rand = -1;
try {
rand = NumberAnalyser.parseLong(randIntervaleMal.getText()).intValue();
} catch (NumberFormatException e) {
JOptPaneCreator
.argumentError("L'iteration ne peut pas s'effectuer " + randIntervaleMal.getText() + " fois");
return null;
}
return new IterIntervale(iA, iB, iP, rand);
} else {
System.err.println("Destruction de la matrice génériciellement créelle");
}
return null;
}
class GlobalListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == finish) {
output = testVars();
if (output != null) {
finished = true;
setVisible(false);
}
} else if (e.getSource() == choiceEnsemble) {
settingsCard.show(settingsPanel, ENSEMBLE);
} else if (e.getSource() == choiceIntervale) {
settingsCard.show(settingsPanel, INTERVALE);
} else if (e.getSource() == choiceRandEnsemble) {
settingsCard.show(settingsPanel, RAND_ENSEMBLE);
} else if (e.getSource() == choiceRandIntervale) {
settingsCard.show(settingsPanel, RAND_INTERVALE);
}
}
}
}

View File

@ -0,0 +1,102 @@
package com.bernard.cercloide.view;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
public class LoopUtilFrame extends JFrame {
private static final long serialVersionUID = 7982664157134004776L;
JCheckBox pVar, wVar, hVar, rVar, fVar;
JRadioButton withRay;
JButton go = new JButton();
GlobalListener globalListener = new GlobalListener();
public LoopUtilFrame() {
this.setTitle("Cercloïdator");
this.setSize(600, 300);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private void init() {
final Font generalFont = new Font("OCR A Extended", Font.ITALIC, 20);
JPanel whatToChangePane = new JPanel();
whatToChangePane.setLayout(new BoxLayout(whatToChangePane, BoxLayout.PAGE_AXIS));
JLabel whatToChangeLabel = new JLabel("Quelles sont les variables à changer ?");
whatToChangeLabel.setFont(generalFont);
pVar = new JCheckBox("P");
pVar.setFont(generalFont);
wVar = new JCheckBox("Largeur");
wVar.setFont(generalFont);
hVar = new JCheckBox("Hauteur");
hVar.setFont(generalFont);
withRay = new JRadioButton("Avec un rayon ?");
withRay.setFont(generalFont);
withRay.addActionListener(globalListener);
rVar = new JCheckBox("Rayon");
rVar.setFont(generalFont);
rVar.setVisible(false);
fVar = new JCheckBox("Fourchette");
fVar.setFont(generalFont);
fVar.setVisible(false);
go = new JButton("Lancer");
go.setFont(generalFont);
go.addActionListener(globalListener);
whatToChangePane.add(pVar);
whatToChangePane.add(wVar);
whatToChangePane.add(hVar);
whatToChangePane.add(withRay);
whatToChangePane.add(rVar);
whatToChangePane.add(fVar);
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(whatToChangeLabel, BorderLayout.NORTH);
this.getContentPane().add(whatToChangePane, BorderLayout.CENTER);
this.getContentPane().add(go, BorderLayout.SOUTH);
}
class GlobalListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == go) {
Thread t = new Thread(new Runnable() {
public void run() {
new LoopUtilVarSet(withRay.isSelected(), pVar.isSelected(), wVar.isSelected(),
hVar.isSelected(), rVar.isSelected(), fVar.isSelected());
}
});
t.start();
setVisible(false);
} else if (e.getSource() == withRay) {
if (withRay.isSelected()) {
rVar.setVisible(true);
fVar.setVisible(true);
} else {
rVar.setVisible(false);
fVar.setVisible(false);
}
} else {
System.err.println("Non Catched Element");
}
}
}
}

View File

@ -0,0 +1,557 @@
package com.bernard.cercloide.view;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import com.bernard.cercloide.colorset.ColorSet;
import com.bernard.cercloide.factory.JOptPaneCreator;
import com.bernard.cercloide.factory.LoopingImageCreator;
import com.bernard.cercloide.factory.NumberAnalyser;
import com.bernard.cercloide.theory.iter.IterEnsemble;
import com.bernard.cercloide.theory.iter.IterOptions;
import com.bernard.cercloide.theory.plan.Point;
public class LoopUtilVarSet extends JFrame {
private static final long serialVersionUID = -1796487518231431773L;
private static final String WITHABSOLUTEVALUE = "withAV";
private static final String WITHRELATIVEVALUE = "withRV";
private static final String WITHNOVALUE = "withNV";
JButton setFoyers;
JTextField getP;
JButton dim1, dim2, dim3;
JTextField rayon, rayonFourch;
JTextField widthAsk, heightAsk;
ButtonGroup crossGroup;
JRadioButton crossDefault, crossAbsolute, crossRelative, noCross;
JTextField crossAbsoluteOut, crossRelativeOut;
JPanel crossOutputPane;
CardLayout crossActionLayout;
JComboBox<ColorSet> colorSet;
JColorChooser rayonColorChooser;
JPanel colorPanel;
CardLayout colorLayout;
JButton run;
LoopSetFrame2 loopSetFrame;
JButton pVarier, wVarier, hVarier, rVarier, fVarier;
IterOptions pIter = null, wIter = null, hIter = null, rIter = null, fIter = null;
boolean withRayon, pVar, wVar, hVar, rVar, fVar;
Point[] settedFoyers;
SelectPointsPos spp;
GlobalListener globalListener = new GlobalListener();
public LoopUtilVarSet(boolean rayon, boolean pVariable, boolean wVariable, boolean hVariable, boolean rVariable,
boolean fVariable) {
pVar = pVariable;
wVar = wVariable;
hVar = hVariable;
rVar = rVariable;
fVar = fVariable;
withRayon = rayon;
this.setTitle("Cercloïdator");
this.setSize(1000, 500);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
settedFoyers = new Point[0];
init();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void init() {
this.setContentPane(new JPanel());
final Font generalFont = new Font("OCR A Extended", Font.ITALIC, 20);
settedFoyers = new Point[0];
JPanel foyersPanel = new JPanel();
foyersPanel.setLayout(new BorderLayout());
setFoyers = new JButton("Régler les Foyers");
setFoyers.setFont(generalFont);
setFoyers.addActionListener(globalListener);
foyersPanel.add(setFoyers, BorderLayout.CENTER);
JPanel pPanel = new JPanel();
pPanel.setLayout(new BorderLayout());
if (pVar) {
pVarier = new JButton("Configurer P");
pVarier.setFont(generalFont);
pVarier.addActionListener(globalListener);
pPanel.add(pVarier, BorderLayout.CENTER);
} else {
JLabel pLabel = new JLabel("P =");
pLabel.setFont(generalFont);
getP = new JTextField();
getP.setText("2");
getP.setToolTipText("ex: 2");
pPanel.add(pLabel, BorderLayout.WEST);
pPanel.add(getP, BorderLayout.CENTER);
}
JPanel dimPanel = new JPanel();
dimPanel.setLayout(new BorderLayout());
JLabel dimLabel = new JLabel("Dimension :");
dimLabel.setFont(generalFont);
JPanel dimChoicePanel = new JPanel();
dimChoicePanel.setLayout(new GridLayout(1, 3));
dim1 = new JButton("1");
dim1.setToolTipText("Not implemented(yet)");
dim1.setEnabled(false);
dim2 = new JButton("2");
dim3 = new JButton("3");
dim3.setToolTipText("Not implemented(yet)");
dim3.setEnabled(false);
dimChoicePanel.add(dim1);
dimChoicePanel.add(dim2);
dimChoicePanel.add(dim3);
dimPanel.add(dimLabel, BorderLayout.WEST);
dimPanel.add(dimChoicePanel, BorderLayout.CENTER);
JPanel rayonPanel = new JPanel();
if (withRayon) {
rayonPanel.setLayout(new BoxLayout(rayonPanel, BoxLayout.LINE_AXIS));
if (rVar) {
rVarier = new JButton("Configurer le rayon");
rVarier.setFont(generalFont);
rVarier.addActionListener(globalListener);
rayonPanel.add(rVarier);
} else {
JLabel rayonLabel = new JLabel("Rayon :");
rayonLabel.setFont(generalFont);
rayon = new JTextField();
rayon.setToolTipText("ex: 403");
rayonPanel.add(rayonLabel);
rayonPanel.add(rayon);
}
if (fVar) {
fVarier = new JButton("Configurer la fourchette du rayon");
fVarier.setFont(generalFont);
fVarier.addActionListener(globalListener);
rayonPanel.add(fVarier);
} else {
JLabel rayonFourchLabel = new JLabel("Fourchette =/- :");
rayonFourchLabel.setFont(generalFont);
rayonFourch = new JTextField();
rayonFourch.setText("1");
rayonFourch.setToolTipText("ex: 3");
rayonPanel.add(rayonFourchLabel);
rayonPanel.add(rayonFourch);
}
}
JPanel sizePanel = new JPanel();
sizePanel.setLayout(new BoxLayout(sizePanel, BoxLayout.LINE_AXIS));
JLabel sizeLabel = new JLabel("Largeur/Hauteur :");
sizeLabel.setFont(generalFont);
sizePanel.add(sizeLabel);
if (wVar) {
wVarier = new JButton("Configurer la largeur");
wVarier.setFont(generalFont);
wVarier.addActionListener(globalListener);
sizePanel.add(wVarier);
} else {
widthAsk = new JTextField();
widthAsk.setText("500");
sizePanel.add(widthAsk);
}
JLabel sizeSeparator = new JLabel("/");
sizeSeparator.setFont(generalFont);
sizePanel.add(sizeSeparator);
if (hVar) {
hVarier = new JButton("Configurer la hauteur");
hVarier.setFont(generalFont);
hVarier.addActionListener(globalListener);
sizePanel.add(hVarier);
} else {
heightAsk = new JTextField();
heightAsk.setText("500");
sizePanel.add(heightAsk);
}
JPanel crossPane = new JPanel();
crossPane.setLayout(new BorderLayout());
JPanel crossRadioPane = new JPanel();
crossRadioPane.setLayout(new BoxLayout(crossRadioPane, BoxLayout.LINE_AXIS));
JLabel crossRadioLabel = new JLabel("Marquage des foyers :");
crossRadioLabel.setFont(generalFont);
crossDefault = new JRadioButton("Par défaut");
crossDefault.setFont(generalFont);
crossDefault.addActionListener(globalListener);
crossAbsolute = new JRadioButton("Absolu");
crossAbsolute.setFont(generalFont);
crossAbsolute.addActionListener(globalListener);
crossRelative = new JRadioButton("Relatif");
crossRelative.setFont(generalFont);
crossRelative.addActionListener(globalListener);
noCross = new JRadioButton("Aucun");
noCross.setFont(generalFont);
noCross.addActionListener(globalListener);
crossDefault.setSelected(true);
crossGroup = new ButtonGroup();
crossGroup.add(crossDefault);
crossGroup.add(crossAbsolute);
crossGroup.add(crossRelative);
crossGroup.add(noCross);
crossRadioPane.add(crossRadioLabel);
crossRadioPane.add(crossDefault);
crossRadioPane.add(crossAbsolute);
crossRadioPane.add(crossRelative);
crossRadioPane.add(noCross);
crossPane.add(crossRadioPane, BorderLayout.CENTER);
crossOutputPane = new JPanel();
crossActionLayout = new CardLayout();
crossOutputPane.setLayout(crossActionLayout);
crossAbsoluteOut = new JTextField("2");
crossAbsoluteOut.setToolTipText("Taille de chaque branche *2 pour hauteur=largeur=500");
crossAbsoluteOut.setFont(generalFont);
crossRelativeOut = new JTextField("2");
crossRelativeOut.setToolTipText("Taille de chaque branche pour hauteur=largeur=500");
crossRelativeOut.setFont(generalFont);
crossOutputPane.add(crossAbsoluteOut, WITHABSOLUTEVALUE);
crossOutputPane.add(crossRelativeOut, WITHRELATIVEVALUE);
crossOutputPane.add(new JPanel(), WITHNOVALUE);
crossActionLayout.show(crossOutputPane, WITHNOVALUE);
crossPane.add(crossOutputPane, BorderLayout.SOUTH);
colorPanel = new JPanel();
colorPanel.setLayout(new BorderLayout());
if (withRayon) {
JLabel colorWithRLabel = new JLabel("Couleur du rayon :");
colorWithRLabel.setFont(generalFont);
rayonColorChooser = new JColorChooser();
rayonColorChooser.setFont(generalFont);
colorPanel.add(colorWithRLabel, BorderLayout.WEST);
colorPanel.add(rayonColorChooser, BorderLayout.CENTER);
} else {
JPanel colorPanelIn = new JPanel();
colorPanelIn.setLayout(new BorderLayout());
JLabel colorWithoutRLabel = new JLabel("Jeu de couleurs :");
colorWithoutRLabel.setFont(generalFont);
colorSet = new JComboBox<>(ColorSet.values());
colorSet.setPreferredSize(new Dimension(625, 32));
colorPanelIn.add(colorWithoutRLabel, BorderLayout.WEST);
colorPanelIn.add(colorSet, BorderLayout.CENTER);
colorPanel.add(colorPanelIn, BorderLayout.NORTH);
}
JPanel runPan = new JPanel();
runPan.setLayout(new BorderLayout());
run = new JButton("Lancer le dessin");
run.addActionListener(globalListener);
runPan.add(run, BorderLayout.CENTER);
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.PAGE_AXIS));
this.getContentPane().add(foyersPanel);
this.getContentPane().add(pPanel);
this.getContentPane().add(dimPanel);
this.getContentPane().add(rayonPanel);
this.getContentPane().add(sizePanel);
this.getContentPane().add(crossPane);
this.getContentPane().add(colorPanel);
this.getContentPane().add(runPan);
this.pack();
}
public boolean testVars() {
if (!pVar) {
try {
NumberAnalyser.parseDouble(getP.getText());
} catch (NumberFormatException e) {
if (getP.getText().toUpperCase().equals("+INF") || getP.getText().toUpperCase().equals("-INF")) {
} else {
JOptPaneCreator.argumentError("P ne peut pas être égal à " + getP.getText());
return false;
}
}
}
if (withRayon) {
if (!rVar) {
try {
NumberAnalyser.parseLong(rayon.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("Le rayon ne peut pas être égal à " + rayon.getText());
return false;
}
}
if (!fVar) {
try {
NumberAnalyser.parseLong(rayonFourch.getText());
} catch (NumberFormatException e) {
JOptPaneCreator
.argumentError("La fourchette du rayon ne peut pas être égale à " + rayonFourch.getText());
return false;
}
}
}
if (!wVar) {
try {
NumberAnalyser.parseLong(widthAsk.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("La largeur ne peut pas être égale à " + widthAsk.getText());
return false;
}
}
if (!hVar) {
try {
NumberAnalyser.parseLong(heightAsk.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError("La hauteur ne peut pas être égale à " + heightAsk.getText());
return false;
}
}
if (crossRelative.isSelected()) {
try {
NumberAnalyser.parseLong(crossRelativeOut.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError(
"La taille relative de la croix ne peut pas être égale à " + crossRelativeOut.getText());
return false;
}
}
if (crossAbsolute.isSelected()) {
try {
NumberAnalyser.parseLong(crossAbsoluteOut.getText());
} catch (NumberFormatException e) {
JOptPaneCreator.argumentError(
"Le taille absolue de la croix ne peut pas être égale à " + crossAbsoluteOut.getText());
return false;
}
}
if (settedFoyers.length == 0) {
int option = JOptionPane.showConfirmDialog(null,
"Aucun foyer n'a été placé! Voulez-vous quand même générer l'image ?", "Aucun foyer",
JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if (option != JOptionPane.YES_OPTION) {
return false;
}
}
if (pIter == null && pVar) {
JOptPaneCreator.argumentError("Vous devez régler l'itération de P");
}
if (wIter == null && wVar) {
JOptPaneCreator.argumentError("Vous devez régler l'itération de la largeur");
}
if (hIter == null && hVar) {
JOptPaneCreator.argumentError("Vous devez régler l'itération de la hauteur");
}
if (rIter == null && rVar) {
JOptPaneCreator.argumentError("Vous devez régler l'itération du rayon");
}
if (fIter == null && fVar) {
JOptPaneCreator.argumentError("Vous devez régler l'itération de la fourchette");
}
return true;
}
class GlobalListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == setFoyers) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int w = NumberAnalyser.parseLong(widthAsk.getText()).intValue(),
h = NumberAnalyser.parseLong(heightAsk.getText()).intValue();
spp = new SelectPointsPos(w, h, settedFoyers);
setEnabled(false);
try {
Thread.sleep(250);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
settedFoyers = spp.waitFinish();
setEnabled(true);
}
});
t.start();
} else if (e.getSource() == crossDefault) {
crossActionLayout.show(crossOutputPane, WITHNOVALUE);
} else if (e.getSource() == crossAbsolute) {
crossActionLayout.show(crossOutputPane, WITHABSOLUTEVALUE);
} else if (e.getSource() == crossRelative) {
crossActionLayout.show(crossOutputPane, WITHRELATIVEVALUE);
} else if (e.getSource() == noCross) {
crossActionLayout.show(crossOutputPane, WITHNOVALUE);
} else if (e.getSource() == pVarier) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
loopSetFrame = new LoopSetFrame2(pIter);
setEnabled(false);
try {
Thread.sleep(250);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
pIter = loopSetFrame.waitFinish();
setEnabled(true);
}
});
t.start();
} else if (e.getSource() == wVarier) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
loopSetFrame = new LoopSetFrame2(wIter);
setEnabled(false);
try {
Thread.sleep(250);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
wIter = loopSetFrame.waitFinish();
setEnabled(true);
}
});
t.start();
} else if (e.getSource() == hVarier) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
loopSetFrame = new LoopSetFrame2(wIter);
setEnabled(false);
try {
Thread.sleep(250);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
pIter = loopSetFrame.waitFinish();
setEnabled(true);
}
});
t.start();
} else if (e.getSource() == rVarier) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
loopSetFrame = new LoopSetFrame2(rIter);
setEnabled(false);
try {
Thread.sleep(250);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
rIter = loopSetFrame.waitFinish();
setEnabled(true);
}
});
t.start();
} else if (e.getSource() == fVarier) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
loopSetFrame = new LoopSetFrame2(fIter);
setEnabled(false);
try {
Thread.sleep(250);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
fIter = loopSetFrame.waitFinish();
setEnabled(true);
}
});
t.start();
} else if (e.getSource() == run) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
if (testVars()) {
if (!pVar) {
pIter = new IterEnsemble(new Double[] { NumberAnalyser.parseDouble(getP.getText()) },
-1);
}
if (!wVar) {
wIter = new IterEnsemble(
new Double[] { NumberAnalyser.parseDouble(widthAsk.getText()) }, -1);
}
if (!hVar) {
hIter = new IterEnsemble(
new Double[] { NumberAnalyser.parseDouble(heightAsk.getText()) }, -1);
}
if (!rVar) {
if (withRayon) {
rIter = new IterEnsemble(
new Double[] { NumberAnalyser.parseDouble(rayon.getText()) }, -1);
} else {
rIter = new IterEnsemble(new Double[] { 1.0 }, -1);
}
}
if (!fVar) {
if (withRayon) {
fIter = new IterEnsemble(
new Double[] { NumberAnalyser.parseDouble(rayonFourch.getText()) }, -1);
} else {
fIter = new IterEnsemble(new Double[] { 1.0 }, -1);
}
}
char crossConv = 'µ';
int crossNum = -1;
if (crossDefault.isSelected()) {
crossConv = 'd';
crossNum = 0;
} else if (crossAbsolute.isSelected()) {
crossConv = 'a';
crossNum = NumberAnalyser.parseLong(crossAbsoluteOut.getText()).intValue();
} else if (crossRelative.isSelected()) {
crossConv = 'r';
crossNum = NumberAnalyser.parseLong(crossRelativeOut.getText()).intValue();
} else if (noCross.isSelected()) {
crossConv = 'n';
crossNum = 0;
}
LoopingImageCreator.createImageWithLoopedParams(pIter, wIter, hIter, rIter, fIter,
withRayon, settedFoyers, (ColorSet) colorSet.getSelectedItem(), Color.RED,
crossConv, crossNum,
(rayonColorChooser == null) ? Color.BLACK : rayonColorChooser.getColor());
}
}
});
t.start();
setVisible(false);
}
}
}
}

View File

@ -0,0 +1,87 @@
package com.bernard.cercloide.view;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import com.bernard.cercloide.main.Main;
public class MainFrame extends JFrame
{
private static final long serialVersionUID = 1814260752002876933L;
JButton singleImageButton, loopButton, quitButton;
GlobalListener globalListener = new GlobalListener();
public MainFrame()
{
this.setTitle("Cercloïdator");
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
this.setVisible(true);
}
private void init()
{
singleImageButton = new JButton("Générateur de cercloids");
singleImageButton.addActionListener(globalListener);
loopButton = new JButton("Ouvrir le loopUtil");
loopButton.addActionListener((e) ->
{
Thread t = new Thread(new Runnable()
{
public void run()
{
Main.loopUtilFrame = new LoopUtilFrame();
}
});
t.start();
setVisible(false);
});
quitButton = new JButton("Quitter");
quitButton.addActionListener((e) -> System.exit(0));
GridLayout gl = new GridLayout(3, 1);
gl.setHgap(20);
gl.setVgap(40);
this.getContentPane().setLayout(gl);
this.getContentPane().add(singleImageButton);
this.getContentPane().add(loopButton);
this.getContentPane().add(quitButton);
}
private class GlobalListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == singleImageButton)
{
Thread t = new Thread(new Runnable()
{
public void run()
{
Main.varSetFrame = new VarSetFrame();
}
});
t.start();
setVisible(false);
}
else
{
System.err.println("ERROR : Qqn à déclenché l'actionPerformed mais il a pas été catché");
}
}
}
}

View File

@ -0,0 +1,314 @@
package com.bernard.cercloide.view;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JWindow;
import com.bernard.cercloide.ViewUtil;
import com.bernard.cercloide.main.Config;
import com.bernard.cercloide.main.Sprach;
import com.bernard.cercloide.theory.plan.Point;
public class SelectPointsPos extends JWindow
{
// JFESH
private static final long serialVersionUID = 8716115807757645201L;
private static final String GRAPHIC_PAN = "graphics", TABBED_PAN = "tab";
Point[] selectedFoyers;
CardLayout pointsGetterLayout;
ClickDetectPanel clickDetect;
PointsGetterTabPanel tabGetter;
/**
* 'g'->graphics
* 't'->tableau
*/
static char mode = 'g';
JButton finish, removeLast, switchMode;
int outWidght, outHeight;
boolean finished;
GlobalListener globalListener = new GlobalListener();
public static final Point[] adapt(Point[] toAdapt, int outWidght, int outHeight)
{
List<Point> out = new ArrayList<>();
for(Point point : toAdapt)
{
Point newPoint = new Point((outWidght / 500) * point.getCoord(1), (outHeight / 500) * point.getCoord(2));
out.add(newPoint);
}
return (Point[])out.toArray(new Point[out.size()]);
}
public SelectPointsPos(int outWidght, int outHeight, Point[] lastSelection)
{
this.finished = false;
this.setSize(500, 600);
this.setLocationRelativeTo(null);
this.setAlwaysOnTop(true);
this.outWidght = outWidght;
this.outHeight = outHeight;
this.selectedFoyers = lastSelection;
init();
this.setVisible(true);
}
private void init()
{
JPanel payLoadPan = new JPanel();
pointsGetterLayout = new CardLayout();
payLoadPan.setLayout(pointsGetterLayout);
clickDetect = new ClickDetectPanel();
clickDetect.setPreferredSize(new Dimension(500, 500));
payLoadPan.add(clickDetect, GRAPHIC_PAN);
tabGetter = new PointsGetterTabPanel();
tabGetter.setPreferredSize(new Dimension(500, 500));
payLoadPan.add(tabGetter, TABBED_PAN);
JPanel buttonsPanel = new JPanel();
removeLast = new JButton("Supprimer un point");
removeLast.addActionListener(globalListener);
removeLast.setEnabled(selectedFoyers.length != 0);
finish = new JButton("Terminé");
finish.addActionListener(globalListener);
switchMode = new JButton((mode == 'g') ? Sprach.tabMode : Sprach.graphMode);
switchMode.addActionListener((e) ->
{
if(mode == 'g')
{
tabGetter.genDisplay();
mode = 't';
pointsGetterLayout.show(payLoadPan, TABBED_PAN);
switchMode.setText(Sprach.graphMode);
ViewUtil.printPanel(this.getRootPane());
}
else if(mode == 't')
{
mode = 'g';
pointsGetterLayout.show(payLoadPan, GRAPHIC_PAN);
switchMode.setText(Sprach.tabMode);
}
else
{
throw new IllegalStateException("Le perroquet jovial entraine un hamburger gluant");
}
this.repaint();
});
buttonsPanel.add(removeLast);
buttonsPanel.add(switchMode);
buttonsPanel.add(finish);
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
this.getContentPane().add(payLoadPan, BorderLayout.CENTER);
pointsGetterLayout.show(payLoadPan, (mode == 'g') ? GRAPHIC_PAN : TABBED_PAN);
this.pack();
this.getRootPane().validate();
}
public Point[] waitFinish()
{
while(!finished)
{
try
{
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
return selectedFoyers;
}
public class GlobalListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == removeLast)
{
selectedFoyers = Arrays.copyOf(selectedFoyers, selectedFoyers.length - 1);
removeLast.setEnabled(selectedFoyers.length != 0);
repaint();
}
else if(e.getSource() == finish)
{
finished = true;
setVisible(false);
}
}
}
public class PointsGetterTabPanel extends JPanel
{
//JFESH
private static final long serialVersionUID = -8114335421442093996L;
JTextField[][] entries;
int dimension = 2;
JPanel inside;
public PointsGetterTabPanel()
{
genDisplay();
}
public void genDisplay(){
System.out.println(Arrays.toString(selectedFoyers));
this.entries = new JTextField[selectedFoyers.length][dimension];
GridLayout layout = new GridLayout(selectedFoyers.length,dimension);
try{this.remove(inside);}catch(NullPointerException e){}
inside = new JPanel();
inside.setLayout(layout);
for(int i = 0; i < selectedFoyers.length; i++)
{
Point adapted = new Point((outWidght / 500) * selectedFoyers[i].getCoord(1), (outHeight / 500) * selectedFoyers[i].getCoord(2));
for(int j = 0; j < dimension; j++)
{
this.entries[i][j] = new JTextField();
this.entries[i][j].setText(Double.toString(adapted.getCoord(j+1)));
this.entries[i][j].setEditable(true);
this.entries[i][j].setFocusable(true);
inside.add(this.entries[i][j]);
}
}
this.setLayout(new BorderLayout());
this.add(inside,BorderLayout.CENTER);
this.validate();
}
}
public class ClickDetectPanel extends JPanel implements MouseListener
{
// JFESH
private static final long serialVersionUID = -4263910544683853470L;
public ClickDetectPanel()
{
this.addMouseListener(this);
}
@Override
protected void paintComponent(Graphics g)
{
g.setColor(new Color(Config.selectPointPosColorBackground));
g.fillRect(0, 0, 500, 500);
for(Point f : selectedFoyers)
{
int x = f.getCoord(1);
int y = f.getCoord(2);
int width = 500, height = 500;
g.setColor(new Color(Config.selectPointPosColorCross));
g.drawLine(x, y, x, y);
if(x > 1)
{
g.drawLine(x - 1, y, x - 1, y);
}
if(x > 2)
{
g.drawLine(x - 2, y, x - 2, y);
}
if(y > 1)
{
g.drawLine(x, y - 1, x, y - 1);
}
if(y > 2)
{
g.drawLine(x, y - 2, x, y - 2);
}
if(x < width - 1)
{
g.drawLine(x + 1, y, x + 1, y);
}
if(x < width - 2)
{
g.drawLine(x + 2, y, x + 2, y);
}
if(y < height - 1)
{
g.drawLine(x, y + 1, x, y + 1);
}
if(y < height - 2)
{
g.drawLine(x, y + 2, x, y + 2);
}
}
}
@Override
public void mouseReleased(MouseEvent e)
{
Point[] selectedFoyers2 = new Point[selectedFoyers.length + 1];
System.arraycopy(selectedFoyers, 0, selectedFoyers2, 0, selectedFoyers.length);
selectedFoyers2[selectedFoyers.length] = new Point(e.getX(), e.getY());
selectedFoyers = selectedFoyers2;
System.out.println("Added point :" + selectedFoyers[selectedFoyers.length - 1]);
removeLast.setEnabled(true);
repaint();
}
@Override
public void mouseClicked(MouseEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e)
{
// TODO Auto-generated method stub
}
}
}

View File

@ -0,0 +1,531 @@
package com.bernard.cercloide.view;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import com.bernard.cercloide.colorset.ColorSet;
import com.bernard.cercloide.factory.ImageCreator;
import com.bernard.cercloide.factory.JOptPaneCreator;
import com.bernard.cercloide.factory.NumberAnalyser;
import com.bernard.cercloide.theory.plan.Point;
public class VarSetFrame extends JFrame
{
// JFESH
private static final long serialVersionUID = -5880101215078205388L;
private static final String WITHOUTRAYONPANE = "withoutRP";
private static final String WITHRAYONPANE = "withRP";
private static final String WITHABSOLUTEVALUE = "withAV";
private static final String WITHRELATIVEVALUE = "withRV";
private static final String WITHNOVALUE = "withNV";
JButton setFoyers;
JTextField getP;
JButton dim1, dim2, dim3;
JTextField rayon, rayonFourch;
JCheckBox withRayon;
JTextField widthAsk, heightAsk;
ButtonGroup crossGroup;
JRadioButton crossDefault, crossAbsolute, crossRelative, noCross;
JCheckBox viewProgress;
JTextField crossAbsoluteOut, crossRelativeOut;
JPanel crossOutputPane;
CardLayout crossActionLayout;
JComboBox<ColorSet> colorSet;
JColorChooser rayonColorChooser;
JPanel colorPanel;
CardLayout colorLayout;
JButton run;
Point[] settedFoyers;
SelectPointsPos spp;
GlobalListener globalListener = new GlobalListener();
public VarSetFrame()
{
this.setTitle("Cercloïdator");
this.setSize(1000, 500);
this.setResizable(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
settedFoyers = new Point[0];
init();
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(globalListener);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void init()
{
this.setContentPane(new JPanel());
final Font generalFont = new Font("OCR A Extended", Font.ITALIC, 20);
settedFoyers = new Point[0];
JPanel foyersPanel = new JPanel();
foyersPanel.setLayout(new BorderLayout());
setFoyers = new JButton("Régler les Foyers");
setFoyers.setFont(generalFont);
setFoyers.addActionListener(globalListener);
foyersPanel.add(setFoyers, BorderLayout.CENTER);
JPanel pPanel = new JPanel();
pPanel.setLayout(new BorderLayout());
JLabel pLabel = new JLabel("P =");
pLabel.setFont(generalFont);
getP = new JTextField();
getP.setText("2");
getP.setToolTipText("ex: 2");
pPanel.add(pLabel, BorderLayout.WEST);
pPanel.add(getP, BorderLayout.CENTER);
JPanel dimPanel = new JPanel();
dimPanel.setLayout(new BorderLayout());
JLabel dimLabel = new JLabel("Dimension :");
dimLabel.setFont(generalFont);
JPanel dimChoicePanel = new JPanel();
dimChoicePanel.setLayout(new GridLayout(1, 3));
dim1 = new JButton("1");
dim1.setToolTipText("Not implemented(yet)");
dim1.setEnabled(false);
dim2 = new JButton("2");
dim3 = new JButton("3");
dim3.setToolTipText("Not implemented(yet)");
dim3.setEnabled(false);
dimChoicePanel.add(dim1);
dimChoicePanel.add(dim2);
dimChoicePanel.add(dim3);
dimPanel.add(dimLabel, BorderLayout.WEST);
dimPanel.add(dimChoicePanel, BorderLayout.CENTER);
JPanel rayonPanel = new JPanel();
rayonPanel.setLayout(new BoxLayout(rayonPanel, BoxLayout.LINE_AXIS));
JLabel rayonLabel = new JLabel("Rayon :");
rayonLabel.setFont(generalFont);
rayon = new JTextField();
rayon.setToolTipText("ex: 403");
rayon.setEnabled(false);
JLabel rayonFourchLabel = new JLabel("Fourchette =/- :");
rayonFourchLabel.setFont(generalFont);
rayonFourch = new JTextField();
rayonFourch.setText("-1");
rayonFourch.setToolTipText("ex: 3");
rayonFourch.setEnabled(false);
withRayon = new JCheckBox();
withRayon.setToolTipText("Desactiver affichera tous les rayons avec des couleurs différentes");
withRayon.addActionListener(globalListener);
rayonPanel.add(rayonLabel);
rayonPanel.add(rayon);
rayonPanel.add(rayonFourchLabel);
rayonPanel.add(rayonFourch);
rayonPanel.add(withRayon);
JPanel sizePanel = new JPanel();
sizePanel.setLayout(new BoxLayout(sizePanel, BoxLayout.LINE_AXIS));
JLabel sizeLabel = new JLabel("Largeur/Hauteur :");
sizeLabel.setFont(generalFont);
widthAsk = new JTextField();
widthAsk.setText("500");
JLabel sizeSeparator = new JLabel("/");
sizeSeparator.setFont(generalFont);
heightAsk = new JTextField();
heightAsk.setText("500");
sizePanel.add(sizeLabel);
sizePanel.add(widthAsk);
sizePanel.add(sizeSeparator);
sizePanel.add(heightAsk);
JPanel crossPane = new JPanel();
crossPane.setLayout(new BorderLayout());
JPanel crossRadioPane = new JPanel();
crossRadioPane.setLayout(new BoxLayout(crossRadioPane, BoxLayout.LINE_AXIS));
JLabel crossRadioLabel = new JLabel("Marquage des foyers :");
crossRadioLabel.setFont(generalFont);
crossDefault = new JRadioButton("Par défaut");
crossDefault.setFont(generalFont);
crossDefault.addActionListener(globalListener);
crossAbsolute = new JRadioButton("Absolu");
crossAbsolute.setFont(generalFont);
crossAbsolute.addActionListener(globalListener);
crossRelative = new JRadioButton("Relatif");
crossRelative.setFont(generalFont);
crossRelative.addActionListener(globalListener);
noCross = new JRadioButton("Aucun");
noCross.setFont(generalFont);
noCross.addActionListener(globalListener);
crossDefault.setSelected(true);
crossGroup = new ButtonGroup();
crossGroup.add(crossDefault);
crossGroup.add(crossAbsolute);
crossGroup.add(crossRelative);
crossGroup.add(noCross);
viewProgress = new JCheckBox();
viewProgress.addActionListener(globalListener);
viewProgress.setSelected(true);
viewProgress.setToolTipText("View the progress of the drawing");
crossRadioPane.add(crossRadioLabel);
crossRadioPane.add(crossDefault);
crossRadioPane.add(crossAbsolute);
crossRadioPane.add(crossRelative);
crossRadioPane.add(noCross);
crossRadioPane.add(viewProgress);
crossPane.add(crossRadioPane, BorderLayout.CENTER);
crossOutputPane = new JPanel();
crossActionLayout = new CardLayout();
crossOutputPane.setLayout(crossActionLayout);
crossAbsoluteOut = new JTextField("2");
crossAbsoluteOut.setToolTipText("Taille de chaque branche *2 pour hauteur=largeur=500");
crossAbsoluteOut.setFont(generalFont);
crossRelativeOut = new JTextField("2");
crossRelativeOut.setToolTipText("Taille de chaque branche pour hauteur=largeur=500");
crossRelativeOut.setFont(generalFont);
crossOutputPane.add(crossAbsoluteOut, WITHABSOLUTEVALUE);
crossOutputPane.add(crossRelativeOut, WITHRELATIVEVALUE);
crossOutputPane.add(new JPanel(), WITHNOVALUE);
crossActionLayout.show(crossOutputPane, WITHNOVALUE);
crossPane.add(crossOutputPane, BorderLayout.SOUTH);
colorPanel = new JPanel();
colorLayout = new CardLayout();
colorPanel.setLayout(colorLayout);
JPanel colorPanelWithR = new JPanel();
colorPanelWithR.setLayout(new BorderLayout());
JLabel colorWithRLabel = new JLabel("Couleur du rayon :");
colorWithRLabel.setFont(generalFont);
rayonColorChooser = new JColorChooser();
rayonColorChooser.setFont(generalFont);
colorPanelWithR.add(colorWithRLabel, BorderLayout.WEST);
colorPanelWithR.add(rayonColorChooser, BorderLayout.CENTER);
JPanel colorPanelWithoutR = new JPanel();
colorPanelWithoutR.setLayout(new BorderLayout());
JPanel colorPanelWithoutRIn = new JPanel();
colorPanelWithoutRIn.setLayout(new BorderLayout());
JLabel colorWithoutRLabel = new JLabel("Jeu de couleurs :");
colorWithoutRLabel.setFont(generalFont);
colorSet = new JComboBox<>(ColorSet.values());
colorSet.setPreferredSize(new Dimension(625, 32));
colorPanelWithoutRIn.add(colorWithoutRLabel, BorderLayout.WEST);
colorPanelWithoutRIn.add(colorSet, BorderLayout.CENTER);
colorPanelWithoutR.add(colorPanelWithoutRIn, BorderLayout.NORTH);
colorPanel.add(colorPanelWithoutR, WITHOUTRAYONPANE);
colorPanel.add(colorPanelWithR, WITHRAYONPANE);
JPanel runPan = new JPanel();
runPan.setLayout(new BorderLayout());
run = new JButton("Lancer le dessin");
run.addActionListener(globalListener);
runPan.add(run, BorderLayout.CENTER);
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.PAGE_AXIS));
this.getContentPane().add(foyersPanel);
this.getContentPane().add(pPanel);
this.getContentPane().add(dimPanel);
this.getContentPane().add(rayonPanel);
this.getContentPane().add(sizePanel);
this.getContentPane().add(crossPane);
this.getContentPane().add(colorPanel);
this.getContentPane().add(runPan);
this.pack();
}
public boolean testVars()
{
try
{
NumberAnalyser.parseDouble(getP.getText());
}
catch(NumberFormatException e)
{
if(getP.getText().toUpperCase().equals("+INF") || getP.getText().toUpperCase().equals("-INF"))
{
}
else
{
JOptPaneCreator.argumentError("P ne peut pas être égal à " + getP.getText());
return false;
}
}
if(withRayon.isSelected())
{
try
{
NumberAnalyser.parseLong(rayon.getText());
}
catch(NumberFormatException e)
{
JOptPaneCreator.argumentError("Le rayon ne peut pas être égal à " + rayon.getText());
return false;
}
try
{
NumberAnalyser.parseLong(rayonFourch.getText());
}
catch(NumberFormatException e)
{
JOptPaneCreator.argumentError("La fourchette du rayon ne peut pas être égale à " + rayonFourch.getText());
return false;
}
}
try
{
NumberAnalyser.parseLong(widthAsk.getText());
}
catch(NumberFormatException e)
{
JOptPaneCreator.argumentError("La largeur ne peut pas être égale à " + widthAsk.getText());
return false;
}
try
{
NumberAnalyser.parseLong(heightAsk.getText());
}
catch(NumberFormatException e)
{
JOptPaneCreator.argumentError("La hauteur ne peut pas être égale à " + heightAsk.getText());
return false;
}
if(crossRelative.isSelected())
{
try
{
NumberAnalyser.parseLong(crossRelativeOut.getText());
}
catch(NumberFormatException e)
{
JOptPaneCreator.argumentError("La taille relative de la croix ne peut pas être égale à " + crossRelativeOut.getText());
return false;
}
}
if(crossAbsolute.isSelected())
{
try
{
NumberAnalyser.parseLong(crossAbsoluteOut.getText());
}
catch(NumberFormatException e)
{
JOptPaneCreator.argumentError("Le taille absolue de la croix ne peut pas être égale à " + crossAbsoluteOut.getText());
return false;
}
}
if(settedFoyers.length == 0)
{
int option = JOptionPane.showConfirmDialog(null, "Aucun foyer n'a été placé! Voulez-vous quand même générer l'image ?", "Aucun foyer", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if(option != JOptionPane.YES_OPTION)
{
return false;
}
}
return true;
}
private VarSetFrame getThis()
{
return this;
}
private class GlobalListener implements ActionListener, KeyEventDispatcher
{
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == withRayon)
{
if(withRayon.isSelected())
{
rayon.setEnabled(true);
rayonFourch.setEnabled(true);
colorLayout.show(colorPanel, WITHRAYONPANE);
}
else
{
rayon.setEnabled(false);
rayonFourch.setEnabled(false);
colorLayout.show(colorPanel, WITHOUTRAYONPANE);
}
}
else if(e.getSource() == run)
{
if(testVars())
{
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
if(new File("cercloids_outs").exists())
{
new File("cercloids_outs").mkdirs();
}
Double p = NumberAnalyser.parseDouble(getP.getText());
int w = NumberAnalyser.parseLong(widthAsk.getText()).intValue(), h = NumberAnalyser.parseLong(heightAsk.getText()).intValue();
char crossConv = 'µ';
int crossNum = -1;
if(crossDefault.isSelected())
{
crossConv = 'd';
crossNum = 0;
}
else if(crossAbsolute.isSelected())
{
crossConv = 'a';
crossNum = NumberAnalyser.parseLong(crossAbsoluteOut.getText()).intValue();
}
else if(crossRelative.isSelected())
{
crossConv = 'r';
crossNum = NumberAnalyser.parseLong(crossRelativeOut.getText()).intValue();
}
else if(noCross.isSelected())
{
crossConv = 'n';
crossNum = 0;
}
Path outPath = Paths.get("cercloid_outs/" + getFileName(p, w, h, crossConv, crossNum, withRayon.isSelected(), rayon.getText(), rayonColorChooser.getColor(), rayonFourch.getText(), (ColorSet)colorSet.getSelectedItem()) + ".png");
if(withRayon.isSelected())
{
Long fourch = NumberAnalyser.parseLong(rayonFourch.getText());
if(fourch == -1)
{
ImageCreator.createImage(getThis(), outPath, SelectPointsPos.adapt(settedFoyers, w, h), p, rayonColorChooser.getColor(), NumberAnalyser.parseLong(rayon.getText()), w, h, Color.RED, crossConv, crossNum, (viewProgress.isSelected()) ? new ViewDrawingProgress() : null);
}
else
{
ImageCreator.createImage(getThis(), outPath, SelectPointsPos.adapt(settedFoyers, w, h), p, rayonColorChooser.getColor(), NumberAnalyser.parseLong(rayon.getText()), fourch.intValue(), w, h, Color.RED, crossConv, crossNum, (viewProgress.isSelected()) ? new ViewDrawingProgress() : null);
}
}
else
{
ImageCreator.createImage(getThis(), outPath, SelectPointsPos.adapt(settedFoyers, w, h), p, (ColorSet)colorSet.getSelectedItem(), w, h, Color.RED, crossConv, crossNum, (viewProgress.isSelected()) ? new ViewDrawingProgress() : null);
}
setVisible(true);
}
});
setVisible(false);
t.start();
}
}
else if(e.getSource() == setFoyers)
{
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
int w = NumberAnalyser.parseLong(widthAsk.getText()).intValue(), h = NumberAnalyser.parseLong(heightAsk.getText()).intValue();
spp = new SelectPointsPos(w, h, settedFoyers);
setEnabled(false);
try
{
Thread.sleep(250);
}
catch(InterruptedException e1)
{
e1.printStackTrace();
}
settedFoyers = spp.waitFinish();
setEnabled(true);
}
});
t.start();
}
else if(e.getSource() == crossDefault)
{
crossActionLayout.show(crossOutputPane, WITHNOVALUE);
}
else if(e.getSource() == crossAbsolute)
{
crossActionLayout.show(crossOutputPane, WITHABSOLUTEVALUE);
}
else if(e.getSource() == crossRelative)
{
crossActionLayout.show(crossOutputPane, WITHRELATIVEVALUE);
}
else if(e.getSource() == noCross)
{
crossActionLayout.show(crossOutputPane, WITHNOVALUE);
}
}
@Override
public boolean dispatchKeyEvent(KeyEvent e)
{
if(e.isControlDown() && (e.getKeyCode() == KeyEvent.VK_NUMPAD7 || e.getKeyCode() == KeyEvent.VK_7))
{
widthAsk.setText("5000");
heightAsk.setText("5000");
withRayon.setSelected(true);
rayonColorChooser.setColor(17, 23, 142);
rayon.setText("500");
settedFoyers = new Point[] {new Point(250, 250)};
System.out.println("Preset 7");
}else if(e.isControlDown() && (e.getKeyCode() == KeyEvent.VK_NUMPAD1 || e.getKeyCode() == KeyEvent.VK_1))
{
widthAsk.setText("500");
heightAsk.setText("500");
withRayon.setSelected(true);
rayonColorChooser.setColor(0,0,0);
rayon.setText("200");
settedFoyers = new Point[] {new Point(250, 250)};
System.out.println("Preset 1");
}
return false;
}
}
public static final String getFileName(Double p, int w, int h, char crossConv, int crossNum, boolean withRayon, String rayon, Color rayonColor, String rayonFourch, ColorSet colorSet)
{
String sgout = "out_";
sgout += "p=" + p + ";";
sgout += "w=" + w + "_h=" + h + ";";
if(withRayon)
{
sgout += (String)("r=" + rayon + "+-" + rayonFourch + "color=" + rayonColor.toString());
}
else
{
sgout += "color=" + colorSet.toString();
}
sgout = sgout.replaceAll(">", "-");
return sgout;
}
}

View File

@ -0,0 +1,37 @@
package com.bernard.cercloide.view;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ViewDrawingProgress extends JFrame {
private static final long serialVersionUID = 4618795009439632909L;
private BufferedImage image;
public ViewDrawingProgress() {
this.setTitle("Dessin en cours ...");
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.setContentPane(new ImagePanel());
this.setVisible(true);
}
public void updateWithImage(BufferedImage img) {
this.image = img;
this.repaint();
}
public class ImagePanel extends JPanel {
private static final long serialVersionUID = -4292881599714388236L;
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, getWidth(), getHeight(), ViewDrawingProgress.this);
}
}
}

View File

@ -0,0 +1,28 @@
package com.bernard.cercloide.view;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
public class WaitFrame extends JFrame {
private static final long serialVersionUID = 4962926088577592668L;
public JProgressBar progressBar;
public WaitFrame(long total) {
this.setSize(500, 100);
this.setLocationRelativeTo(null);
this.setTitle("Veuillez patienter . . . . . . . . . . . etc");
this.setResizable(false);
progressBar = new JProgressBar();
progressBar.setMaximum((int) total);
progressBar.setStringPainted(true);
this.getContentPane().add(progressBar);
this.setVisible(true);
}
}