package com.baselet.element.sticking; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Vector; import com.baselet.control.basics.geom.Line; import com.baselet.control.basics.geom.PointDouble; import com.baselet.control.basics.geom.Rectangle; public class StickingPolygon { public static class StickLine extends Line { StickLine(PointDouble p1, PointDouble p2) { super(p1, p2); } // calculates the difference between this line and the other line at the specified x or y coordinate (whichever fits better) public PointDouble diffToLine(StickLine s, int inX, int inY) { double x = 0; double y = 0; if (getEnd().x.equals(getStart().x)) { // AB: Fixed: use s.getStart().x instead of getStart().x x = s.getStart().x - (s.getEnd().x - s.getStart().x) - inX; // mitte der neuen linie if (s.getEnd().x.equals(s.getStart().x)) { // vertical lines - no y difference except the line is at an end y = 0; if (s.getStart().y > s.getEnd().y) { if (s.getStart().y < inY) { y = s.getStart().y - inY; } else if (s.getEnd().y > inY) { y = s.getEnd().y - inY; } } else { if (s.getEnd().y < inY) { y = s.getEnd().y - inY; } else if (s.getStart().y > inY) { y = s.getStart().y - inY; } } return new PointDouble(x, y); } } else { x = (inX - getStart().x) * (s.getEnd().x - s.getStart().x) / (getEnd().x - getStart().x) + s.getStart().x - inX; } if (getEnd().y.equals(getStart().y)) { // AB: Fixed: use s.getStart().x instead of getStart().x y = s.getStart().y - (s.getEnd().y - s.getStart().y) - inY; if (s.getEnd().y.equals(s.getStart().y)) { // horizontal lines - no x difference except the line is at an end x = 0; if (s.getStart().x > s.getEnd().x) { if (s.getStart().x < inX) { x = s.getStart().x - inX; } else if (s.getEnd().x > inX) { x = s.getEnd().x - inX; } } else { if (s.getEnd().x < inX) { x = s.getEnd().x - inX; } else if (s.getStart().x > inX) { x = s.getStart().x - inX; } } } } else { y = (inY - getStart().y) * (s.getEnd().y - s.getStart().y) / (getEnd().y - getStart().y) + s.getStart().y - inY; } return new PointDouble(x, y); } public boolean isConnected(PointDouble p, int maxDistance) { double distance = getDistanceToPoint(p); return distance < maxDistance; } } private final Vector<StickLine> stick = new Vector<StickLine>(); private PointDouble lastpoint = null; private PointDouble firstpoint = null; private final int elementX; private final int elementY; // store all points for the copyZoomed() method private final List<PointDouble> allPoints = new ArrayList<PointDouble>(); public StickingPolygon(int elementX, int elementY) { this.elementX = elementX; this.elementY = elementY; } public void addPoint(List<PointDouble> points) { for (PointDouble p : points) { addPoint(p.getX(), p.getY()); } } public void addPoint(double x, double y) { PointDouble p = new PointDouble(elementX + x, elementY + y); allPoints.add(p); if (firstpoint == null) { firstpoint = p; } else { stick.add(new StickLine(lastpoint, p)); } lastpoint = p; } public void addPoint(int x, int y, boolean connectToFirst) { this.addPoint(x, y); if (connectToFirst) { allPoints.add(firstpoint); stick.add(new StickLine(lastpoint, firstpoint)); } } public void addRectangle(int x, int y, int width, int height) { addPoint(x, y); addPoint(x + width, y); addPoint(x + width, y + height); addPoint(x, y + height, true); } public void addRectangle(Rectangle rect) { addRectangle(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); } public StickLine getLine(int index) { return stick.get(index); } public Vector<StickLine> getStickLines() { return stick; } public int isConnected(PointDouble p, int gridSize) { int con = -1; for (int i = 0; i < stick.size(); i++) { if (stick.get(i).isConnected(p, gridSize)) { return i; } } return con; } @Override public String toString() { return "StickingPolygon [stick=" + Arrays.toString(stick.toArray(new StickLine[stick.size()])) + "]"; } }