diff --git a/src/ecoparasite/Application.java b/src/ecoparasite/Application.java index 50b33ef..6b777ed 100644 --- a/src/ecoparasite/Application.java +++ b/src/ecoparasite/Application.java @@ -9,12 +9,20 @@ import ecoparasite.nettoyage.Nettoyage; import ecoparasite.poisson.MackerelSerra; import ecoparasite.poisson.Poisson; import ecoparasite.representation.ValeursXY; +import ecoparasite.svg.IncorrectAxesPointsException; +import ecoparasite.svg.SVGAxes; +import ecoparasite.svg.SVGFactory; +import ecoparasite.svg.SVGResizing; +import ecoparasite.svg.elements.Element; +import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.function.BiConsumer; import java.util.function.Function; public class Application { + public static void main(String[] args) throws InputFileException, RawDataOverflow { RawData rawMackerel = InputFactory.readData("test2.csv", ","); @@ -31,6 +39,19 @@ public class Application { mackerelSet = Completion.completeColumnsLinear( mackerelSet, getLength, getInfes, setInfes ); HashSet mackerelXY = ValeursXY.convertToXY( mackerelSet, getLength, getInfes ); + HashMap> axes = SVGFactory.PointAXES( mackerelXY ); + System.out.println( axes ); + + SVGAxes axesInstance; + try { + axesInstance = new SVGAxes(axes); + } catch (IncorrectAxesPointsException e) { + System.out.println( "Mauvais format communiqué" ); + return; + } + + ArrayList SVGElements = axesInstance.buildAll( "Length", "Infestation" ); + SVGFactory.createSVG( SVGElements ); } } \ No newline at end of file diff --git a/src/ecoparasite/svg/IncorrectAxesPointsException.java b/src/ecoparasite/svg/IncorrectAxesPointsException.java new file mode 100644 index 0000000..61af897 --- /dev/null +++ b/src/ecoparasite/svg/IncorrectAxesPointsException.java @@ -0,0 +1,4 @@ +package ecoparasite.svg; + +public class IncorrectAxesPointsException extends Exception{ +} diff --git a/src/ecoparasite/svg/SVGAxes.java b/src/ecoparasite/svg/SVGAxes.java new file mode 100644 index 0000000..4d5446d --- /dev/null +++ b/src/ecoparasite/svg/SVGAxes.java @@ -0,0 +1,181 @@ +package ecoparasite.svg; + +import ecoparasite.svg.elements.Element; +import ecoparasite.svg.elements.ElementsFactory; +import ecoparasite.svg.elements.Line; +import ecoparasite.svg.elements.Text; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +public class SVGAxes { + + final int SIZE_TICK_TEXT = ElementsFactory.AXES_TEXT_SIZE - 3; + + private ArrayList pointsX; + private ArrayList pointsY; + private Double offsetX; + private Double offsetY; + private SVGResizing resizer; + + private Double minPointsX; + private Double minPointsY; + private Double maxPointsX; + private Double maxPointsY; + + public SVGAxes( HashMap> axesPoints ) throws IncorrectAxesPointsException { + + if( axesPoints.get("AxeX") == null || axesPoints.get("AxeY") == null || axesPoints.get("OffsetX") == null || axesPoints.get("OffsetY") == null ){ + throw new IncorrectAxesPointsException(); + } + + this.pointsX = axesPoints.get("AxeX"); + this.pointsY = axesPoints.get("AxeY"); + this.offsetX = axesPoints.get("OffsetX").getFirst(); + this.offsetY = axesPoints.get("OffsetY").getFirst(); + + this.minPointsX = this.pointsX.getFirst(); + this.minPointsY = this.pointsY.getFirst(); + this.maxPointsX = this.pointsX.getLast(); + this.maxPointsY = this.pointsY.getLast(); + + } + + public ArrayList getPointsX() { + return pointsX; + } + + public ArrayList getPointsY() { + return pointsY; + } + + public Double getOffsetX() { + return offsetX; + } + + public Double getOffsetY() { + return offsetY; + } + + public SVGResizing getResizer() { + if( this.resizer == null ){ + this.resizer = new SVGResizing( this.minPointsX, this.minPointsY, this.maxPointsX, this.maxPointsY ); + } + return resizer; + } + + public void setResizer(SVGResizing resizer) { + this.resizer = resizer; + } + + public ArrayList buildAll(String XLabel, String YLabel){ + + ArrayList elements = new ArrayList<>(); + elements.addAll(buildAxes(XLabel, YLabel)); + elements.addAll(buildXTicks()); + elements.addAll(buildYTicks()); + + return elements; + } + + public ArrayList buildAxes(String XLabel, String YLabel){ + + final int OFFSET_TEXT_AXISX_X = -20; + final int OFFSET_TEXT_AXISX_Y = -10; + final int OFFSET_TEXT_AXISY_X = +5; + final int OFFSET_TEXT_AXISY_Y = +10; + + ArrayList elements = new ArrayList<>(); + + double beginAxeX = getBeginAxeX(); + double beginAxeY = getBeginAxeY(); + + Coordonnees bottom = getResizer().resize( beginAxeX, minPointsY ); + Coordonnees top = getResizer().resize( beginAxeX, maxPointsY ); + Coordonnees left = getResizer().resize( minPointsX, beginAxeY ); + Coordonnees right = getResizer().resize( maxPointsX, beginAxeY ); + + // Axes + elements.add( new Line( bottom, top, ElementsFactory.COLOR_BLACK, 2 ) ); + elements.add( new Line( left, right, ElementsFactory.COLOR_BLACK, 2 ) ); + + // Labels. + elements.add( new Text( + new Coordonnees( right.getX() + OFFSET_TEXT_AXISX_X, right.getY() + OFFSET_TEXT_AXISX_Y ), + XLabel, ElementsFactory.COLOR_BLACK, ElementsFactory.AXES_TEXT_SIZE + ) ); + elements.add( new Text( + new Coordonnees( top.getX() + OFFSET_TEXT_AXISY_X, top.getY() + OFFSET_TEXT_AXISY_Y ), + YLabel, ElementsFactory.COLOR_BLACK, ElementsFactory.AXES_TEXT_SIZE + )); + + return elements; + + } + + public ArrayList buildXTicks(){ + + final int OFFSET_TICK = -5; + final int OFFSET_TEXT_X = -10; + final int OFFSET_TEXT_Y = +15; + + ArrayList elements = new ArrayList<>(); + + double beginAxeY = getBeginAxeY(); + for( Double X : this.pointsX ){ + Coordonnees coords = getResizer().resize( X, beginAxeY ); + + elements.add(new Line( + coords, + new Coordonnees( coords.getX(), coords.getY() + OFFSET_TICK ), + ElementsFactory.COLOR_BLACK, 1 + )); + elements.add(new Text( + new Coordonnees( coords.getX() + OFFSET_TEXT_X, coords.getY() + OFFSET_TEXT_Y ), + X.toString(), + ElementsFactory.COLOR_BLACK, + SIZE_TICK_TEXT + )); + } + + return elements; + } + + public ArrayList buildYTicks(){ + + final int OFFSET_TICK = +5; + final int OFFSET_TEXT_X = -35; + final int OFFSET_TEXT_Y = +5; + + ArrayList elements = new ArrayList<>(); + + double beginAxeX = getBeginAxeX(); + for( Double Y : this.pointsY ){ + Coordonnees coords = getResizer().resize( beginAxeX, Y ); + + elements.add(new Line( + new Coordonnees(coords.getX() + OFFSET_TICK, coords.getY() ), + coords, + ElementsFactory.COLOR_BLACK, 1 + )); + elements.add(new Text( + new Coordonnees( coords.getX() + OFFSET_TEXT_X, coords.getY() + OFFSET_TEXT_Y ), + Y.toString(), + ElementsFactory.COLOR_BLACK, + SIZE_TICK_TEXT + )); + } + + return elements; + } + + private double getBeginAxeX(){ + return ( minPointsX > 0 ) ? minPointsX : ( maxPointsX < 0 ? maxPointsX : 0 ); + } + + private double getBeginAxeY(){ + return ( minPointsY > 0 ) ? minPointsY : ( maxPointsY < 0 ? maxPointsY : 0 ); + } +} diff --git a/src/ecoparasite/svg/SVGFactory.java b/src/ecoparasite/svg/SVGFactory.java index 575f998..c49b50c 100644 --- a/src/ecoparasite/svg/SVGFactory.java +++ b/src/ecoparasite/svg/SVGFactory.java @@ -112,9 +112,9 @@ public class SVGFactory { * Avec la String "OffsetX", un Hashset de Double contenant uniquement la valeur de l'offset des points par rapport à l'axe X * Avec la String "OffsetY", un Hashset de Double contenant uniquement la valeur de l'offset des points par rapport à l'axe Y */ - public static HashMap< String ,HashSet> PointAXES(HashSet h){ + public static HashMap< String ,ArrayList> PointAXES(HashSet h){ - HashMap< String, HashSet > map = new HashMap<>(); + HashMap< String, ArrayList > map = new HashMap<>(); //Définition des min et max double max_x = Double.MIN_VALUE; @@ -127,13 +127,15 @@ public class SVGFactory { if (max_x < var.getX()){ max_x = var.getX(); - } else if (min_x > var.getX()){ + } + if (min_x > var.getX()){ min_x = var.getX(); } if (max_y < var.getY()){ max_y = var.getY(); - } else if (min_y > var.getY()){ + } + if (min_y > var.getY()){ min_y = var.getY(); } @@ -153,10 +155,10 @@ public class SVGFactory { double nicemax_y = roundMax(max_y,step_y); // Compléter un Hashset de Double pour X et pour Y et Offset X et Y. TODO - HashSet axeX = new HashSet<>(); - HashSet axeY = new HashSet<>(); - HashSet OffsetX = new HashSet<>(); - HashSet OffsetY = new HashSet<>(); + ArrayList axeX = new ArrayList<>(); + ArrayList axeY = new ArrayList<>(); + ArrayList OffsetX = new ArrayList<>(); + ArrayList OffsetY = new ArrayList<>(); Double ix = nicemin_x; while ( ix <= nicemax_x ) { @@ -175,9 +177,9 @@ public class SVGFactory { double offsetX = min_x - nicemin_x; double offsetY = min_y - nicemin_y; - HashSet offsetXHash = new HashSet<>(); + ArrayList offsetXHash = new ArrayList<>(); offsetXHash.add(offsetX); - HashSet offsetYHash = new HashSet<>(); + ArrayList offsetYHash = new ArrayList<>(); offsetYHash.add(offsetY); map.put("OffsetX", offsetXHash); diff --git a/src/ecoparasite/svg/SVGResizing.java b/src/ecoparasite/svg/SVGResizing.java new file mode 100644 index 0000000..895c6f9 --- /dev/null +++ b/src/ecoparasite/svg/SVGResizing.java @@ -0,0 +1,57 @@ +package ecoparasite.svg; + +import ecoparasite.representation.ValeursXY; +import ecoparasite.svg.elements.ElementsFactory; + +public class SVGResizing { + + private double minX; + private double maxX; + private double minY; + private double maxY; + + public SVGResizing( + double minXGrad, + double minYGrad, + double maxXGrad, + double maxYGrad + ){ + this.minX = minXGrad; + this.maxX = maxXGrad; + this.minY = minYGrad; + this.maxY = maxYGrad; + } + + public double getMinX() { + return minX; + } + + public double getMaxX() { + return maxX; + } + + public double getMinY() { + return minY; + } + + public double getMaxY() { + return maxY; + } + + public Coordonnees resize(ValeursXY vxy ){ + return this.resize( vxy.getX(), vxy.getY() ); + } + + public Coordonnees resize( double X, double Y ){ + double surface = ElementsFactory.SVG_SIZE - 2 * ElementsFactory.SVG_OFFSET; + + double convX = ( X - minX ) / ( maxX - minX ); + double convY = ( Y - minY ) / ( maxY - minY ); + + double SVG_X = ElementsFactory.SVG_OFFSET + convX * surface; + double SVG_Y = ElementsFactory.SVG_SIZE - ElementsFactory.SVG_OFFSET - convY * surface; + + return new Coordonnees(SVG_X, SVG_Y); + } + +} diff --git a/src/ecoparasite/svg/elements/ElementsFactory.java b/src/ecoparasite/svg/elements/ElementsFactory.java index baf5c3f..3b80fd9 100644 --- a/src/ecoparasite/svg/elements/ElementsFactory.java +++ b/src/ecoparasite/svg/elements/ElementsFactory.java @@ -16,10 +16,7 @@ public class ElementsFactory { final public static String COLOR_BLUE = "blue"; final public static String COLOR_BLACK = "black"; - /** - * Permet de générer les éléments axes du fichier SVG. - * @return - */ + /* public static ArrayList SVGAxes(String HName, String VName ){ final int begin = SVG_OFFSET + AXES_TEXT_SIZE + (AXES_TEXT_SIZE / 2); @@ -65,4 +62,5 @@ public class ElementsFactory { return SVGAxes( "None", "None" ); } + */ } \ No newline at end of file diff --git a/src/ecoparasite/svg/elements/Line.java b/src/ecoparasite/svg/elements/Line.java index 6562367..b5096e2 100644 --- a/src/ecoparasite/svg/elements/Line.java +++ b/src/ecoparasite/svg/elements/Line.java @@ -2,6 +2,8 @@ package ecoparasite.svg.elements; import ecoparasite.svg.Coordonnees; +import java.util.Locale; + public class Line extends Element { private Coordonnees coordonneesB; @@ -59,7 +61,7 @@ public class Line extends Element { StringBuilder svg = new StringBuilder(); svg.append(""); svg.append( this.text ); diff --git a/tests/ecoparasite/svg/SVGFactoryTest.java b/tests/ecoparasite/svg/SVGFactoryTest.java index 986afe6..73fe99b 100644 --- a/tests/ecoparasite/svg/SVGFactoryTest.java +++ b/tests/ecoparasite/svg/SVGFactoryTest.java @@ -9,7 +9,7 @@ class SVGFactoryTest { @Test public void generateSVGAxes(){ - SVGFactory.createSVG( ElementsFactory.SVGAxes() ); + // SVGFactory.createSVG( ElementsFactory.SVGAxes() ); } } \ No newline at end of file