Premier commit - Introduction au système git
This commit is contained in:
commit
0d76df4ea4
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.classpath
|
||||||
|
.metadata
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
bin/
|
||||||
110
src/com/bernard/cercloide/TestDistance.java
Normal file
110
src/com/bernard/cercloide/TestDistance.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
29
src/com/bernard/cercloide/ViewUtil.java
Normal file
29
src/com/bernard/cercloide/ViewUtil.java
Normal 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);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
151
src/com/bernard/cercloide/colorset/ColorSet.java
Normal file
151
src/com/bernard/cercloide/colorset/ColorSet.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
731
src/com/bernard/cercloide/factory/ImageCreator.java
Normal file
731
src/com/bernard/cercloide/factory/ImageCreator.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
src/com/bernard/cercloide/factory/JOptPaneCreator.java
Normal file
18
src/com/bernard/cercloide/factory/JOptPaneCreator.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
61
src/com/bernard/cercloide/factory/LoopingImageCreator.java
Normal file
61
src/com/bernard/cercloide/factory/LoopingImageCreator.java
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
67
src/com/bernard/cercloide/factory/NumberAnalyser.java
Normal file
67
src/com/bernard/cercloide/factory/NumberAnalyser.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
28
src/com/bernard/cercloide/factory/RunnerFactory.java
Normal file
28
src/com/bernard/cercloide/factory/RunnerFactory.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/com/bernard/cercloide/main/Config.java
Normal file
10
src/com/bernard/cercloide/main/Config.java
Normal 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();
|
||||||
|
|
||||||
|
}
|
||||||
36
src/com/bernard/cercloide/main/Main.java
Normal file
36
src/com/bernard/cercloide/main/Main.java
Normal 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");
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/com/bernard/cercloide/main/Sprach.java
Normal file
10
src/com/bernard/cercloide/main/Sprach.java
Normal 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";
|
||||||
|
|
||||||
|
}
|
||||||
29
src/com/bernard/cercloide/theory/PointIterator.java
Normal file
29
src/com/bernard/cercloide/theory/PointIterator.java
Normal 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]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
80
src/com/bernard/cercloide/theory/iter/IterEnsemble.java
Normal file
80
src/com/bernard/cercloide/theory/iter/IterEnsemble.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
115
src/com/bernard/cercloide/theory/iter/IterIntervale.java
Normal file
115
src/com/bernard/cercloide/theory/iter/IterIntervale.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
8
src/com/bernard/cercloide/theory/iter/IterOptions.java
Normal file
8
src/com/bernard/cercloide/theory/iter/IterOptions.java
Normal 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();
|
||||||
|
}
|
||||||
136
src/com/bernard/cercloide/theory/plan/Point.java
Normal file
136
src/com/bernard/cercloide/theory/plan/Point.java
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
168
src/com/bernard/cercloide/varSets/CercloidWithGradientArgs.java
Normal file
168
src/com/bernard/cercloide/varSets/CercloidWithGradientArgs.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
357
src/com/bernard/cercloide/view/LoopSetFrame2.java
Normal file
357
src/com/bernard/cercloide/view/LoopSetFrame2.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
102
src/com/bernard/cercloide/view/LoopUtilFrame.java
Normal file
102
src/com/bernard/cercloide/view/LoopUtilFrame.java
Normal 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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
557
src/com/bernard/cercloide/view/LoopUtilVarSet.java
Normal file
557
src/com/bernard/cercloide/view/LoopUtilVarSet.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
87
src/com/bernard/cercloide/view/MainFrame.java
Normal file
87
src/com/bernard/cercloide/view/MainFrame.java
Normal 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é");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
314
src/com/bernard/cercloide/view/SelectPointsPos.java
Normal file
314
src/com/bernard/cercloide/view/SelectPointsPos.java
Normal 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
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
531
src/com/bernard/cercloide/view/VarSetFrame.java
Normal file
531
src/com/bernard/cercloide/view/VarSetFrame.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
37
src/com/bernard/cercloide/view/ViewDrawingProgress.java
Normal file
37
src/com/bernard/cercloide/view/ViewDrawingProgress.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
28
src/com/bernard/cercloide/view/WaitFrame.java
Normal file
28
src/com/bernard/cercloide/view/WaitFrame.java
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user