From e91d1eadde99ca42a339b153c9c58c337d22a62b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Sat, 18 May 2024 09:16:48 +0200 Subject: [PATCH] REFACTOR: position --- src/main/java/de/ph87/electro/CONFIG.java | 6 +- .../java/de/ph87/electro/circuit/Circuit.java | 64 ++------ .../de/ph87/electro/circuit/CircuitPanel.java | 11 +- .../circuit/CircuitPanelDropTarget.java | 24 ++- .../circuit/CircuitPanelMouseAdapter.java | 100 ++++++++----- .../java/de/ph87/electro/circuit/Wire.java | 22 +-- .../ph87/electro/circuit/part/Junction.java | 30 ++-- .../electro/circuit/part/Orientation.java | 20 +-- .../de/ph87/electro/circuit/part/Part.java | 141 +++++------------- .../de/ph87/electro/circuit/part/PartDto.java | 3 +- .../ph87/electro/circuit/part/PartOther.java | 4 +- .../ph87/electro/circuit/part/Position.java | 77 ++++++++++ .../de/ph87/electro/circuit/part/Render.java | 79 ++++++++++ .../circuit/part/parts/PartBattery.java | 27 ++-- .../part/parts/PartJunctionCorner.java | 11 +- .../circuit/part/parts/PartJunctionEdge.java | 11 +- .../part/parts/PartJunctionMiddle.java | 11 +- .../electro/circuit/part/parts/PartLight.java | 26 ++-- .../circuit/part/parts/PartSwitch1x1.java | 16 +- .../circuit/part/parts/PartSwitch1x2.java | 17 ++- .../circuit/part/parts/PartSwitchCross.java | 21 +-- .../de/ph87/electro/common/MathHelpers.java | 11 -- .../java/de/ph87/electro/demo/DemoAll.java | 53 ------- .../java/de/ph87/electro/sidebar/Sidebar.java | 16 +- .../de/ph87/electro/sidebar/SidebarPart.java | 2 - .../electro/circuit/BatteryLightTest.java | 6 +- .../circuit/BatterySwitcher1x1Test.java | 8 +- .../circuit/BatterySwitcher1x2Test.java | 10 +- .../circuit/BatterySwitcher2x2Test.java | 10 +- .../circuit/BatterySwitcherCrossTest.java | 12 +- .../electro/circuit/CircuitServiceTest.java | 8 +- 31 files changed, 433 insertions(+), 424 deletions(-) create mode 100644 src/main/java/de/ph87/electro/circuit/part/Position.java create mode 100644 src/main/java/de/ph87/electro/circuit/part/Render.java delete mode 100644 src/main/java/de/ph87/electro/common/MathHelpers.java delete mode 100644 src/main/java/de/ph87/electro/demo/DemoAll.java diff --git a/src/main/java/de/ph87/electro/CONFIG.java b/src/main/java/de/ph87/electro/CONFIG.java index cf2239b..aaf6211 100644 --- a/src/main/java/de/ph87/electro/CONFIG.java +++ b/src/main/java/de/ph87/electro/CONFIG.java @@ -26,7 +26,7 @@ public class CONFIG { public static final int P95 = (int) round(0.95 * RASTER); - public static final int JUNCTION_RADIUS = (int) round(0.05 * RASTER); + public static final int JUNCTION_RADIUS = (int) round(0.09 * RASTER); public static final int JUNCTION_RADIUS_HOVER = (int) round(1.5 * JUNCTION_RADIUS); @@ -34,7 +34,7 @@ public class CONFIG { public static final Color PART_HOVER_COLOR = new Color(192, 192, 192, 128); - public static final Color HOVER_BORDER_COLOR = Color.BLACK; + public static final Color JUNCTION_HOVER_BORDER_COLOR = Color.BLACK; public static final Color RASTER_COLOR = Color.gray; @@ -44,6 +44,8 @@ public class CONFIG { public static final Color VOLTAGE_LOW_COLOR = new Color(0, 128, 255); + public static final Color WIRE_HOVER_COLOR_BACK = Color.BLACK; + public static final Font LABEL_FONT = new Font("", Font.PLAIN, 20); public static final BasicStroke RASTER_STROKE = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1, new float[]{5}, 0); diff --git a/src/main/java/de/ph87/electro/circuit/Circuit.java b/src/main/java/de/ph87/electro/circuit/Circuit.java index bad4971..8bb6394 100644 --- a/src/main/java/de/ph87/electro/circuit/Circuit.java +++ b/src/main/java/de/ph87/electro/circuit/Circuit.java @@ -1,24 +1,18 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.part.Junction; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.PartDto; -import de.ph87.electro.circuit.part.parts.*; +import de.ph87.electro.circuit.part.Position; +import de.ph87.electro.circuit.part.parts.PartBattery; import lombok.NoArgsConstructor; import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; -import java.awt.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Stream; -import static de.ph87.electro.CONFIG.RASTER; -import static de.ph87.electro.common.MathHelpers.div; - -@Slf4j @NoArgsConstructor public class Circuit { @@ -41,36 +35,6 @@ public class Circuit { } } - public PartBattery addBattery(final String name, final int x, final int y, final Orientation orientation, final double voltage) { - final PartBattery battery = new PartBattery(name, new Point(x, y), orientation, voltage); - partAdd(battery); - return battery; - } - - public PartLight addLight(final String name, final int x, final int y, final Orientation orientation, final double minVoltage, final double maxVoltage) { - final PartLight light = new PartLight(name, new Point(x, y), orientation, minVoltage, maxVoltage); - partAdd(light); - return light; - } - - public PartSwitch1x1 addSwitch1x1(final String name, final int x, final int y, final Orientation orientation, final boolean state) { - final PartSwitch1x1 switch1x1 = new PartSwitch1x1(name, new Point(x, y), orientation, state); - partAdd(switch1x1); - return switch1x1; - } - - public PartSwitch1x2 addSwitch1x2(final String name, final int x, final int y, final Orientation orientation, final boolean state) { - final PartSwitch1x2 switch1x2 = new PartSwitch1x2(name, new Point(x, y), orientation, state); - partAdd(switch1x2); - return switch1x2; - } - - public PartSwitchCross addSwitchCross(final String name, final int x, final int y, final Orientation orientation, final boolean state) { - final PartSwitchCross switchCross = new PartSwitchCross(name, new Point(x, y), orientation, state); - partAdd(switchCross); - return switchCross; - } - public void connect(final Junction a, final Junction b) { wires.add(new Wire(a, b)); evaluateAndRender(); @@ -90,7 +54,7 @@ public class Circuit { return wires.stream(); } - public void partAdd(final Part part) { + public T addPart(final T part) { if (parts.contains(part)) { throw new RuntimeException(); } @@ -98,18 +62,19 @@ public class Circuit { parts.add(part); part.render(); } + return part; } - public void partMove(final Part part, final Point newPosition) { + public void movePart(final Part part, final Position position) { if (!parts.contains(part)) { throw new RuntimeException(); } - if (isFree(newPosition)) { - part.setPosition(newPosition); + if (isFree(position)) { + part.setPosition(position); } } - public boolean isFree(final Point position) { + public boolean isFree(final Position position) { return parts.stream().noneMatch(part -> part.getPosition().equals(position)); } @@ -121,21 +86,20 @@ public class Circuit { return parts.size(); } - public Optional findPart(final Point point) { - final Point cell = div(point, RASTER); - return streamParts().filter(p -> p.getPosition().equals(cell)).findFirst(); + public Optional findPartByPosition(final Position position) { + return streamParts().filter(p -> p.getPosition().raster.equals(position.raster)).findFirst(); } - public Optional findJunctionByPoint(final Point point) { - return findPart(point).flatMap(part -> part.findJunction(point)); + public Optional findJunctionByAbsolute(final Position position) { + return findPartByPosition(position).flatMap(part -> part.findJunctionByPosition(position)); } public Optional findJunctionByUuid(@NonNull final String junctionUuid) { return parts.stream().map(part -> part.findJunctionByUuid(junctionUuid)).filter(Optional::isPresent).map(Optional::get).findFirst(); } - public Optional findWireByPoint(final Point point) { - return wires.stream().filter(wire -> wire.intersects(point)).findFirst(); + public Optional findWireByPosition(final Position position) { + return wires.stream().filter(wire -> wire.intersects(position)).findFirst(); } public void removeWire(final Wire wire) { diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanel.java b/src/main/java/de/ph87/electro/circuit/CircuitPanel.java index 9fdf436..b68fc0f 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanel.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanel.java @@ -1,13 +1,12 @@ package de.ph87.electro.circuit; -import lombok.extern.slf4j.Slf4j; +import de.ph87.electro.circuit.part.Position; import javax.swing.*; import java.awt.*; import static de.ph87.electro.CONFIG.*; -@Slf4j public class CircuitPanel extends JPanel { private final Circuit circuit = new Circuit(); @@ -27,6 +26,7 @@ public class CircuitPanel extends JPanel { drawParts(g); drawRaster(g, w, h); drawWires(g); + mouseAdapter.drawHover(g); mouseAdapter.drawDrag(g); } @@ -52,12 +52,11 @@ public class CircuitPanel extends JPanel { private void drawWires(final Graphics2D g) { circuit.streamWires().forEach(wire -> { - final Point a = wire.getA().getAbsolute(); - final Point b = wire.getB().getAbsolute(); - + final Position a = wire.getA().getPosition(); + final Position b = wire.getB().getPosition(); g.setColor(wire.getA().getColor()); g.setStroke(WIRE_STROKE); - g.drawLine(a.x, a.y, b.x, b.y); + g.drawLine(a.absolute.x, a.absolute.y, b.absolute.x, b.absolute.y); }); } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java b/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java index 32cfc38..52bef6e 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java @@ -1,14 +1,12 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.part.Part; +import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.parts.*; import de.ph87.electro.common.AbstractDropTarget; import java.awt.*; -import static de.ph87.electro.CONFIG.RASTER; -import static de.ph87.electro.common.MathHelpers.div; - public class CircuitPanelDropTarget extends AbstractDropTarget { private final CircuitPanel circuitPanel; @@ -24,23 +22,23 @@ public class CircuitPanelDropTarget extends AbstractDropTarget { @Override protected boolean drop(final Point point, final String data) { - final Point raster = div(point, RASTER); + final Position position = new Position(point); if (data.equals(PartBattery.class.getSimpleName())) { - addPart(new PartBattery(raster)); + addPart(new PartBattery(position)); } else if (data.equals(PartJunctionCorner.class.getSimpleName())) { - addPart(new PartJunctionCorner(raster)); + addPart(new PartJunctionCorner(position)); } else if (data.equals(PartJunctionEdge.class.getSimpleName())) { - addPart(new PartJunctionEdge(raster)); + addPart(new PartJunctionEdge(position)); } else if (data.equals(PartJunctionMiddle.class.getSimpleName())) { - addPart(new PartJunctionMiddle(raster)); + addPart(new PartJunctionMiddle(position)); } else if (data.equals(PartLight.class.getSimpleName())) { - addPart(new PartLight(raster)); + addPart(new PartLight(position)); } else if (data.equals(PartSwitch1x1.class.getSimpleName())) { - addPart(new PartSwitch1x1(raster)); + addPart(new PartSwitch1x1(position)); } else if (data.equals(PartSwitch1x2.class.getSimpleName())) { - addPart(new PartSwitch1x2(raster)); + addPart(new PartSwitch1x2(position)); } else if (data.equals(PartSwitchCross.class.getSimpleName())) { - addPart(new PartSwitchCross(raster)); + addPart(new PartSwitchCross(position)); } else { throw new RuntimeException(); } @@ -49,7 +47,7 @@ public class CircuitPanelDropTarget extends AbstractDropTarget { } public void addPart(final Part part) { - circuit.partAdd(part); + circuit.addPart(part); circuitPanel.repaint(); } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java b/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java index d7a8589..dd2408f 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java @@ -2,7 +2,7 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Part; -import lombok.extern.slf4j.Slf4j; +import de.ph87.electro.circuit.part.Position; import java.awt.*; import java.awt.event.MouseAdapter; @@ -10,11 +10,9 @@ import java.awt.event.MouseEvent; import java.util.Optional; import static de.ph87.electro.CONFIG.*; -import static de.ph87.electro.common.MathHelpers.div; import static java.awt.event.MouseEvent.BUTTON1; import static java.awt.event.MouseEvent.BUTTON3; -@Slf4j class CircuitPanelMouseAdapter extends MouseAdapter { private final CircuitPanel circuitPanel; @@ -31,7 +29,7 @@ class CircuitPanelMouseAdapter extends MouseAdapter { private Junction junctionDrag = null; - private Point dragPosition = null; + private Position dragPosition = null; CircuitPanelMouseAdapter(final CircuitPanel circuitPanel, final Circuit circuit) { this.circuitPanel = circuitPanel; @@ -41,9 +39,11 @@ class CircuitPanelMouseAdapter extends MouseAdapter { } @Override - public void mouseClicked(final MouseEvent e) { - if (e.getButton() == BUTTON3) { - final Optional wireOptional = circuit.findWireByPoint(e.getPoint()); + public void mouseClicked(final MouseEvent event) { + final Position position = new Position(event); + + if (event.getButton() == BUTTON3) { + final Optional wireOptional = circuit.findWireByPosition(position); if (wireOptional.isPresent()) { circuit.removeWire(wireOptional.get()); circuitPanel.repaint(); @@ -51,9 +51,8 @@ class CircuitPanelMouseAdapter extends MouseAdapter { } } - final Point cell = div(e.getPoint(), RASTER); - final Optional partOptional = circuit.streamParts().filter(p -> p.getPosition().equals(cell)).findFirst(); - switch (e.getButton()) { + final Optional partOptional = circuit.findPartByPosition(position); + switch (event.getButton()) { case BUTTON1: partOptional.ifPresent(Part::action); circuit.evaluateAndRender(); @@ -67,18 +66,19 @@ class CircuitPanelMouseAdapter extends MouseAdapter { } @Override - public void mouseMoved(final MouseEvent e) { - findHover(e.getPoint()); + public void mouseMoved(final MouseEvent event) { + findHover(new Position(event)); circuitPanel.repaint(); } @Override public void mousePressed(final MouseEvent event) { - circuit.findPart(event.getPoint()).ifPresent(part -> startPartOrJunction(part, event.getPoint())); + final Position position = new Position(event); + circuit.findPartByPosition(position).ifPresent(part -> startPartOrJunction(part, position)); } - private void startPartOrJunction(final Part part, final Point point) { - part.findJunction(point).ifPresentOrElse(junction -> { + private void startPartOrJunction(final Part part, final Position position) { + part.findJunctionByPosition(position).ifPresentOrElse(junction -> { partDrag = null; junctionDrag = junction; }, () -> { @@ -88,23 +88,24 @@ class CircuitPanelMouseAdapter extends MouseAdapter { } @Override - public void mouseDragged(final MouseEvent e) { - findHover(e.getPoint()); + public void mouseDragged(final MouseEvent event) { + final Position position = new Position(event); + findHover(position); if (partDrag != null || junctionDrag != null) { - dragPosition = e.getPoint(); + dragPosition = position; } circuitPanel.repaint(); } - private void findHover(final Point point) { - partHover = circuit.findPart(point).orElse(null); - junctionHover = partHover != null ? partHover.findJunction(point).orElse(null) : null; + private void findHover(final Position position) { + partHover = circuit.findPartByPosition(position).orElse(null); + junctionHover = partHover != null ? partHover.findJunctionByPosition(position).orElse(null) : null; if (junctionHover != null) { partHover = null; wireHover = null; return; } - wireHover = circuit.findWireByPoint(point).orElse(null); + wireHover = circuit.findWireByPosition(position).orElse(null); if (wireHover != null) { partHover = null; } @@ -112,19 +113,13 @@ class CircuitPanelMouseAdapter extends MouseAdapter { @Override public void mouseReleased(final MouseEvent event) { - if (partDrag != null && junctionDrag != null) { - throw new RuntimeException(); - } - if ((partDrag != null || junctionDrag != null) == (dragPosition == null)) { - throw new RuntimeException(); - } - + final Position position = new Position(event); if (partDrag != null) { - circuit.partMove(partDrag, div(event.getPoint(), RASTER)); + circuit.movePart(partDrag, position); } if (junctionDrag != null) { - circuit.findJunctionByPoint(event.getPoint()).filter(destination -> destination != junctionDrag).ifPresent(destination -> circuit.connect(junctionDrag, destination)); + circuit.findJunctionByAbsolute(position).filter(destination -> destination != junctionDrag).ifPresent(destination -> circuit.connect(junctionDrag, destination)); } partDrag = null; @@ -133,26 +128,51 @@ class CircuitPanelMouseAdapter extends MouseAdapter { circuitPanel.repaint(); } - public void drawDrag(final Graphics2D g) { + public void drawHover(final Graphics2D g) { if (partHover != null) { - final Point zero = partHover.translate(new Point()); - partHover.rect(g, zero.x, zero.y, RASTER, RASTER, HOVER_BORDER_COLOR, HOVER_STROKE, null); + g.setColor(PART_HOVER_COLOR); + g.setStroke(HOVER_STROKE); + g.drawRect(partHover.getPosition().absolute.x, partHover.getPosition().absolute.y, RASTER, RASTER); } if (junctionHover != null) { - junctionHover.getOwner().circle(g, junctionHover.getAbsolute().x, junctionHover.getAbsolute().y, JUNCTION_RADIUS_HOVER, HOVER_BORDER_COLOR, HOVER_STROKE, junctionHover.getColor()); + g.setColor(junctionHover.getColor()); + g.fillArc(junctionHover.getPosition().absolute.x - JUNCTION_RADIUS_HOVER, junctionHover.getPosition().absolute.y - JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 0, 360); + + g.setColor(JUNCTION_HOVER_BORDER_COLOR); + g.setStroke(HOVER_STROKE); + g.drawArc(junctionHover.getPosition().absolute.x - JUNCTION_RADIUS_HOVER, junctionHover.getPosition().absolute.y - JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 0, 360); } if (wireHover != null) { - wireHover.getA().getOwner().line(g, wireHover.getA().getAbsolute(), wireHover.getB().getAbsolute(), HOVER_BORDER_COLOR, WIRE_HOVER_STROKE_BACK); - wireHover.getA().getOwner().line(g, wireHover.getA().getAbsolute(), wireHover.getB().getAbsolute(), wireHover.getA().getColor(), WIRE_HOVER_STROKE); - } + g.setColor(WIRE_HOVER_COLOR_BACK); + g.setStroke(WIRE_HOVER_STROKE_BACK); + g.drawLine( + wireHover.getA().getPosition().absolute.x, + wireHover.getA().getPosition().absolute.y, + wireHover.getB().getPosition().absolute.x, + wireHover.getB().getPosition().absolute.y + ); + g.setColor(wireHover.getA().getColor()); + g.setStroke(WIRE_HOVER_STROKE); + g.drawLine( + wireHover.getA().getPosition().absolute.x, + wireHover.getA().getPosition().absolute.y, + wireHover.getB().getPosition().absolute.x, + wireHover.getB().getPosition().absolute.y + ); + } + } + + public void drawDrag(final Graphics2D g) { if (dragPosition != null) { if (partDrag != null) { g.setColor(PART_HOVER_COLOR); - g.fillRect(dragPosition.x - P50, dragPosition.y - P50, RASTER, RASTER); + g.fillRect(dragPosition.absolute.x - P50, dragPosition.absolute.y - P50, RASTER, RASTER); } if (junctionDrag != null) { - junctionDrag.getOwner().line(g, junctionDrag.getAbsolute(), dragPosition, junctionDrag.getColor(), WIRE_STROKE); + g.setColor(junctionDrag.getColor()); + g.setStroke(WIRE_STROKE); + g.drawLine(junctionDrag.getPosition().absolute.x, junctionDrag.getPosition().absolute.y, dragPosition.absolute.x, dragPosition.absolute.y); } } } diff --git a/src/main/java/de/ph87/electro/circuit/Wire.java b/src/main/java/de/ph87/electro/circuit/Wire.java index 831f86c..d88b2e3 100644 --- a/src/main/java/de/ph87/electro/circuit/Wire.java +++ b/src/main/java/de/ph87/electro/circuit/Wire.java @@ -1,13 +1,10 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.part.Junction; +import de.ph87.electro.circuit.part.Position; import lombok.Data; import lombok.NonNull; -import java.awt.*; - -import static de.ph87.electro.CONFIG.WIRE_HOVER_STROKE_BACK; - @Data public class Wire { @@ -24,21 +21,8 @@ public class Wire { b.getWires().add(this); } - public boolean intersects(final Point p) { - final Point start = a.getAbsolute(); - final Point end = b.getAbsolute(); - double dx = end.x - start.x; - double dy = end.y - start.y; - double length = dx * dx + dy * dy; - if (length == 0) { - return p.distance(start) <= WIRE_HOVER_STROKE_BACK.getLineWidth(); - } - - double t = ((p.x - start.x) * dx + (p.y - start.y) * dy) / length; - t = Math.max(0, Math.min(1, t)); - double closestX = start.x + t * dx; - double closestY = start.y + t * dy; - return p.distance(closestX, closestY) <= WIRE_HOVER_STROKE_BACK.getLineWidth(); + public boolean intersects(final Position position) { + return position.distanceToLine(a.getPosition(), b.getPosition()); } public Junction getOpposite(final Junction junction) { diff --git a/src/main/java/de/ph87/electro/circuit/part/Junction.java b/src/main/java/de/ph87/electro/circuit/part/Junction.java index ef1ddad..d81c7b3 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Junction.java +++ b/src/main/java/de/ph87/electro/circuit/part/Junction.java @@ -26,7 +26,9 @@ public class Junction { @ToString.Include private final String name; - private final Point position; + private final Point relative; + + private Position position; private final Set wires = new HashSet<>(); @@ -42,18 +44,20 @@ public class Junction { return wires.stream().map(wire -> wire.getOpposite(this)).map(Junction::getUuid).toList(); } - public Junction(final Part owner, final String name, final Point position) { + public Junction(final Part owner, final String name, final Point relative) { this.owner = owner; this.uuid = UUID.randomUUID().toString(); this.name = name; - this.position = position; + this.relative = relative; + updatePosition(); } - public Junction(final Part owner, final JunctionDto dto, final Point position) { + public Junction(final Part owner, final JunctionDto dto, final Point relative) { this.owner = owner; this.uuid = dto.getUuid(); this.name = dto.getName(); - this.position = position; + this.relative = relative; + updatePosition(); } public void reset() { @@ -83,20 +87,16 @@ public class Junction { throw new ShortCircuit(); } - public void render(final Graphics2D g) { - owner.circle(g, position.x, position.y, JUNCTION_RADIUS, Color.BLACK, JUNCTION_STROKE, color); + public void render(final Render g) { + g.circle(position, JUNCTION_RADIUS, Color.BLACK, JUNCTION_STROKE, color); } - public Point getAbsolute() { - return owner.translate(getRotated()); + public void updatePosition() { + position = owner.getPosition().plus(owner.getOrientation().rotate(relative)); } - private Point getRotated() { - return owner.getOrientation().rotate(position); - } - - public boolean intersects(final Point absolute) { - return getAbsolute().distance(absolute) <= JUNCTION_RADIUS_HOVER; + public boolean intersects(final Position position) { + return this.position.distance(position) <= JUNCTION_RADIUS_HOVER; } } diff --git a/src/main/java/de/ph87/electro/circuit/part/Orientation.java b/src/main/java/de/ph87/electro/circuit/part/Orientation.java index a442a97..2e4f50a 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Orientation.java +++ b/src/main/java/de/ph87/electro/circuit/part/Orientation.java @@ -1,25 +1,27 @@ package de.ph87.electro.circuit.part; +import lombok.Getter; + import java.awt.*; import java.util.function.Function; import static de.ph87.electro.CONFIG.RASTER; -import static java.lang.Math.PI; @SuppressWarnings("SuspiciousNameCombination") public enum Orientation { R0(0, p -> new Point(p.x, p.y)), - R90(1, p -> new Point(RASTER - p.y, p.x)), - R180(2, p -> new Point(RASTER - p.x, RASTER - p.y)), - R270(3, p -> new Point(p.y, RASTER - p.x)), + R90(90, p -> new Point(RASTER - p.y, p.x)), + R180(180, p -> new Point(RASTER - p.x, RASTER - p.y)), + R270(270, p -> new Point(p.y, RASTER - p.x)), ; private final Function map; - private final int deg90; + @Getter + private final int degrees; - Orientation(final int deg90, final Function rotate) { - this.deg90 = deg90; + Orientation(final int degrees, final Function rotate) { + this.degrees = degrees; this.map = rotate; } @@ -31,8 +33,8 @@ public enum Orientation { return values()[(ordinal() + 1) % values().length]; } - public double getTheta() { - return PI / 2 * deg90; + public double getRadians() { + return degrees * Math.PI / 180; } } diff --git a/src/main/java/de/ph87/electro/circuit/part/Part.java b/src/main/java/de/ph87/electro/circuit/part/Part.java index 8f873cb..69f408a 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Part.java +++ b/src/main/java/de/ph87/electro/circuit/part/Part.java @@ -7,15 +7,14 @@ import lombok.Setter; import lombok.ToString; import java.awt.*; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; -import static de.ph87.electro.CONFIG.*; -import static java.lang.Math.round; +import static de.ph87.electro.CONFIG.PART_BACKGROUND; +import static de.ph87.electro.CONFIG.RASTER; +import static de.ph87.electro.circuit.part.Position.ZERO; @Getter @ToString(onlyExplicitlyIncluded = true) @@ -28,26 +27,25 @@ public abstract class Part { @ToString.Include private String name; - @Setter - private Point position; + private Position position; private Orientation orientation; private final List junctions = new ArrayList<>(); - private final BufferedImage render = new BufferedImage(RASTER, RASTER, BufferedImage.TYPE_INT_ARGB); + protected final Render render = new Render(); - protected Part(final String name, final Point position, final Orientation orientation) { + protected Part(final String name, final Position position, final Orientation orientation) { this.uuid = UUID.randomUUID().toString(); this.name = name; - this.position = position; + setPosition(position); this.orientation = orientation; } protected Part(final PartDto dto) { this.uuid = dto.getUuid(); this.name = dto.getName(); - this.position = dto.getPosition(); + setPosition(dto.getPosition()); this.orientation = dto.getOrientation(); } @@ -64,107 +62,44 @@ public abstract class Part { return junction; } + public void setPosition(final Position position) { + this.position = position.alignToRaster(); + junctions.forEach(Junction::updatePosition); + } + + public void clockwise() { + orientation = orientation.clockwise(); + junctions.forEach(Junction::updatePosition); + render(); + } + public void reset() { junctions.forEach(Junction::reset); } public void render() { - final Graphics2D g = (Graphics2D) render.getGraphics(); - g.rotate(orientation.getTheta(), P50, P50); - rect(g, 0, 0, RASTER, RASTER, null, null, PART_BACKGROUND); - if (getOrientation() == Orientation.R180) { - g.rotate(getOrientation().getTheta(), P50, P50); - } - _labels(g); - if (getOrientation() == Orientation.R180) { - g.rotate(-getOrientation().getTheta(), P50, P50); - } - _render(g); - junctions.forEach(junction -> junction.render(g)); + render.rect(ZERO, RASTER, RASTER, null, null, PART_BACKGROUND); + + _labels(); + render.resetTransform(); + + _render(); + render.resetTransform(); + + junctions.forEach(junction -> junction.render(render)); + render.resetTransform(); } public void paint(final Graphics2D g) { - g.drawImage(render, position.x * RASTER, position.y * RASTER, null); + g.drawImage(render.getImage(), position.absolute.x, position.absolute.y, null); } - public void clockwise() { - orientation = orientation.clockwise(); - render(); + public Optional findJunctionByUuid(final String junctionUuid) { + return junctions.stream().filter(junction -> junction.getUuid().equals(junctionUuid)).findFirst(); } - public void line(final Graphics2D g, final Junction junction0, final Junction junction1, final Color color, final BasicStroke stroke) { - line(g, junction0.getPosition().x, junction0.getPosition().y, junction1.getPosition().x, junction1.getPosition().y, color, stroke); - } - - public void line(final Graphics2D g, final Point p0, final Point p1, final Color color, final BasicStroke stroke) { - line(g, p0.x, p0.y, p1.x, p1.y, color, stroke); - } - - public void line(final Graphics2D g, final Junction junction0, final double x1, final double y1, final Color color, final BasicStroke stroke) { - line(g, junction0.getPosition().x, junction0.getPosition().y, x1, y1, color, stroke); - } - - public void line(final Graphics2D g, final double x0, final double y0, final double x1, final double y1, final Color color, final Stroke stroke) { - final int _x0 = (int) round(position.x + x0); - final int _y0 = (int) round(position.y + y0); - final int _x1 = (int) round(position.x + x1); - final int _y1 = (int) round(position.y + y1); - if (color != null) { - g.setColor(color); - } - if (stroke != null) { - g.setStroke(stroke); - } - g.drawLine(_x0, _y0, _x1, _y1); - } - - public void rect(final Graphics2D g, final double x, final double y, final double w, final double h, final Color border, final Stroke stroke, final Color fill) { - final int _x = (int) round(position.x + x); - final int _y = (int) round(position.y + y); - final int _w = (int) round(w); - final int _h = (int) round(h); - if (fill != null) { - g.setColor(fill); - g.fillRect(_x, _y, _w, _h); - } - if (border != null && stroke != null) { - g.setColor(border); - g.setStroke(stroke); - g.drawRect(_x, _y, _w, _h); - } - } - - public void circle(final Graphics2D g, final double x, final double y, final double radius, final Color border, final Stroke stroke, final Color fill) { - final int _x = (int) round(position.x + x - radius); - final int _y = (int) round(position.y + y - radius); - final int diameter = (int) round(radius * 2); - if (fill != null) { - g.setColor(fill); - g.fillArc(_x, _y, diameter, diameter, 0, 360); - } - if (border != null && stroke != null) { - g.setColor(border); - g.setStroke(stroke); - g.drawArc(_x, _y, diameter, diameter, 0, 360); - } - } - - public void textCenter(final Graphics2D g, final Font font, final String string, final int y, final Color color) { - g.setFont(font); - g.setColor(color); - final Rectangle2D bounds = g.getFontMetrics().getStringBounds(string, g); - g.drawString(string, (int) round(RASTER - bounds.getWidth()) / 2, y + g.getFont().getSize()); - } - - public Point translate(final Point p) { - return new Point( - p.x + position.x * RASTER, - p.y + position.y * RASTER - ); - } - - public Optional findJunction(final Point absolute) { - return junctions.stream().filter(junction -> junction.intersects(absolute)).findFirst(); + public Optional findJunctionByPosition(final Position position) { + return junctions.stream().filter(junction -> junction.intersects(position)).findFirst(); } public void action() { @@ -175,11 +110,11 @@ public abstract class Part { // may be overwritten } - protected void _render(final Graphics2D g) { + protected void _render() { // may be overwritten } - protected void _labels(final Graphics2D g) { + protected void _labels() { // may be overwritten } @@ -197,8 +132,4 @@ public abstract class Part { }; } - public Optional findJunctionByUuid(final String junctionUuid) { - return junctions.stream().filter(junction -> junction.getUuid().equals(junctionUuid)).findFirst(); - } - } diff --git a/src/main/java/de/ph87/electro/circuit/part/PartDto.java b/src/main/java/de/ph87/electro/circuit/part/PartDto.java index f5b095e..1254ffb 100644 --- a/src/main/java/de/ph87/electro/circuit/part/PartDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/PartDto.java @@ -6,7 +6,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; -import java.awt.*; import java.util.List; @Getter @@ -19,7 +18,7 @@ public class PartDto { private String name; - private Point position; + private Position position; private Orientation orientation; diff --git a/src/main/java/de/ph87/electro/circuit/part/PartOther.java b/src/main/java/de/ph87/electro/circuit/part/PartOther.java index e4e2699..e8cc319 100644 --- a/src/main/java/de/ph87/electro/circuit/part/PartOther.java +++ b/src/main/java/de/ph87/electro/circuit/part/PartOther.java @@ -1,10 +1,8 @@ package de.ph87.electro.circuit.part; -import java.awt.*; - public abstract class PartOther extends Part { - protected PartOther(final String name, final Point position, final Orientation orientation) { + protected PartOther(final String name, final Position position, final Orientation orientation) { super(name, position, orientation); } diff --git a/src/main/java/de/ph87/electro/circuit/part/Position.java b/src/main/java/de/ph87/electro/circuit/part/Position.java new file mode 100644 index 0000000..a95b7ed --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/Position.java @@ -0,0 +1,77 @@ +package de.ph87.electro.circuit.part; + +import lombok.Getter; +import lombok.ToString; + +import java.awt.*; +import java.awt.event.MouseEvent; + +import static de.ph87.electro.CONFIG.RASTER; +import static de.ph87.electro.CONFIG.WIRE_HOVER_STROKE_BACK; +import static java.lang.Math.*; + +@Getter +@ToString +public final class Position { + + public static final Position ZERO = new Position(0, 0); + + public final Point absolute; + + public final Point inside; + + public final Point raster; + + public Position(final int x, final int y) { + this.absolute = new Point(x, y); + this.raster = new Point(x / RASTER, y / RASTER); + this.inside = new Point(x % RASTER, y % RASTER); + } + + @Override + public int hashCode() { + return absolute.hashCode(); + } + + public Position(final double x, final double y) { + this((int) round(x), (int) round(y)); + } + + public Position(final Point point) { + this(point.x, point.y); + } + + public Position(final MouseEvent event) { + this(event.getX(), event.getY()); + } + + public Position plus(final Point vector) { + return new Position(absolute.x + vector.x, absolute.y + vector.y); + } + + public double distance(final Position position) { + return sqrt(pow(position.absolute.x - absolute.x, 2) + pow(position.absolute.y - absolute.y, 2)); + } + + public boolean distanceToLine(final Position lineStart, final Position lineEnd) { + double dx = lineEnd.absolute.x - lineStart.absolute.x; + double dy = lineEnd.absolute.y - lineStart.absolute.y; + double lineLength = dx * dx + dy * dy; + if (lineLength == 0) { + return distance(lineStart) <= WIRE_HOVER_STROKE_BACK.getLineWidth(); + } + + double t = ((absolute.x - lineStart.absolute.x) * dx + (absolute.y - lineStart.absolute.y) * dy) / lineLength; + t = Math.max(0, Math.min(1, t)); + + double closestX = lineStart.absolute.x + t * dx; + double closestY = lineStart.absolute.y + t * dy; + final double distance = sqrt(pow(closestX - absolute.x, 2) + pow(closestY - absolute.y, 2)); + return distance <= WIRE_HOVER_STROKE_BACK.getLineWidth(); + } + + public Position alignToRaster() { + return new Position(raster.x * RASTER, raster.y * RASTER); + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/Render.java b/src/main/java/de/ph87/electro/circuit/part/Render.java new file mode 100644 index 0000000..02e3cb5 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/Render.java @@ -0,0 +1,79 @@ +package de.ph87.electro.circuit.part; + +import lombok.Getter; + +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; + +import static de.ph87.electro.CONFIG.P50; +import static de.ph87.electro.CONFIG.RASTER; +import static java.lang.Math.round; + +public class Render { + + @Getter + private final BufferedImage image = new BufferedImage(RASTER, RASTER, BufferedImage.TYPE_INT_ARGB); + + private final Graphics2D g = image.createGraphics(); + + public void line(final Junction junction0, final Junction junction1, final Color color, final BasicStroke stroke) { + line(junction0.getPosition(), junction1.getPosition(), color, stroke); + } + + public void line(final Position p0, final Position p1, final Color color, final BasicStroke stroke) { + if (color != null) { + g.setColor(color); + } + if (stroke != null) { + g.setStroke(stroke); + } + g.drawLine(p0.inside.x, p0.inside.y, p1.inside.x, p1.inside.y); + } + + public void rect(final Position p, final double w, final double h, final Color border, final Stroke stroke, final Color fill) { + final int _w = (int) round(w); + final int _h = (int) round(h); + if (fill != null) { + g.setColor(fill); + g.fillRect(p.inside.x, p.inside.y, _w, _h); + } + if (border != null && stroke != null) { + g.setColor(border); + g.setStroke(stroke); + g.drawRect(p.inside.x, p.inside.y, _w, _h); + } + } + + public void circle(final Position center, final double radius, final Color border, final Stroke stroke, final Color fill) { + final int _x = (int) round(center.inside.x - radius); + final int _y = (int) round(center.inside.y - radius); + final int diameter = (int) round(radius * 2); + if (fill != null) { + g.setColor(fill); + g.fillArc(_x, _y, diameter, diameter, 0, 360); + } + if (border != null && stroke != null) { + g.setColor(border); + g.setStroke(stroke); + g.drawArc(_x, _y, diameter, diameter, 0, 360); + } + } + + public void textCenter(final Font font, final String string, final int y, final Color color) { + g.setFont(font); + g.setColor(color); + final Rectangle2D bounds = g.getFontMetrics().getStringBounds(string, g); + g.drawString(string, (int) round(RASTER - bounds.getWidth()) / 2, y + g.getFont().getSize()); + } + + public void clockwise(final Orientation orientation) { + g.rotate(orientation.getRadians(), P50, P50); + } + + public void resetTransform() { + g.setTransform(new AffineTransform()); + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PartBattery.java b/src/main/java/de/ph87/electro/circuit/part/parts/PartBattery.java index adbed24..3ab076d 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PartBattery.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PartBattery.java @@ -4,6 +4,7 @@ import de.ph87.electro.circuit.ShortCircuit; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; +import de.ph87.electro.circuit.part.Position; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -35,11 +36,15 @@ public class PartBattery extends Part { private ShortCircuit shortCircuit = null; - public PartBattery(final Point position) { + public PartBattery() { + this(Position.ZERO); + } + + public PartBattery(final Position position) { this("Batterie", position, Orientation.R0, VOLTAGE); } - public PartBattery(final String name, final Point position, final Orientation orientation, final double initialVoltage) { + public PartBattery(final String name, final Position position, final Orientation orientation, final double initialVoltage) { super(name, position, orientation); minus = newJunction(this, "-", P10, P50); plus = newJunction(this, "+", P90, P50); @@ -66,27 +71,29 @@ public class PartBattery extends Part { } @Override - protected void _render(final Graphics2D g) { - line(g, P10, P50, P50 - GAP / 2 - MINUS_W / 2, P50, Color.BLACK, SYMBOL_STROKE); - line(g, P50 + GAP / 2 + PLUS_W / 2, P50, P90, P50, Color.BLACK, SYMBOL_STROKE); - rect(g, P50 - MINUS_W - GAP / 2, P50 - MINUS_H / 2, MINUS_W, MINUS_H, null, null, Color.BLACK); - rect(g, P50 + GAP / 2, P50 - PLUS_H / 2, PLUS_W, PLUS_H, null, null, Color.BLACK); + protected void _render() { + render.clockwise(getOrientation()); + render.line(new Position(P10, P50), new Position(P50 - GAP / 2 - MINUS_W / 2, P50), Color.BLACK, SYMBOL_STROKE); + render.line(new Position(P50 + GAP / 2 + PLUS_W / 2, P50), new Position(P90, P50), Color.BLACK, SYMBOL_STROKE); + render.rect(new Position(P50 - MINUS_W - GAP / 2, P50 - MINUS_H / 2), MINUS_W, MINUS_H, null, null, Color.BLACK); + render.rect(new Position(P50 + GAP / 2, P50 - PLUS_H / 2), PLUS_W, PLUS_H, null, null, Color.BLACK); } @Override - protected void _labels(final Graphics2D g) { + protected void _labels() { final int y0; final int y1; if (getOrientation() == Orientation.R180) { y0 = P95 - LABEL_FONT.getSize(); y1 = P05; } else { + render.clockwise(getOrientation()); y0 = P05; y1 = P95 - LABEL_FONT.getSize(); } - textCenter(g, LABEL_FONT, "%.1fV".formatted(voltage), y0, Color.BLACK); + render.textCenter(LABEL_FONT, "%.1fV".formatted(voltage), y0, Color.BLACK); if (shortCircuit != null) { - textCenter(g, LABEL_FONT, "KURZSCHLUSS", y1, Color.RED); + render.textCenter(LABEL_FONT, "KURZSCHLUSS", y1, Color.RED); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionCorner.java b/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionCorner.java index 6686cec..182d2a2 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionCorner.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionCorner.java @@ -3,11 +3,10 @@ package de.ph87.electro.circuit.part.parts; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.PartOther; +import de.ph87.electro.circuit.part.Position; import lombok.Getter; import lombok.ToString; -import java.awt.*; - import static de.ph87.electro.CONFIG.*; @Getter @@ -18,11 +17,15 @@ public class PartJunctionCorner extends PartOther { private final Junction j1; - public PartJunctionCorner(final Point position) { + public PartJunctionCorner() { + this(Position.ZERO); + } + + public PartJunctionCorner(final Position position) { this("", position, Orientation.R0); } - public PartJunctionCorner(final String name, final Point position, final Orientation orientation) { + public PartJunctionCorner(final String name, final Position position, final Orientation orientation) { super(name, position, orientation); j0 = newJunction(this, "", P10, P10); j1 = newJunction(this, "", P90, P90); diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionEdge.java b/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionEdge.java index 2eea51e..1a42612 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionEdge.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionEdge.java @@ -3,11 +3,10 @@ package de.ph87.electro.circuit.part.parts; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.PartOther; +import de.ph87.electro.circuit.part.Position; import lombok.Getter; import lombok.ToString; -import java.awt.*; - import static de.ph87.electro.CONFIG.P50; import static de.ph87.electro.CONFIG.P10; @@ -19,11 +18,15 @@ public class PartJunctionEdge extends PartOther { private final Junction j1; - public PartJunctionEdge(final Point position) { + public PartJunctionEdge() { + this(Position.ZERO); + } + + public PartJunctionEdge(final Position position) { this("", position, Orientation.R0); } - public PartJunctionEdge(final String name, final Point position, final Orientation orientation) { + public PartJunctionEdge(final String name, final Position position, final Orientation orientation) { super(name, position, orientation); j0 = newJunction(this, "", P10, P50); j1 = newJunction(this, "", P50, P10); diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionMiddle.java b/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionMiddle.java index 319b301..0e33035 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionMiddle.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PartJunctionMiddle.java @@ -3,11 +3,10 @@ package de.ph87.electro.circuit.part.parts; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.PartOther; +import de.ph87.electro.circuit.part.Position; import lombok.Getter; import lombok.ToString; -import java.awt.*; - import static de.ph87.electro.CONFIG.P50; @Getter @@ -16,11 +15,15 @@ public class PartJunctionMiddle extends PartOther { private final Junction junction; - public PartJunctionMiddle(final Point position) { + public PartJunctionMiddle() { + this(Position.ZERO); + } + + public PartJunctionMiddle(final Position position) { this("", position, Orientation.R0); } - public PartJunctionMiddle(final String name, final Point position, final Orientation orientation) { + public PartJunctionMiddle(final String name, final Position position, final Orientation orientation) { super(name, position, orientation); junction = newJunction(this, "", P50, P50); } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PartLight.java b/src/main/java/de/ph87/electro/circuit/part/parts/PartLight.java index 8dad604..047e734 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PartLight.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PartLight.java @@ -3,6 +3,7 @@ package de.ph87.electro.circuit.part.parts; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.PartOther; +import de.ph87.electro.circuit.part.Position; import lombok.Getter; import lombok.ToString; @@ -46,11 +47,15 @@ public class PartLight extends PartOther { private Color color = BULB_OFF_COLOR; - public PartLight(final Point position) { + public PartLight() { + this(Position.ZERO); + } + + public PartLight(final Position position) { this("Licht", position, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); } - public PartLight(final String name, final Point position, final Orientation orientation, final double minVoltage, final double maxVoltage) { + public PartLight(final String name, final Position position, final Orientation orientation, final double minVoltage, final double maxVoltage) { super(name, position, orientation); this.minVoltage = minVoltage; this.maxVoltage = maxVoltage; @@ -91,29 +96,30 @@ public class PartLight extends PartOther { } @Override - protected void _render(final Graphics2D g) { - line(g, pin0, pin1, Color.BLACK, SYMBOL_STROKE); - circle(g, P50, P50, BULB_RADIUS, Color.BLACK, SYMBOL_STROKE, color); + protected void _render() { + render.line(pin0, pin1, Color.BLACK, SYMBOL_STROKE); + render.circle(new Position(P50, P50), BULB_RADIUS, Color.BLACK, SYMBOL_STROKE, color); final double diag = 0.33 * RASTER; - line(g, diag, diag, RASTER - diag, RASTER - diag, Color.BLACK, SYMBOL_STROKE); - line(g, diag, RASTER - diag, RASTER - diag, diag, Color.BLACK, SYMBOL_STROKE); + render.line(new Position(diag, diag), new Position(RASTER - diag, RASTER - diag), Color.BLACK, SYMBOL_STROKE); + render.line(new Position(diag, RASTER - diag), new Position(RASTER - diag, diag), Color.BLACK, SYMBOL_STROKE); } @Override - protected void _labels(final Graphics2D g) { + protected void _labels() { final int y0; final int y1; if (getOrientation() == Orientation.R180) { y0 = P95 - LABEL_FONT.getSize(); y1 = P05; } else { + render.clockwise(getOrientation()); y0 = P05; y1 = P95 - LABEL_FONT.getSize(); } - textCenter(g, LABEL_FONT, "%.1fV (max)".formatted(maxVoltage), y0, Color.BLACK); + render.textCenter(LABEL_FONT, "%.1fV (max)".formatted(maxVoltage), y0, Color.BLACK); if (defect) { - textCenter(g, LABEL_FONT, "DEFEKT", y1, Color.RED); + render.textCenter(LABEL_FONT, "DEFEKT", y1, Color.RED); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitch1x1.java b/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitch1x1.java index 4461f35..a46b2f7 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitch1x1.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitch1x1.java @@ -4,6 +4,7 @@ import de.ph87.electro.circuit.ShortCircuit; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.PartOther; +import de.ph87.electro.circuit.part.Position; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -23,11 +24,15 @@ public class PartSwitch1x1 extends PartOther { @Setter private boolean state; - public PartSwitch1x1(final Point position) { + public PartSwitch1x1() { + this(Position.ZERO); + } + + public PartSwitch1x1(final Position position) { this("Ausschalter", position, Orientation.R0, false); } - public PartSwitch1x1(final String name, final Point position, final Orientation orientation, final boolean state) { + public PartSwitch1x1(final String name, final Position position, final Orientation orientation, final boolean state) { super(name, position, orientation); common = newJunction(this, "", P10, P50); output = newJunction(this, "", P90, P50); @@ -60,11 +65,12 @@ public class PartSwitch1x1 extends PartOther { } @Override - protected void _render(final Graphics2D g) { + protected void _render() { if (!state) { - line(g, common, P90, P25, common.getColor(), SWITCH_STROKE); + final Point end = getOrientation().rotate(new Point(P90, P25)); + render.line(common.getPosition(), new Position(end), common.getColor(), SWITCH_STROKE); } else { - line(g, common, output, common.getColor(), SWITCH_STROKE); + render.line(common, output, common.getColor(), SWITCH_STROKE); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitch1x2.java b/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitch1x2.java index ba548d2..73d1a84 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitch1x2.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitch1x2.java @@ -4,12 +4,11 @@ import de.ph87.electro.circuit.ShortCircuit; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.PartOther; +import de.ph87.electro.circuit.part.Position; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.awt.*; - import static de.ph87.electro.CONFIG.*; @Getter @@ -25,11 +24,15 @@ public class PartSwitch1x2 extends PartOther { @Setter private boolean state; - public PartSwitch1x2(final Point position) { + public PartSwitch1x2() { + this(Position.ZERO); + } + + public PartSwitch1x2(final Position position) { this("Wechselschalter", position, Orientation.R0, false); } - public PartSwitch1x2(final String name, final Point position, final Orientation orientation, final boolean state) { + public PartSwitch1x2(final String name, final Position position, final Orientation orientation, final boolean state) { super(name, position, orientation); common = newJunction(this, "", P10, P50); output0 = newJunction(this, "", P90, P25); @@ -70,11 +73,11 @@ public class PartSwitch1x2 extends PartOther { } @Override - protected void _render(final Graphics2D g) { + protected void _render() { if (!state) { - line(g, common, output0, common.getColor(), SWITCH_STROKE); + render.line(common, output0, common.getColor(), SWITCH_STROKE); } else { - line(g, common, output1, common.getColor(), SWITCH_STROKE); + render.line(common, output1, common.getColor(), SWITCH_STROKE); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitchCross.java b/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitchCross.java index 9c50842..9bff9ea 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitchCross.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PartSwitchCross.java @@ -4,12 +4,11 @@ import de.ph87.electro.circuit.ShortCircuit; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.PartOther; +import de.ph87.electro.circuit.part.Position; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.awt.*; - import static de.ph87.electro.CONFIG.*; @Getter @@ -27,11 +26,15 @@ public class PartSwitchCross extends PartOther { @Setter private boolean state; - public PartSwitchCross(final Point position) { + public PartSwitchCross() { + this(Position.ZERO); + } + + public PartSwitchCross(final Position position) { this("Kreuzschalter", position, Orientation.R0, false); } - public PartSwitchCross(final String name, final Point position, final Orientation orientation, final boolean state) { + public PartSwitchCross(final String name, final Position position, final Orientation orientation, final boolean state) { super(name, position, orientation); common0 = newJunction(this, "", P10, P25); common1 = newJunction(this, "", P10, P75); @@ -84,13 +87,13 @@ public class PartSwitchCross extends PartOther { } @Override - protected void _render(final Graphics2D g) { + protected void _render() { if (!state) { - line(g, common0, output0, common0.getColor(), SWITCH_STROKE); - line(g, common1, output1, common1.getColor(), SWITCH_STROKE); + render.line(common0, output0, common0.getColor(), SWITCH_STROKE); + render.line(common1, output1, common1.getColor(), SWITCH_STROKE); } else { - line(g, common0, output1, common0.getColor(), SWITCH_STROKE); - line(g, common1, output0, common1.getColor(), SWITCH_STROKE); + render.line(common0, output1, common0.getColor(), SWITCH_STROKE); + render.line(common1, output0, common1.getColor(), SWITCH_STROKE); } } diff --git a/src/main/java/de/ph87/electro/common/MathHelpers.java b/src/main/java/de/ph87/electro/common/MathHelpers.java deleted file mode 100644 index 0638e5b..0000000 --- a/src/main/java/de/ph87/electro/common/MathHelpers.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.ph87.electro.common; - -import java.awt.*; - -public class MathHelpers { - - public static Point div(final Point p, final int div) { - return new Point(p.x / div, p.y / div); - } - -} diff --git a/src/main/java/de/ph87/electro/demo/DemoAll.java b/src/main/java/de/ph87/electro/demo/DemoAll.java deleted file mode 100644 index 4ed45bd..0000000 --- a/src/main/java/de/ph87/electro/demo/DemoAll.java +++ /dev/null @@ -1,53 +0,0 @@ -package de.ph87.electro.demo; - -import de.ph87.electro.circuit.Circuit; -import de.ph87.electro.circuit.part.Orientation; -import de.ph87.electro.circuit.part.parts.*; - -import static de.ph87.electro.CONFIG.BULB_VOLTAGE_MIN; -import static de.ph87.electro.CONFIG.VOLTAGE; - -public class DemoAll { - - public static Circuit complexTrippleAndSimple() { - final Circuit circuit = new Circuit(); - - final PartBattery battery = circuit.addBattery("Batterie", 0, 0, Orientation.R180, VOLTAGE); - final PartSwitch1x1 switcher = circuit.addSwitch1x1("Ausschalter", 2, 0, Orientation.R0, false); - final PartLight light = circuit.addLight("Licht", 4, 0, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); - final PartSwitch1x2 switcher0 = circuit.addSwitch1x2("Wechselschalter 0", 0, 2, Orientation.R0, false); - final PartSwitchCross switcherX = circuit.addSwitchCross("Kreuzschalter", 2, 2, Orientation.R0, false); - final PartSwitch1x2 switcher1 = circuit.addSwitch1x2("Wechselschalter 1", 4, 2, Orientation.R180, true); - - circuit.connect(battery.getMinus(), switcher.getCommon()); - circuit.connect(switcher.getOutput(), light.getPin0()); - - circuit.connect(battery.getPlus(), switcher0.getCommon()); - circuit.connect(switcher0.getOutput0(), switcherX.getCommon0()); - circuit.connect(switcher0.getOutput1(), switcherX.getCommon1()); - circuit.connect(switcherX.getOutput0(), switcher1.getOutput1()); - circuit.connect(switcherX.getOutput1(), switcher1.getOutput0()); - circuit.connect(switcher1.getCommon(), light.getPin1()); - - return circuit; - } - - public static Circuit simpleAlternative() { - final Circuit circuit = new Circuit(); - - final PartBattery battery = circuit.addBattery("Batterie", 2, 0, Orientation.R90, VOLTAGE); - final PartLight light0 = circuit.addLight("Licht 0", 4, 2, Orientation.R90, BULB_VOLTAGE_MIN, VOLTAGE); - final PartLight light1 = circuit.addLight("Licht 1", 0, 2, Orientation.R90, BULB_VOLTAGE_MIN, VOLTAGE); - final PartSwitch1x2 switcher0 = circuit.addSwitch1x2("Wechselschalter 0", 2, 2, Orientation.R90, false); - - circuit.connect(battery.getMinus(), light0.getPin0()); - circuit.connect(battery.getMinus(), light1.getPin0()); - - circuit.connect(battery.getPlus(), switcher0.getCommon()); - circuit.connect(switcher0.getOutput0(), light0.getPin1()); - circuit.connect(switcher0.getOutput1(), light1.getPin1()); - - return circuit; - } - -} diff --git a/src/main/java/de/ph87/electro/sidebar/Sidebar.java b/src/main/java/de/ph87/electro/sidebar/Sidebar.java index d4e68a0..6714928 100644 --- a/src/main/java/de/ph87/electro/sidebar/Sidebar.java +++ b/src/main/java/de/ph87/electro/sidebar/Sidebar.java @@ -9,14 +9,14 @@ import java.awt.*; public class Sidebar extends JPanel { public Sidebar() { - add(new PartBattery(new Point(0, 0))); - add(new PartJunctionCorner(new Point(0, 0))); - add(new PartJunctionEdge(new Point(0, 0))); - add(new PartJunctionMiddle(new Point(0, 0))); - add(new PartLight(new Point(0, 0))); - add(new PartSwitch1x1(new Point(0, 0))); - add(new PartSwitch1x2(new Point(0, 0))); - add(new PartSwitchCross(new Point(0, 0))); + add(new PartBattery()); + add(new PartJunctionCorner()); + add(new PartJunctionEdge()); + add(new PartJunctionMiddle()); + add(new PartLight()); + add(new PartSwitch1x1()); + add(new PartSwitch1x2()); + add(new PartSwitchCross()); setPreferredSize(new Dimension(0, 200)); } diff --git a/src/main/java/de/ph87/electro/sidebar/SidebarPart.java b/src/main/java/de/ph87/electro/sidebar/SidebarPart.java index 3138aaa..de05d23 100644 --- a/src/main/java/de/ph87/electro/sidebar/SidebarPart.java +++ b/src/main/java/de/ph87/electro/sidebar/SidebarPart.java @@ -2,7 +2,6 @@ package de.ph87.electro.sidebar; import de.ph87.electro.circuit.part.Part; import lombok.Getter; -import lombok.extern.slf4j.Slf4j; import javax.swing.*; import java.awt.*; @@ -12,7 +11,6 @@ import java.awt.dnd.DragSource; import static de.ph87.electro.CONFIG.RASTER; -@Slf4j @Getter public class SidebarPart extends JPanel { diff --git a/src/test/java/de/ph87/electro/circuit/BatteryLightTest.java b/src/test/java/de/ph87/electro/circuit/BatteryLightTest.java index d768207..40fb658 100644 --- a/src/test/java/de/ph87/electro/circuit/BatteryLightTest.java +++ b/src/test/java/de/ph87/electro/circuit/BatteryLightTest.java @@ -1,12 +1,10 @@ package de.ph87.electro.circuit; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.parts.PartBattery; import de.ph87.electro.circuit.part.parts.PartLight; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import static de.ph87.electro.CONFIG.BULB_VOLTAGE_MIN; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -16,9 +14,9 @@ public class BatteryLightTest { private static final Circuit circuit = new Circuit(); - private static final PartBattery battery = circuit.addBattery("Batterie", 1, 0, Orientation.R0, VOLTAGE); + private static final PartBattery battery = circuit.addPart(new PartBattery()); - private static final PartLight light = circuit.addLight("Licht", 1, 1, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); + private static final PartLight light = circuit.addPart(new PartLight()); @BeforeAll public static void setUp() { diff --git a/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x1Test.java b/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x1Test.java index f4fadca..384fca6 100644 --- a/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x1Test.java +++ b/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x1Test.java @@ -1,13 +1,11 @@ package de.ph87.electro.circuit; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.parts.PartBattery; import de.ph87.electro.circuit.part.parts.PartLight; import de.ph87.electro.circuit.part.parts.PartSwitch1x1; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import static de.ph87.electro.CONFIG.BULB_VOLTAGE_MIN; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -17,11 +15,11 @@ public class BatterySwitcher1x1Test { private static final Circuit circuit = new Circuit(); - private static final PartBattery battery = circuit.addBattery("Batterie", 1, 0, Orientation.R0, VOLTAGE); + private static final PartBattery battery = circuit.addPart(new PartBattery()); - private static final PartSwitch1x1 switcher = circuit.addSwitch1x1("Ein-/Ausschalter", 0, 1, Orientation.R0, false); + private static final PartSwitch1x1 switcher = circuit.addPart(new PartSwitch1x1()); - private static final PartLight light = circuit.addLight("Licht", 1, 1, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); + private static final PartLight light = circuit.addPart(new PartLight()); @BeforeAll public static void setUp() { diff --git a/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x2Test.java b/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x2Test.java index 4831a60..ea58162 100644 --- a/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x2Test.java +++ b/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x2Test.java @@ -1,13 +1,11 @@ package de.ph87.electro.circuit; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.parts.PartBattery; import de.ph87.electro.circuit.part.parts.PartLight; import de.ph87.electro.circuit.part.parts.PartSwitch1x2; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import static de.ph87.electro.CONFIG.BULB_VOLTAGE_MIN; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -17,13 +15,13 @@ public class BatterySwitcher1x2Test { private static final Circuit circuit = new Circuit(); - private static final PartBattery battery = circuit.addBattery("Batterie", 1, 0, Orientation.R0, VOLTAGE); + private static final PartBattery battery = circuit.addPart(new PartBattery()); - private static final PartSwitch1x2 switcher = circuit.addSwitch1x2("Wechselschalter", 0, 2, Orientation.R0, false); + private static final PartSwitch1x2 switcher = circuit.addPart(new PartSwitch1x2()); - private static final PartLight light0 = circuit.addLight("Licht 0", 1, 1, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); + private static final PartLight light0 = circuit.addPart(new PartLight()); - private static final PartLight light1 = circuit.addLight("Licht 1", 1, 3, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); + private static final PartLight light1 = circuit.addPart(new PartLight()); @BeforeAll public static void setUp() { diff --git a/src/test/java/de/ph87/electro/circuit/BatterySwitcher2x2Test.java b/src/test/java/de/ph87/electro/circuit/BatterySwitcher2x2Test.java index ccb1d70..0880340 100644 --- a/src/test/java/de/ph87/electro/circuit/BatterySwitcher2x2Test.java +++ b/src/test/java/de/ph87/electro/circuit/BatterySwitcher2x2Test.java @@ -1,13 +1,11 @@ package de.ph87.electro.circuit; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.parts.PartBattery; import de.ph87.electro.circuit.part.parts.PartLight; import de.ph87.electro.circuit.part.parts.PartSwitch1x2; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import static de.ph87.electro.CONFIG.BULB_VOLTAGE_MIN; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -17,13 +15,13 @@ public class BatterySwitcher2x2Test { private static final Circuit circuit = new Circuit(); - private static final PartBattery battery = circuit.addBattery("Batterie", 0, 0, Orientation.R0, VOLTAGE); + private static final PartBattery battery = circuit.addPart(new PartBattery()); - private static final PartSwitch1x2 switcher0 = circuit.addSwitch1x2("Wechselschalter 0", 0, 1, Orientation.R0, false); + private static final PartSwitch1x2 switcher0 = circuit.addPart(new PartSwitch1x2()); - private static final PartSwitch1x2 switcher1 = circuit.addSwitch1x2("Wechselschalter 1", 1, 1, Orientation.R0, false); + private static final PartSwitch1x2 switcher1 = circuit.addPart(new PartSwitch1x2()); - private static final PartLight light = circuit.addLight("Licht", 1, 0, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); + private static final PartLight light = circuit.addPart(new PartLight()); @BeforeAll public static void setUp() { diff --git a/src/test/java/de/ph87/electro/circuit/BatterySwitcherCrossTest.java b/src/test/java/de/ph87/electro/circuit/BatterySwitcherCrossTest.java index 7fb731f..278cd52 100644 --- a/src/test/java/de/ph87/electro/circuit/BatterySwitcherCrossTest.java +++ b/src/test/java/de/ph87/electro/circuit/BatterySwitcherCrossTest.java @@ -1,6 +1,5 @@ package de.ph87.electro.circuit; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.parts.PartBattery; import de.ph87.electro.circuit.part.parts.PartLight; import de.ph87.electro.circuit.part.parts.PartSwitch1x2; @@ -8,7 +7,6 @@ import de.ph87.electro.circuit.part.parts.PartSwitchCross; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import static de.ph87.electro.CONFIG.BULB_VOLTAGE_MIN; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -18,15 +16,15 @@ public class BatterySwitcherCrossTest { private static final Circuit circuit = new Circuit(); - private static final PartBattery battery = circuit.addBattery("Batterie", 0, 0, Orientation.R0, VOLTAGE); + private static final PartBattery battery = circuit.addPart(new PartBattery()); - private static final PartSwitch1x2 switcher0 = circuit.addSwitch1x2("Wechselschalter 0", 0, 1, Orientation.R0, false); + private static final PartSwitch1x2 switcher0 = circuit.addPart(new PartSwitch1x2()); - private static final PartSwitchCross switcherX = circuit.addSwitchCross("Kreuzschalter", 1, 1, Orientation.R0, false); + private static final PartSwitchCross switcherX = circuit.addPart(new PartSwitchCross()); - private static final PartSwitch1x2 switcher1 = circuit.addSwitch1x2("Wechselschalter 1", 2, 1, Orientation.R0, false); + private static final PartSwitch1x2 switcher1 = circuit.addPart(new PartSwitch1x2()); - private static final PartLight light = circuit.addLight("Licht", 2, 0, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); + private static final PartLight light = circuit.addPart(new PartLight()); @BeforeAll public static void setUp() { diff --git a/src/test/java/de/ph87/electro/circuit/CircuitServiceTest.java b/src/test/java/de/ph87/electro/circuit/CircuitServiceTest.java index 1d953a5..08236ef 100644 --- a/src/test/java/de/ph87/electro/circuit/CircuitServiceTest.java +++ b/src/test/java/de/ph87/electro/circuit/CircuitServiceTest.java @@ -1,7 +1,6 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.part.Junction; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.parts.PartBattery; import de.ph87.electro.circuit.part.parts.PartLight; @@ -12,8 +11,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; -import static de.ph87.electro.CONFIG.BULB_VOLTAGE_MIN; -import static de.ph87.electro.CONFIG.VOLTAGE; import static org.junit.jupiter.api.Assertions.assertEquals; class CircuitServiceTest { @@ -21,8 +18,8 @@ class CircuitServiceTest { @Test void serialization() throws IOException { final Circuit circuit = new Circuit(); - final PartBattery battery = circuit.addBattery("Batterie", 1, 0, Orientation.R90, VOLTAGE); - final PartLight light = circuit.addLight("Licht", 1, 1, Orientation.R0, BULB_VOLTAGE_MIN, VOLTAGE); + final PartBattery battery = circuit.addPart(new PartBattery()); + final PartLight light = circuit.addPart(new PartLight()); circuit.connect(battery.getPlus(), light.getPin1()); circuit.connect(light.getPin0(), battery.getMinus()); check(circuit); @@ -53,6 +50,7 @@ class CircuitServiceTest { final Junction reloadedJunction = reloadedPart.getJunctions().stream().filter(junction -> junction.getUuid().equals(originalJunction.getUuid())).findFirst().orElseThrow(); assertEquals(originalJunction.getUuid(), reloadedJunction.getUuid()); assertEquals(originalJunction.getName(), reloadedJunction.getName()); + assertEquals(originalJunction.getRelative(), reloadedJunction.getRelative()); assertEquals(originalJunction.getPosition(), reloadedJunction.getPosition()); assertEquals(originalJunction.getWires().size(), reloadedJunction.getWires().size()); originalJunction.getWires().stream()