From d881c8ff04edb2a648473b9a3a58e22740c7a0a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Wed, 29 May 2024 14:31:22 +0200 Subject: [PATCH] REFACTOR: position, evaluate, repaint --- src/main/java/de/ph87/electro/CONFIG.java | 15 +- src/main/java/de/ph87/electro/Window.java | 15 +- .../java/de/ph87/electro/circuit/Circuit.java | 59 +++--- .../electro/circuit/CircuitIOService.java | 5 +- .../ph87/electro/circuit/CircuitPainter.java | 77 +++++++- .../de/ph87/electro/circuit/CircuitPanel.java | 37 ++-- .../circuit/CircuitPanelDropTarget.java | 26 +-- .../circuit/CircuitPanelMouseAdapter.java | 179 +++++++++--------- .../de/ph87/electro/circuit/demo/Demos.java | 10 +- .../electro/circuit/part/Orientation.java | 4 +- .../de/ph87/electro/circuit/part/Part.java | 143 +++++++------- .../de/ph87/electro/circuit/part/PartDto.java | 2 +- .../ph87/electro/circuit/part/Position.java | 94 --------- .../de/ph87/electro/circuit/part/Render.java | 82 -------- .../circuit/part/junction/Junction.java | 37 ++-- .../electro/circuit/part/parts/Battery.java | 59 +++--- .../circuit/part/parts/ConnectorCorner.java | 12 +- .../circuit/part/parts/ConnectorEdge.java | 12 +- .../circuit/part/parts/ConnectorMiddle.java | 12 +- .../electro/circuit/part/parts/Light.java | 34 ++-- .../ph87/electro/circuit/part/parts/Poti.java | 23 +-- .../circuit/part/parts/RotationMatrix.java | 10 +- .../electro/circuit/part/parts/Switch1x1.java | 24 +-- .../electro/circuit/part/parts/Switch1x2.java | 21 +- .../circuit/part/parts/SwitchCross.java | 25 ++- .../electro/circuit/part/parts/Voltmeter.java | 77 ++++---- .../de/ph87/electro/circuit/wire/Wire.java | 34 +++- .../java/de/ph87/electro/sidebar/Sidebar.java | 54 ++---- .../de/ph87/electro/sidebar/SidebarPart.java | 3 +- .../circuit/CalculationServiceTest.java | 6 +- .../circuit/io/CircuitIOServiceTest.java | 12 +- .../circuit/part/parts/BatteryLightTest.java | 8 +- .../part/parts/BatterySwitcher1x1Test.java | 9 +- .../part/parts/BatterySwitcher1x2Test.java | 11 +- .../part/parts/BatterySwitcher2x2Test.java | 11 +- .../part/parts/BatterySwitcherCrossTest.java | 13 +- 36 files changed, 563 insertions(+), 692 deletions(-) delete mode 100644 src/main/java/de/ph87/electro/circuit/part/Position.java delete mode 100644 src/main/java/de/ph87/electro/circuit/part/Render.java diff --git a/src/main/java/de/ph87/electro/CONFIG.java b/src/main/java/de/ph87/electro/CONFIG.java index decece9..8a5bcd3 100644 --- a/src/main/java/de/ph87/electro/CONFIG.java +++ b/src/main/java/de/ph87/electro/CONFIG.java @@ -4,6 +4,7 @@ import java.awt.*; import static java.lang.Math.round; +@SuppressWarnings("unused") public class CONFIG { public static final double NO_RESISTANCE = 1e-12; @@ -20,6 +21,8 @@ public class CONFIG { public static final int RASTER = 200; + public static final int P03 = (int) round(0.03 * RASTER); + public static final int P05 = (int) round(0.05 * RASTER); public static final int P10 = (int) round(0.1 * RASTER); @@ -28,6 +31,8 @@ public class CONFIG { public static final int P50 = (int) round(0.5 * RASTER); + public static final int P65 = (int) round(0.65 * RASTER); + public static final int P75 = (int) round(0.75 * RASTER); public static final int P70 = (int) round(0.7 * RASTER); @@ -42,7 +47,7 @@ public class CONFIG { public static final int JUNCTION_RADIUS_HOVER = (int) round(1.5 * JUNCTION_RADIUS); - public static final Color PART_BACKGROUND = new Color(224, 224, 224); + public static final Color PART_BACK_COLOR = new Color(224, 224, 224); public static final Color PART_HOVER_COLOR = new Color(192, 192, 192, 128); @@ -76,4 +81,12 @@ public class CONFIG { public static final BasicStroke SWITCH_STROKE = new BasicStroke(15); + public static Point ALIGN(final Point position) { + return new Point(position.x / RASTER * RASTER, position.y / RASTER * RASTER); + } + + public static Point RASTER(final int x, final int y) { + return new Point(x * RASTER, y * RASTER); + } + } diff --git a/src/main/java/de/ph87/electro/Window.java b/src/main/java/de/ph87/electro/Window.java index 349bba2..c45045f 100644 --- a/src/main/java/de/ph87/electro/Window.java +++ b/src/main/java/de/ph87/electro/Window.java @@ -1,6 +1,8 @@ package de.ph87.electro; +import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.CircuitPanel; +import de.ph87.electro.circuit.demo.Demos; import de.ph87.electro.sidebar.Sidebar; import javax.swing.*; @@ -10,17 +12,17 @@ import static de.ph87.electro.CONFIG.RASTER; public class Window extends JFrame { + private final CircuitPanel circuitPanel = new CircuitPanel(); + public Window() { positionOnRightMostScreen(); setDefaultCloseOperation(EXIT_ON_CLOSE); setPreferredSize(new Dimension(1200, 900)); setExtendedState(MAXIMIZED_BOTH); - final CircuitPanel circuitPanel = new CircuitPanel(); - final Sidebar sidebar = new Sidebar(circuitPanel::newCircuit, circuitPanel.getCircuit()::save); + final Sidebar sidebar = new Sidebar(() -> setCircuit(new Circuit())); final JSplitPane splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sidebar, circuitPanel); - sidebar.setRepaintCallback(circuitPanel::repaint); sidebar.setPreferredSize(new Dimension(calcWidth(3), 0)); sidebar.setMinimumSize(new Dimension(calcWidth(1), 0)); @@ -34,6 +36,10 @@ public class Window extends JFrame { setVisible(true); } + public void setCircuit(final Circuit circuit) { + circuitPanel.setCircuit(circuit); + } + private int calcWidth(final int raster) { return raster * (RASTER + 5) + 5; } @@ -46,7 +52,8 @@ public class Window extends JFrame { } public static void main(String[] args) { - new Window(); + final Window window = new Window(); + window.setCircuit(Demos.potiAndVoltmeter()); } } diff --git a/src/main/java/de/ph87/electro/circuit/Circuit.java b/src/main/java/de/ph87/electro/circuit/Circuit.java index 3fd49c1..63bf601 100644 --- a/src/main/java/de/ph87/electro/circuit/Circuit.java +++ b/src/main/java/de/ph87/electro/circuit/Circuit.java @@ -3,7 +3,6 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.calculation.Calculation; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.PartDto; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import de.ph87.electro.circuit.wire.Wire; import de.ph87.electro.circuit.wire.WireDto; @@ -11,6 +10,7 @@ import lombok.Getter; import lombok.NonNull; import lombok.Setter; +import java.awt.*; import java.io.File; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -19,6 +19,8 @@ import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import static de.ph87.electro.CONFIG.ALIGN; + public class Circuit { @Getter @@ -39,9 +41,9 @@ public class Circuit { @SuppressWarnings("unused") public Circuit(final File file, final CircuitDto dto) { - created = dto.getCreated(); + this.created = dto.getCreated(); for (PartDto partDto : dto.getParts()) { - final Part part = Part.fromDto(this, partDto); + final Part part = Part.fromDto(partDto); verifyFree(part.getPosition()); parts.add(part); } @@ -50,12 +52,12 @@ public class Circuit { final Junction b = findJunctionByUuid(wire.getB()).orElseThrow(); wires.add(new Wire(a, b)); } - evaluate(); } - public void connect(final Junction a, final Junction b) { - wires.add(new Wire(a, b)); - evaluate(); + public Wire connect(final Junction a, final Junction b) { + final Wire wire = new Wire(a, b); + wires.add(wire); + return wire; } public void disconnect(final Wire wire) { @@ -65,7 +67,6 @@ public class Circuit { wires.remove(wire); wire.getA().getWires().remove(wire); wire.getB().getWires().remove(wire); - evaluate(); } public T addPart(final T part) { @@ -74,8 +75,6 @@ public class Circuit { } verifyFree(part.getPosition()); parts.add(part); - part.render(); - evaluate(); return part; } @@ -85,32 +84,17 @@ public class Circuit { } else { throw new RuntimeException(); } - evaluate(); } - public void movePart(final Part part, final Position position) { - if (!parts.contains(part)) { + public void verifyFree(final Point position) { + if (isOccupied(position)) { throw new RuntimeException(); } - verifyFree(position); - part.setPosition(position); - evaluate(); } - public void evaluate() { - Calculation.calculate(this); - parts.forEach(Part::render); - save(); - } - - public void save() { - CircuitIOService.save(this); - } - - private void verifyFree(final Position position) { - if (parts.stream().anyMatch(part -> part.getPosition().equals(position))) { - throw new RuntimeException(); - } + public boolean isOccupied(final Point position) { + final Point aligned = ALIGN(position); + return parts.stream().anyMatch(part -> part.getPosition().equals(aligned)); } public Stream streamParts() { @@ -125,19 +109,16 @@ public class Circuit { return parts.size(); } - public Optional findPartByPosition(final Position position) { - return streamParts().filter(p -> p.getPosition().raster.equals(position.raster)).findFirst(); - } - - public Optional findJunctionByAbsolute(final Position position) { - return findPartByPosition(position).flatMap(part -> part.findJunctionByPosition(position)); + public Optional findPartByPosition(final Point position) { + final Point aligned = ALIGN(position); + return streamParts().filter(p -> p.getPosition().equals(aligned)).findFirst(); } public Optional findJunctionByUuid(@NonNull final String junctionUuid) { return parts.stream().map(part -> part.findJunctionByUuid(junctionUuid)).filter(Optional::isPresent).map(Optional::get).findFirst(); } - public Optional findWireByPosition(final Position position) { + public Optional findWireByPosition(final Point position) { return wires.stream().filter(wire -> wire.intersects(position)).findFirst(); } @@ -148,4 +129,8 @@ public class Circuit { return new File(file.getAbsolutePath().replaceAll("\\.json$", ".png")); } + public void evaluate() { + Calculation.calculate(this); + } + } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitIOService.java b/src/main/java/de/ph87/electro/circuit/CircuitIOService.java index 9df994f..2843993 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitIOService.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitIOService.java @@ -7,9 +7,10 @@ import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.*; -import static de.ph87.electro.circuit.CircuitPainter.paintCircuit; +import static de.ph87.electro.circuit.CircuitPainter.draw; @Slf4j +@SuppressWarnings("unused") public class CircuitIOService { private static final ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules(); @@ -27,7 +28,7 @@ public class CircuitIOService { log.error(e.toString()); } - final BufferedImage img = paintCircuit(circuit, 1920, 1080); + final BufferedImage img = draw(circuit, 1920, 1080); try { ImageIO.write(img, "PNG", circuit.getPreviewFile()); } catch (IOException e) { diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPainter.java b/src/main/java/de/ph87/electro/circuit/CircuitPainter.java index da38444..1f42f3e 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPainter.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPainter.java @@ -1,26 +1,31 @@ package de.ph87.electro.circuit; +import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.junction.Junction; import java.awt.*; +import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import static de.ph87.electro.CONFIG.*; +import static java.lang.Math.round; public class CircuitPainter { - public static BufferedImage paintCircuit(final Circuit circuit, final int w, final int h) { + public static BufferedImage draw(final Circuit circuit, final int w, final int h) { final BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); final Graphics2D g = img.createGraphics(); - paintCircuit(circuit, g, w, h); + draw(g, circuit, w, h); return img; } - public static void paintCircuit(final Circuit circuit, final Graphics2D g, final int w, final int h) { + public static void draw(final Graphics2D g, final Circuit circuit, final int w, final int h) { + g.setTransform(new AffineTransform()); drawBack(g, w, h); drawParts(circuit, g); + g.setTransform(new AffineTransform()); drawRaster(g, w, h); drawWires(circuit, g); drawVoltages(circuit, g); @@ -32,7 +37,10 @@ public class CircuitPainter { } private static void drawParts(final Circuit circuit, final Graphics2D g) { - circuit.streamParts().forEach(part -> part.paint(g)); + circuit.streamParts().forEach(part -> { + g.setTransform(part.getTransform()); + part.draw(g); + }); } private static void drawRaster(final Graphics2D g, final int w, final int h) { @@ -61,6 +69,7 @@ public class CircuitPainter { for (Part part : circuit.getParts()) { for (final Junction junction : part.getJunctions()) { + final Point absolute = junction.getAbsolute(); if (SHOW_JUNCTION_NAMES) { int offsetY = third; if (SHOW_JUNCTION_VOLTAGES) { @@ -68,7 +77,7 @@ public class CircuitPainter { } final String string = junction.getName(); final Rectangle2D bounds = g.getFontMetrics().getStringBounds(string, g); - g.drawString(string, junction.getPosition().absolute.x - (int) (bounds.getWidth() / 2), junction.getPosition().absolute.y + offsetY); + g.drawString(string, absolute.x - (int) (bounds.getWidth() / 2), absolute.y + offsetY); } if (SHOW_JUNCTION_VOLTAGES) { int offsetY = third; @@ -77,10 +86,66 @@ public class CircuitPainter { } final String string = "%.1fV".formatted(junction.getVoltage()); final Rectangle2D bounds = g.getFontMetrics().getStringBounds(string, g); - g.drawString(string, junction.getPosition().absolute.x - (int) (bounds.getWidth() / 2), junction.getPosition().absolute.y + offsetY); + g.drawString(string, absolute.x - (int) (bounds.getWidth() / 2), absolute.y + offsetY); } } } } + public static void drawLine(final Graphics2D g, final Junction a, final Junction b, final Color color, final Stroke stroke) { + drawLine(g, a.getInside(), b.getInside(), color, stroke); + } + + public static void drawLine(final Graphics2D g, final Junction a, final Point b, final Color color, final Stroke stroke) { + drawLine(g, a.getInside(), b, color, stroke); + } + + public static void drawLine(final Graphics2D g, final Point a, final Point b, final Color color, final Stroke stroke) { + drawLine(g, a.x, a.y, b.x, b.y, color, stroke); + } + + public static void drawLine(final Graphics2D g, final int x0, final int y0, final int x1, final int y1, final Color color, final Stroke stroke) { + g.setColor(color); + g.setStroke(stroke); + g.drawLine(x0, y0, x1, y1); + } + + public static void fillRect(final Graphics2D g, final int x0, final int y0, final int x1, final int y1, final Color color) { + g.setColor(color); + g.fillRect(x0, y0, x1, y1); + } + + public static void drawCircle(final Graphics2D g, final Point center, final int radius, final double degreesOffset, final double degreesRange, final Color border, final Stroke stroke, final Color fill) { + drawCircle(g, center.x, center.y, radius, border, stroke, fill, degreesOffset, degreesRange); + } + + public static void drawCircle(final Graphics2D g, final int x, final int y, final int radius, final Color border, final Stroke stroke, final Color fill, final double degreesOffset, final double degreesRange) { + if (fill != null) { + g.setColor(fill); + g.fillArc(x - radius, y - radius, 2 * radius, 2 * radius, (int) round(degreesOffset), (int) round(degreesRange)); + } + if (border != null && stroke != null) { + g.setColor(border); + g.setStroke(stroke); + g.drawArc(x - radius, y - radius, 2 * radius, 2 * radius, (int) round(degreesOffset), (int) round(degreesRange)); + } + } + + public static void drawText(final Graphics2D g, final Font font, final String text, final int x, int y, final Color color, final Orientation orientation) { + final AffineTransform transformBackup = g.getTransform(); + if (orientation == Orientation.R180) { + g.rotate(orientation.getRadians(), P50, P50); + y = RASTER - y; + } + + g.setFont(font); + g.setColor(color); + final Rectangle2D bounds = g.getFontMetrics().getStringBounds(text, g); + final int xx = (int) round(x - bounds.getWidth() / 2); + final int yy = (int) round(y - bounds.getHeight() / 2 + font.getSize()); + g.drawString(text, xx, yy); + + g.setTransform(transformBackup); + } + } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanel.java b/src/main/java/de/ph87/electro/circuit/CircuitPanel.java index 1b8ff2d..3ff5911 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanel.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanel.java @@ -1,36 +1,47 @@ package de.ph87.electro.circuit; import lombok.Getter; +import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import javax.swing.*; import java.awt.*; - -import static de.ph87.electro.circuit.CircuitPainter.paintCircuit; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; @Slf4j public class CircuitPanel extends JPanel { - @Getter - private Circuit circuit = new Circuit(); - private final CircuitPanelMouseAdapter mouseAdapter = new CircuitPanelMouseAdapter(this); + @Getter + @NonNull + private Circuit circuit = new Circuit(); + public CircuitPanel() { new CircuitPanelDropTarget(this); + addComponentListener(new ComponentAdapter() { + + @Override + public void componentResized(final ComponentEvent e) { + repaint(); + } + + }); + } + + public void setCircuit(@NonNull final Circuit circuit) { + this.circuit = circuit; + this.circuit.evaluate(); + repaint(); } @Override - public void paint(final Graphics _g) { - final Graphics2D g = (Graphics2D) _g; - paintCircuit(circuit, g, getWidth(), getHeight()); + public void paint(final Graphics graphics) { + final Graphics2D g = (Graphics2D) graphics; + CircuitPainter.draw(g, circuit, getWidth(), getHeight()); mouseAdapter.drawHover(g); mouseAdapter.drawDrag(g); } - public void newCircuit() { - circuit = new Circuit(); - repaint(); - } - } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java b/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java index 86d0971..41913db 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java @@ -1,11 +1,12 @@ package de.ph87.electro.circuit; -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.ALIGN; + public class CircuitPanelDropTarget extends AbstractDropTarget { private final CircuitPanel circuitPanel; @@ -18,31 +19,30 @@ public class CircuitPanelDropTarget extends AbstractDropTarget { @Override protected boolean drop(final Point point, final String data) { - final Position position = new Position(point); + final Point aligned = ALIGN(point); if (data.equals(Battery.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new Battery(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new Battery(aligned)); } else if (data.equals(ConnectorCorner.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new ConnectorCorner(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new ConnectorCorner(aligned)); } else if (data.equals(ConnectorEdge.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new ConnectorEdge(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new ConnectorEdge(aligned)); } else if (data.equals(ConnectorMiddle.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new ConnectorMiddle(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new ConnectorMiddle(aligned)); } else if (data.equals(Light.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new Light(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new Light(aligned)); } else if (data.equals(Switch1x1.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new Switch1x1(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new Switch1x1(aligned)); } else if (data.equals(Switch1x2.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new Switch1x2(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new Switch1x2(aligned)); } else if (data.equals(SwitchCross.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new SwitchCross(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new SwitchCross(aligned)); } else if (data.equals(Poti.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new Poti(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new Poti(aligned)); } else if (data.equals(Voltmeter.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new Voltmeter(circuitPanel.getCircuit(), position)); + circuitPanel.getCircuit().addPart(new Voltmeter(aligned)); } else { throw new RuntimeException(); } - circuitPanel.repaint(); return true; } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java b/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java index 0f20a28..ecf6db2 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java @@ -1,9 +1,9 @@ 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.junction.Junction; import de.ph87.electro.circuit.wire.Wire; +import lombok.extern.slf4j.Slf4j; import java.awt.*; import java.awt.event.MouseAdapter; @@ -12,21 +12,18 @@ import java.awt.event.MouseEvent; import static de.ph87.electro.CONFIG.*; import static java.awt.event.MouseEvent.*; +@Slf4j class CircuitPanelMouseAdapter extends MouseAdapter { private final CircuitPanel circuitPanel; - private Part partHover = null; + private Part part = null; - private Junction junctionHover = null; + private Junction junction = null; - private Wire wireHover = null; + private Wire wire = null; - private Part partDrag = null; - - private Junction junctionDrag = null; - - private Position dragPosition = null; + private Point dragging = null; CircuitPanelMouseAdapter(final CircuitPanel circuitPanel) { this.circuitPanel = circuitPanel; @@ -36,135 +33,141 @@ class CircuitPanelMouseAdapter extends MouseAdapter { @Override public void mouseClicked(final MouseEvent event) { - final Position position = new Position(event); + hoverUpdate(event); - if (event.getButton() == BUTTON3) { - if (wireHover != null) { - circuitPanel.getCircuit().disconnect(wireHover); - wireHover = null; - circuitPanel.repaint(); - return; - } - if (partHover != null) { - circuitPanel.getCircuit().removePart(partHover); - partHover = null; - circuitPanel.repaint(); - return; + if (wire != null) { + switch (event.getButton()) { + case BUTTON3: + circuitPanel.getCircuit().disconnect(wire); + circuitPanel.getCircuit().evaluate(); + wire = null; + break; } } - circuitPanel.getCircuit().findPartByPosition(position).ifPresent(part -> { + if (part != null) { switch (event.getButton()) { case BUTTON1: part.action(); - circuitPanel.repaint(); + circuitPanel.getCircuit().evaluate(); break; case BUTTON2: part.rotate(); - circuitPanel.repaint(); + break; + case BUTTON3: + circuitPanel.getCircuit().removePart(part); + circuitPanel.getCircuit().evaluate(); + part = null; break; } - }); + } + + circuitPanel.repaint(); } @Override public void mouseMoved(final MouseEvent event) { - findHover(new Position(event)); + hoverUpdate(event); circuitPanel.repaint(); } - @Override - public void mousePressed(final MouseEvent event) { - final Position position = new Position(event); - circuitPanel.getCircuit().findPartByPosition(position).ifPresent(part -> startPartOrJunction(part, position)); - } - - private void startPartOrJunction(final Part part, final Position position) { - part.findJunctionByPosition(position).ifPresentOrElse(junction -> { - partDrag = null; - junctionDrag = junction; - }, () -> { - partDrag = part; - junctionDrag = null; - }); - } - @Override public void mouseDragged(final MouseEvent event) { - final Position position = new Position(event); - findHover(position); - if (partDrag != null || junctionDrag != null) { - dragPosition = position; + if (dragging == null) { + hoverUpdate(event); } + dragging = event.getPoint(); circuitPanel.repaint(); } - private void findHover(final Position position) { - partHover = circuitPanel.getCircuit().findPartByPosition(position).orElse(null); - junctionHover = partHover != null ? partHover.findJunctionByPosition(position).orElse(null) : null; - if (junctionHover != null) { - partHover = null; - wireHover = null; - return; - } - wireHover = circuitPanel.getCircuit().findWireByPosition(position).orElse(null); - if (wireHover != null) { - partHover = null; - } - } - @Override public void mouseReleased(final MouseEvent event) { - final Position position = new Position(event); - if (partDrag != null) { - circuitPanel.getCircuit().movePart(partDrag, position); + if (dragging == null) { + return; } - if (junctionDrag != null) { - circuitPanel.getCircuit().findJunctionByAbsolute(position).filter(destination -> destination != junctionDrag).ifPresent(destination -> circuitPanel.getCircuit().connect(junctionDrag, destination)); + if (part != null) { + final Point aligned = ALIGN(event.getPoint()); + if (!circuitPanel.getCircuit().isOccupied(aligned)) { + part.setPosition(aligned); + log.info("Dropped Part at {}: {}", aligned, part); + } else { + log.info("Cell already occupied at: {}", aligned); + } } - partDrag = null; - junctionDrag = null; - dragPosition = null; + if (junction != null) { + final Junction source = junction; + hoverUpdate(event); + if (junction != null) { + final Wire wire = circuitPanel.getCircuit().connect(source, junction); + log.info("Wire CREATED: {}", wire); + circuitPanel.getCircuit().evaluate(); + } else { + log.info("No Wire created: No destination junction found!"); + } + } + + dragging = null; circuitPanel.repaint(); } - public void drawHover(final Graphics2D g) { - if (partHover != null) { - g.setColor(PART_HOVER_COLOR); - g.setStroke(HOVER_STROKE); - g.drawRect(partHover.getPosition().absolute.x, partHover.getPosition().absolute.y, RASTER, RASTER); + private void hoverUpdate(final MouseEvent event) { + final Point position = event.getPoint(); + part = circuitPanel.getCircuit().findPartByPosition(position).orElse(null); + junction = part != null ? part.findJunctionByPosition(position).orElse(null) : null; + if (junction != null) { + part = null; + wire = null; + return; } - if (junctionHover != null) { - 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); + wire = circuitPanel.getCircuit().findWireByPosition(position).orElse(null); + if (wire != null) { + part = null; + } + } + + public void drawHover(final Graphics2D g) { + if (part != null) { + g.setColor(JUNCTION_HOVER_BORDER_COLOR); + g.setStroke(HOVER_STROKE); + g.drawRect(part.getPosition().x, part.getPosition().y, RASTER, RASTER); + } + if (junction != null) { + final Point absolute = junction.getAbsolute(); + + g.setColor(junction.getColor()); + g.fillArc(absolute.x - JUNCTION_RADIUS_HOVER, 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); + g.drawArc(absolute.x - JUNCTION_RADIUS_HOVER, absolute.y - JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 0, 360); } - if (wireHover != null) { + if (wire != null) { + final Point aa = wire.getA().getAbsolute(); + final Point bb = wire.getB().getAbsolute(); + 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.drawLine(aa.x, aa.y, bb.x, bb.y); - g.setColor(wireHover.getA().getColor()); + g.setColor(wire.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); + g.drawLine(aa.x, aa.y, bb.x, bb.y); } } public void drawDrag(final Graphics2D g) { - if (dragPosition != null) { - if (partDrag != null) { + if (dragging != null) { + if (part != null) { g.setColor(PART_HOVER_COLOR); - g.fillRect(dragPosition.absolute.x - P50, dragPosition.absolute.y - P50, RASTER, RASTER); + g.fillRect(dragging.x - P50, dragging.y - P50, RASTER, RASTER); } - if (junctionDrag != null) { - g.setColor(junctionDrag.getColor()); + if (junction != null) { + g.setColor(junction.getColor()); g.setStroke(WIRE_STROKE); - g.drawLine(junctionDrag.getPosition().absolute.x, junctionDrag.getPosition().absolute.y, dragPosition.absolute.x, dragPosition.absolute.y); + final Point absolute = junction.getAbsolute(); + g.drawLine(absolute.x, absolute.y, dragging.x, dragging.y); } } } diff --git a/src/main/java/de/ph87/electro/circuit/demo/Demos.java b/src/main/java/de/ph87/electro/circuit/demo/Demos.java index aa82a77..2d753bc 100644 --- a/src/main/java/de/ph87/electro/circuit/demo/Demos.java +++ b/src/main/java/de/ph87/electro/circuit/demo/Demos.java @@ -5,19 +5,19 @@ import de.ph87.electro.circuit.part.parts.Battery; import de.ph87.electro.circuit.part.parts.Poti; import de.ph87.electro.circuit.part.parts.Voltmeter; -import static de.ph87.electro.circuit.part.Position.RST; +import static de.ph87.electro.CONFIG.RASTER; @SuppressWarnings("unused") public class Demos { public static Circuit potiAndVoltmeter() { final Circuit circuit = new Circuit(); - final Battery battery = circuit.addPart(new Battery(circuit, RST(0, 0))); - final Poti poti = circuit.addPart(new Poti(circuit, RST(0, 1))); - final Voltmeter voltmeter = circuit.addPart(new Voltmeter(circuit, RST(0, 2))); + final Battery battery = circuit.addPart(new Battery(RASTER(1, 0))); + final Poti poti = circuit.addPart(new Poti(RASTER(1, 2))); + final Voltmeter voltmeter = circuit.addPart(new Voltmeter(RASTER(1, 4))); circuit.connect(battery.getMinus(), poti.getCommon()); - circuit.connect(battery.getMinus(), voltmeter.getA()); circuit.connect(battery.getPlus(), poti.getEnd()); + circuit.connect(poti.getCommon(), voltmeter.getA()); circuit.connect(poti.getMiddle(), voltmeter.getB()); return circuit; } 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 2e4f50a..f522dc8 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Orientation.java +++ b/src/main/java/de/ph87/electro/circuit/part/Orientation.java @@ -25,8 +25,8 @@ public enum Orientation { this.map = rotate; } - public Point rotate(final Point p) { - return map.apply(p); + public Point rotate(final Point inside) { + return map.apply(inside); } public Orientation clockwise() { 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 14b0281..16c33da 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Part.java +++ b/src/main/java/de/ph87/electro/circuit/part/Part.java @@ -1,59 +1,67 @@ package de.ph87.electro.circuit.part; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.junction.Junction; import de.ph87.electro.circuit.part.junction.JunctionDto; import de.ph87.electro.circuit.part.parts.*; import lombok.Getter; +import lombok.NonNull; import lombok.Setter; import lombok.ToString; import java.awt.*; +import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; import java.util.List; import java.util.*; -import static de.ph87.electro.CONFIG.PART_BACKGROUND; -import static de.ph87.electro.CONFIG.RASTER; -import static de.ph87.electro.circuit.part.Position.ZERO; +import static de.ph87.electro.CONFIG.*; +import static java.lang.Math.round; +@Getter @ToString(onlyExplicitlyIncluded = true) public abstract class Part { - private final Circuit circuit; - - @Getter @ToString.Include private final String uuid; - @Getter @Setter @ToString.Include private String name; - @Getter - private Position position; + private Point position; - @Getter - private Orientation orientation = Orientation.R0; + protected Orientation orientation = Orientation.R0; - @Getter private final List junctions = new ArrayList<>(); - protected final Render render = new Render(); + @NonNull + private AffineTransform transform; - protected Part(final Circuit circuit, final String name, final Position position) { - this.circuit = circuit; + protected Part(final String name, final Point position) { this.uuid = UUID.randomUUID().toString(); this.name = name; - setPosition(position); + this.position = position; + this.transform = newTransform(); } - protected Part(final Circuit circuit, final PartDto dto) { - this.circuit = circuit; + protected Part(final PartDto dto) { this.uuid = dto.getUuid(); this.name = dto.getName(); this.orientation = dto.getOrientation(); - setPosition(new Position(dto.getPosition())); + this.position = dto.getPosition(); + this.transform = newTransform(); + } + + private AffineTransform newTransform() { + final AffineTransform transform = new AffineTransform(); + transform.translate(position.x, position.y); + transform.rotate(orientation.getRadians(), P50, P50); + return transform; + } + + public Point transform(final Point point) { + final Point2D result = transform.transform(point, new Point2D.Double()); + return new Point((int) round(result.getX()), (int) round(result.getY())); } protected Junction addJunction(final String name, final int x, final int y) { @@ -69,85 +77,64 @@ public abstract class Part { return junction; } - public void setPosition(final Position position) { - this.position = position.alignToRaster(); - junctions.forEach(Junction::updatePosition); + public void setPosition(final Point position) { + this.position = position; + this.transform = newTransform(); } public void rotate() { - orientation = orientation.clockwise(); - junctions.forEach(Junction::updatePosition); - evaluate(); + this.orientation = orientation.clockwise(); + this.transform = newTransform(); } - public final void render() { - render.rect(ZERO, RASTER, RASTER, null, null, PART_BACKGROUND); - - _labels(); - render.resetTransform(); - - _render(); - render.resetTransform(); - - junctions.forEach(junction -> junction.render(render)); - render.resetTransform(); + public final void draw(final Graphics2D g) { + g.setColor(PART_BACK_COLOR); + g.fillRect(0, 0, RASTER, RASTER); + _render(g); + junctions.forEach(junction -> junction.draw(g)); + _labels(g); } - public void paint(final Graphics2D g) { - g.drawImage(render.getImage(), position.absolute.x, position.absolute.y, null); + protected void _render(final Graphics2D g) { + // - } - public Optional findJunctionByUuid(final String junctionUuid) { - return junctions.stream().filter(junction -> junction.getUuid().equals(junctionUuid)).findFirst(); + protected void _labels(final Graphics2D g) { + // - } - public Optional findJunctionByPosition(final Position position) { - return junctions.stream().filter(junction -> junction.intersects(position)).findFirst(); - } - - public final void action() { - _action(); - evaluate(); - } - - public void _action() { - // may be overwritten + public void action() { + // - } public void postCalculate() { - // may be overwritten - } - - protected void _render() { - // may be overwritten - } - - protected void _labels() { - // may be overwritten - } - - protected void evaluate() { - if (circuit != null) { - circuit.evaluate(); - } + // - } public List getInnerConnections() { return Collections.emptyList(); } - public static Part fromDto(final Circuit circuit, final PartDto abstractDto) { + public Optional findJunctionByUuid(final String junctionUuid) { + return junctions.stream().filter(junction -> junction.getUuid().equals(junctionUuid)).findFirst(); + } + + public Optional findJunctionByPosition(final Point position) { + return junctions.stream().filter(junction -> junction.intersects(position)).findFirst(); + } + + public static Part fromDto(final PartDto abstractDto) { return switch (abstractDto) { - case final BatteryDto dto -> new Battery(circuit, dto); - case final ConnectorCornerDto dto -> new ConnectorCorner(circuit, dto); - case final ConnectorEdgeDto dto -> new ConnectorEdge(circuit, dto); - case final ConnectorMiddleDto dto -> new ConnectorMiddle(circuit, dto); - case final LightDto dto -> new Light(circuit, dto); - case final Switch1x1Dto dto -> new Switch1x1(circuit, dto); - case final Switch1x2Dto dto -> new Switch1x2(circuit, dto); - case final SwitchCrossDto dto -> new SwitchCross(circuit, dto); - case final PotiDto dto -> new Poti(circuit, dto); - case final VoltmeterDto dto -> new Voltmeter(circuit, dto); + case final BatteryDto dto -> new Battery(dto); + case final ConnectorCornerDto dto -> new ConnectorCorner(dto); + case final ConnectorEdgeDto dto -> new ConnectorEdge(dto); + case final ConnectorMiddleDto dto -> new ConnectorMiddle(dto); + case final LightDto dto -> new Light(dto); + case final Switch1x1Dto dto -> new Switch1x1(dto); + case final Switch1x2Dto dto -> new Switch1x2(dto); + case final SwitchCrossDto dto -> new SwitchCross(dto); + case final PotiDto dto -> new Poti(dto); + case final VoltmeterDto dto -> new Voltmeter(dto); case null, default -> throw new RuntimeException(); }; } 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 e009672..4d76c3f 100644 --- a/src/main/java/de/ph87/electro/circuit/part/PartDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/PartDto.java @@ -25,7 +25,7 @@ public abstract class PartDto { protected PartDto(final Part part) { this.uuid = part.getUuid(); this.name = part.getName(); - this.position = part.getPosition().absolute; + this.position = part.getPosition(); this.orientation = part.getOrientation(); } diff --git a/src/main/java/de/ph87/electro/circuit/part/Position.java b/src/main/java/de/ph87/electro/circuit/part/Position.java deleted file mode 100644 index 770f2fe..0000000 --- a/src/main/java/de/ph87/electro/circuit/part/Position.java +++ /dev/null @@ -1,94 +0,0 @@ -package de.ph87.electro.circuit.part; - -import lombok.Getter; -import lombok.ToString; -import org.apache.commons.math3.linear.RealVector; - -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 static Position ABS(final RealVector vector) { - return ABS(vector.getEntry(0), vector.getEntry(1)); - } - - public static Position ABS(final double absoluteX, final double absoluteY) { - return new Position((int) round(absoluteX), (int) round(absoluteY)); - } - - public static Position RST(final int x, final int y) { - return ABS(x * RASTER, y * RASTER); - } - - private Position(final int absoluteX, final int absoluteY) { - this.absolute = new Point(absoluteX, absoluteY); - this.raster = new Point(absoluteX / RASTER, absoluteY / RASTER); - this.inside = new Point(absoluteX % RASTER, absoluteY % RASTER); - } - - @Override - public boolean equals(final Object obj) { - if (!(obj instanceof final Position other)) { - return false; - } - return absolute.equals(other.absolute); - } - - @Override - public int hashCode() { - return absolute.hashCode(); - } - - 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 deleted file mode 100644 index 678b5a2..0000000 --- a/src/main/java/de/ph87/electro/circuit/part/Render.java +++ /dev/null @@ -1,82 +0,0 @@ -package de.ph87.electro.circuit.part; - -import de.ph87.electro.circuit.part.junction.Junction; -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 Stroke stroke) { - line(junction0.getPosition(), junction1.getPosition(), color, stroke); - } - - public void line(final Position p0, final Position p1, final Color color, final Stroke 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 double startAngle, final double arcAngle) { - 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, (int) round(startAngle), (int) round(arcAngle)); - } - if (border != null && stroke != null) { - g.setColor(border); - g.setStroke(stroke); - g.drawArc(_x, _y, diameter, diameter, (int) round(startAngle), (int) round(arcAngle)); - } - } - - public void textCenter(final Font font, final String string, final int innerX, final int innerY, final Color color) { - g.setFont(font); - g.setColor(color); - final Rectangle2D bounds = g.getFontMetrics().getStringBounds(string, g); - final int x = innerX - (int) round(bounds.getWidth()) / 2; - final int y = innerY + (int) round(bounds.getHeight()) / 2; - g.drawString(string, x, y); - } - - 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/junction/Junction.java b/src/main/java/de/ph87/electro/circuit/part/junction/Junction.java index 58ac342..ebcd029 100644 --- a/src/main/java/de/ph87/electro/circuit/part/junction/Junction.java +++ b/src/main/java/de/ph87/electro/circuit/part/junction/Junction.java @@ -1,8 +1,6 @@ package de.ph87.electro.circuit.part.junction; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; -import de.ph87.electro.circuit.part.Render; import de.ph87.electro.circuit.wire.Wire; import lombok.Getter; import lombok.ToString; @@ -27,9 +25,7 @@ public class Junction { @ToString.Include private final String name; - private final Point relative; - - private Position position; + private final Point inside; private final Set wires = new HashSet<>(); @@ -44,20 +40,18 @@ 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 relative) { + public Junction(final Part owner, final String name, final Point inside) { this.owner = owner; this.uuid = UUID.randomUUID().toString(); this.name = name; - this.relative = relative; - updatePosition(); + this.inside = inside; } - public Junction(final Part owner, final JunctionDto dto, final Point relative) { + public Junction(final Part owner, final JunctionDto dto, final Point inside) { this.owner = owner; this.uuid = dto.getUuid(); this.name = dto.getName(); - this.relative = relative; - updatePosition(); + this.inside = inside; } public void setVoltage(final double voltage) { @@ -65,16 +59,17 @@ public class Junction { this.color = Double.isNaN(voltage) ? VOLTAGE_UNKNOWN_COLOR : ((voltage >= VOLTAGE_HIGH_MIN) ? VOLTAGE_HIGH_COLOR : VOLTAGE_LOW_COLOR); } - public void render(final Render render) { - render.circle(position, JUNCTION_RADIUS, Color.BLACK, JUNCTION_STROKE, color, 0, 360); + public void draw(final Graphics2D g) { + g.setColor(color); + g.fillArc(inside.x - JUNCTION_RADIUS, inside.y - JUNCTION_RADIUS, 2 * JUNCTION_RADIUS, 2 * JUNCTION_RADIUS, 0, 360); + + g.setColor(Color.BLACK); + g.setStroke(JUNCTION_STROKE); + g.drawArc(inside.x - JUNCTION_RADIUS, inside.y - JUNCTION_RADIUS, 2 * JUNCTION_RADIUS, 2 * JUNCTION_RADIUS, 0, 360); } - public void updatePosition() { - position = owner.getPosition().plus(owner.getOrientation().rotate(relative)); - } - - public boolean intersects(final Position position) { - return this.position.distance(position) <= JUNCTION_RADIUS_HOVER; + public boolean intersects(final Point position) { + return getAbsolute().distance(position) <= JUNCTION_RADIUS_HOVER; } public void collectConnectedJunctions(final Set connected) { @@ -86,4 +81,8 @@ public class Junction { owner.getInnerConnections().stream().flatMap(innerConnection -> innerConnection.filter(this)).forEach(opposite -> opposite.collectConnectedJunctions(connected)); } + public Point getAbsolute() { + return owner.transform(inside); + } + } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Battery.java b/src/main/java/de/ph87/electro/circuit/part/parts/Battery.java index 061a87c..648c5f0 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Battery.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Battery.java @@ -1,10 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.InnerConnection; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.Setter; @@ -15,21 +12,22 @@ import java.util.List; import java.util.stream.Stream; import static de.ph87.electro.CONFIG.*; -import static de.ph87.electro.circuit.part.Position.ABS; +import static de.ph87.electro.circuit.CircuitPainter.*; +import static java.lang.Math.round; @Getter @ToString(callSuper = true, onlyExplicitlyIncluded = true) public class Battery extends Part { - private static final double MINUS_W = 0.1 * RASTER; + private static final int MINUS_W = (int) round(0.1 * RASTER); - private static final double MINUS_H = 0.3 * RASTER; + private static final int MINUS_H = (int) round(0.3 * RASTER); - private static final double GAP = 0.05 * RASTER; + private static final int GAP = (int) round(0.05 * RASTER); - private static final double PLUS_W = 0.02 * RASTER; + private static final int PLUS_W = (int) round(0.02 * RASTER); - private static final double PLUS_H = 0.6 * RASTER; + private static final int PLUS_H = (int) round(0.6 * RASTER); private final Junction minus; @@ -43,41 +41,19 @@ public class Battery extends Part { @ToString.Include private double resistance = 0.05; - public Battery(final Circuit circuit, final Position position) { - super(circuit, "Batterie", position); + public Battery(final Point position) { + super("Batterie", position); minus = addJunction("MINUS", P10, P50); plus = addJunction("PLUS", P90, P50); } - public Battery(final Circuit circuit, final BatteryDto dto) { - super(circuit, dto); + public Battery(final BatteryDto dto) { + super(dto); minus = addJunction(dto.getMinus(), P10, P50); plus = addJunction(dto.getPlus(), P90, P50); voltage = dto.getVoltage(); } - @Override - protected void _render() { - render.clockwise(getOrientation()); - render.line(ABS(P10, P50), ABS(P50 - GAP / 2 - MINUS_W / 2, P50), Color.BLACK, SYMBOL_STROKE); - render.line(ABS(P50 + GAP / 2 + PLUS_W / 2, P50), ABS(P90, P50), Color.BLACK, SYMBOL_STROKE); - render.rect(ABS(P50 - MINUS_W - GAP / 2, P50 - MINUS_H / 2), MINUS_W, MINUS_H, null, null, Color.BLACK); - render.rect(ABS(P50 + GAP / 2, P50 - PLUS_H / 2), PLUS_W, PLUS_H, null, null, Color.BLACK); - } - - @Override - protected void _labels() { - final int x = RASTER / 2; - final int y0; - if (getOrientation() == Orientation.R180) { - y0 = P95 - LABEL_FONT.getSize(); - } else { - render.clockwise(getOrientation()); - y0 = P05; - } - render.textCenter(LABEL_FONT, "%.1fV".formatted(voltage), x, y0, Color.BLACK); - } - public static Stream filterCast(final Part part) { if (part instanceof final Battery battery) { return Stream.of(battery); @@ -90,4 +66,17 @@ public class Battery extends Part { return List.of(new InnerConnection(minus, plus, resistance)); } + @Override + protected void _render(final Graphics2D g) { + drawLine(g, P10, P50, P50 - GAP / 2 - MINUS_W / 2, P50, Color.BLACK, SYMBOL_STROKE); + drawLine(g, P50 + GAP / 2 + PLUS_W / 2, P50, P90, P50, Color.BLACK, SYMBOL_STROKE); + fillRect(g, P50 - MINUS_W - GAP / 2, P50 - MINUS_H / 2, MINUS_W, MINUS_H, Color.BLACK); + fillRect(g, P50 + GAP / 2, P50 - PLUS_H / 2, PLUS_W, PLUS_H, Color.BLACK); + } + + @Override + protected void _labels(final Graphics2D g) { + drawText(g, LABEL_FONT, "%.1fV".formatted(voltage), P50, P10, Color.BLACK, orientation); + } + } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCorner.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCorner.java index dc7821b..1635b71 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCorner.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCorner.java @@ -1,12 +1,12 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.ToString; +import java.awt.*; + import static de.ph87.electro.CONFIG.P10; import static de.ph87.electro.CONFIG.P90; @@ -18,14 +18,14 @@ public class ConnectorCorner extends Part { private final Junction j1; - public ConnectorCorner(final Circuit circuit, final Position position) { - super(circuit, "", position); + public ConnectorCorner(final Point position) { + super("", position); j0 = addJunction("J0", P10, P10); j1 = addJunction("J1", P90, P90); } - public ConnectorCorner(final Circuit circuit, final ConnectorCornerDto dto) { - super(circuit, dto); + public ConnectorCorner(final ConnectorCornerDto dto) { + super(dto); j0 = addJunction(dto.getJ0(), P10, P10); j1 = addJunction(dto.getJ1(), P90, P90); } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdge.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdge.java index 8dc7b4d..6f4b5e4 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdge.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdge.java @@ -1,12 +1,12 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.ToString; +import java.awt.*; + import static de.ph87.electro.CONFIG.P10; import static de.ph87.electro.CONFIG.P50; @@ -18,14 +18,14 @@ public class ConnectorEdge extends Part { private final Junction j1; - public ConnectorEdge(final Circuit circuit, final Position position) { - super(circuit, "", position); + public ConnectorEdge(final Point position) { + super("", position); j0 = addJunction("J0", P10, P50); j1 = addJunction("J1", P50, P10); } - public ConnectorEdge(final Circuit circuit, final ConnectorEdgeDto dto) { - super(circuit, dto); + public ConnectorEdge(final ConnectorEdgeDto dto) { + super(dto); j0 = addJunction(dto.getJ0(), P10, P50); j1 = addJunction(dto.getJ1(), P50, P10); } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddle.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddle.java index 6c33d03..b0a6463 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddle.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddle.java @@ -1,12 +1,12 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.ToString; +import java.awt.*; + import static de.ph87.electro.CONFIG.P50; @Getter @@ -15,13 +15,13 @@ public class ConnectorMiddle extends Part { private final Junction junction; - public ConnectorMiddle(final Circuit circuit, final Position position) { - super(circuit, "", position); + public ConnectorMiddle(final Point position) { + super("", position); junction = addJunction("J", P50, P50); } - public ConnectorMiddle(final Circuit circuit, final ConnectorMiddleDto dto) { - super(circuit, dto); + public ConnectorMiddle(final ConnectorMiddleDto dto) { + super(dto); junction = addJunction(dto.getJunction(), P50, P50); } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Light.java b/src/main/java/de/ph87/electro/circuit/part/parts/Light.java index 12b5653..6583fb1 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Light.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Light.java @@ -1,10 +1,8 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.ToString; @@ -14,7 +12,7 @@ import java.util.Collections; import java.util.List; import static de.ph87.electro.CONFIG.*; -import static de.ph87.electro.circuit.part.Position.ABS; +import static de.ph87.electro.circuit.CircuitPainter.*; import static java.lang.Math.abs; import static java.lang.Math.round; @@ -52,14 +50,14 @@ public class Light extends Part { private Color color = BULB_OFF_COLOR; - public Light(final Circuit circuit, final Position position) { - super(circuit, "Licht", position); + public Light(final Point position) { + super("Licht", position); a = addJunction("A", P10, P50); b = addJunction("B", P90, P50); } - public Light(final Circuit circuit, final LightDto dto) { - super(circuit, dto); + public Light(final LightDto dto) { + super(dto); a = addJunction(dto.getB(), P10, P50); b = addJunction(dto.getA(), P90, P50); resistance = dto.getResistance(); @@ -68,7 +66,7 @@ public class Light extends Part { } @Override - public void _action() { + public void action() { defect = false; } @@ -85,17 +83,17 @@ public class Light extends Part { } @Override - protected void _render() { - render.line(a, b, Color.BLACK, SYMBOL_STROKE); - render.circle(ABS(P50, P50), BULB_RADIUS, Color.BLACK, SYMBOL_STROKE, color, 0, 360); + protected void _render(final Graphics2D g) { + drawLine(g, a, b, Color.BLACK, SYMBOL_STROKE); + drawCircle(g, P50, P50, BULB_RADIUS, Color.BLACK, SYMBOL_STROKE, color, 0, 360); - final double diag = 0.33 * RASTER; - render.line(ABS(diag, diag), ABS(RASTER - diag, RASTER - diag), Color.BLACK, SYMBOL_STROKE); - render.line(ABS(diag, RASTER - diag), ABS(RASTER - diag, diag), Color.BLACK, SYMBOL_STROKE); + final int diag = (int) round(0.33 * RASTER); + drawLine(g, RASTER - diag, RASTER - diag, diag, diag, Color.BLACK, SYMBOL_STROKE); + drawLine(g, RASTER - diag, diag, diag, RASTER - diag, Color.BLACK, SYMBOL_STROKE); } @Override - protected void _labels() { + protected void _labels(final Graphics2D g) { final int x = RASTER / 2; final int y0; final int y1; @@ -103,13 +101,13 @@ public class Light extends Part { y0 = P95 - LABEL_FONT.getSize(); y1 = P05; } else { - render.clockwise(getOrientation()); + g.rotate(getOrientation().getRadians(), P50, P50); y0 = P05; y1 = P95 - LABEL_FONT.getSize(); } - render.textCenter(LABEL_FONT, "%.1fV (max)".formatted(maxVoltage), x, y0, Color.BLACK); + drawText(g, LABEL_FONT, "%.1fV (max)".formatted(maxVoltage), x, y0, Color.BLACK, orientation); if (defect) { - render.textCenter(LABEL_FONT, "DEFEKT", x, y1, Color.RED); + drawText(g, LABEL_FONT, "DEFEKT", x, y1, Color.RED, orientation); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Poti.java b/src/main/java/de/ph87/electro/circuit/part/parts/Poti.java index e3e54c1..ecdadbf 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Poti.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Poti.java @@ -1,9 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.Setter; @@ -13,6 +11,7 @@ import java.awt.*; import java.util.List; import static de.ph87.electro.CONFIG.*; +import static de.ph87.electro.circuit.CircuitPainter.drawText; import static java.lang.Math.max; @Getter @@ -30,27 +29,22 @@ public class Poti extends Part { private double ratio = 0.0; - public Poti(final Circuit circuit, final Position position) { - super(circuit, "Poti", position); + public Poti(final Point position) { + super("Poti", position); common = addJunction("C", P10, P50); middle = addJunction("M", P50, P10); end = addJunction("E", P90, P50); } - public Poti(final Circuit circuit, final PotiDto dto) { - super(circuit, dto); + public Poti(final PotiDto dto) { + super(dto); common = addJunction(dto.getCommon().getName(), P10, P50); middle = addJunction(dto.getMiddle().getName(), P50, P10); end = addJunction(dto.getEnd().getName(), P90, P50); } - public void setRatio(final double ratio) { - this.ratio = ratio; - evaluate(); - } - @Override - public void _action() { + public void action() { if (ratio > 0.95) { ratio = 0; } else { @@ -59,15 +53,14 @@ public class Poti extends Part { } @Override - protected void _labels() { - render.textCenter(LABEL_FONT, "%3.0f%%".formatted(ratio * 100), P50, P50, Color.BLACK); + protected void _labels(final Graphics2D g) { + drawText(g, LABEL_FONT, "%3.0f%%".formatted(ratio * 100), P50, P50, Color.BLACK, orientation); } @Override public List getInnerConnections() { return List.of( new InnerConnection(common, middle, max(NO_RESISTANCE, resistance * ratio)), -// new InnerConnection(common, end, max(NO_RESISTANCE, resistance)), new InnerConnection(middle, end, max(NO_RESISTANCE, resistance * (1 - ratio))) ); } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/RotationMatrix.java b/src/main/java/de/ph87/electro/circuit/part/parts/RotationMatrix.java index b5a198d..650d2b8 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/RotationMatrix.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/RotationMatrix.java @@ -2,22 +2,20 @@ package de.ph87.electro.circuit.part.parts; import org.apache.commons.math3.linear.Array2DRowRealMatrix; import org.apache.commons.math3.linear.RealMatrix; +import org.apache.commons.math3.linear.RealVector; import static java.lang.Math.cos; import static java.lang.Math.sin; public class RotationMatrix extends Array2DRowRealMatrix { - public static RealMatrix ofDegrees(final double degrees) { + public static RealVector rotateDegrees(final RealVector finger, final double degrees) { final double radians = degrees * Math.PI / 180.0; - return new RotationMatrix(radians); - } - - private RotationMatrix(final double radians) { - super(new double[][]{ + final RealMatrix matrix = new Array2DRowRealMatrix(new double[][]{ {cos(radians), -sin(radians)}, {sin(radians), cos(radians)}, }); + return matrix.operate(finger); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1.java b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1.java index 5fa510d..9703919 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1.java @@ -1,9 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.ToString; @@ -12,25 +10,28 @@ import java.awt.*; import java.util.List; import static de.ph87.electro.CONFIG.*; +import static de.ph87.electro.circuit.CircuitPainter.drawLine; @Getter @ToString(callSuper = true) public class Switch1x1 extends Part { + private static final Point END = new Point(P90, P25); + private final Junction common; private final Junction output; private boolean state = false; - public Switch1x1(final Circuit circuit, final Position position) { - super(circuit, "Ausschalter", position); + public Switch1x1(final Point position) { + super("Ausschalter", position); common = addJunction("C", P10, P50); output = addJunction("O", P90, P50); } - public Switch1x1(final Circuit circuit, final Switch1x1Dto dto) { - super(circuit, dto); + public Switch1x1(final Switch1x1Dto dto) { + super(dto); common = addJunction(dto.getCommon(), P10, P50); output = addJunction(dto.getOutput(), P90, P50); state = dto.isState(); @@ -38,21 +39,20 @@ public class Switch1x1 extends Part { public void setState(final boolean state) { this.state = state; - evaluate(); } @Override - public void _action() { + public void action() { state = !state; } @Override - protected void _render() { + protected void _render(final Graphics2D g) { if (!state) { - final Point end = getOrientation().rotate(new Point(P90, P25)); - render.line(common.getPosition(), new Position(end), common.getColor(), SWITCH_STROKE); + final Point end = getOrientation().rotate(END); + drawLine(g, common.getAbsolute(), end, common.getColor(), SWITCH_STROKE); } else { - render.line(common, output, common.getColor(), SWITCH_STROKE); + drawLine(g, common, output, common.getColor(), SWITCH_STROKE); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2.java b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2.java index 0229791..9085b83 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2.java @@ -1,16 +1,16 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.ToString; +import java.awt.*; import java.util.List; import static de.ph87.electro.CONFIG.*; +import static de.ph87.electro.circuit.CircuitPainter.drawLine; @Getter @ToString(callSuper = true) @@ -24,15 +24,15 @@ public class Switch1x2 extends Part { private boolean state = false; - public Switch1x2(final Circuit circuit, final Position position) { - super(circuit, "Wechselschalter", position); + public Switch1x2(final Point position) { + super("Wechselschalter", position); common = addJunction("C", P10, P50); output0 = addJunction("O0", P90, P25); output1 = addJunction("O1", P90, P75); } - public Switch1x2(final Circuit circuit, final Switch1x2Dto dto) { - super(circuit, dto); + public Switch1x2(final Switch1x2Dto dto) { + super(dto); common = addJunction(dto.getCommon(), P10, P50); output0 = addJunction(dto.getOutput0(), P90, P25); output1 = addJunction(dto.getOutput1(), P90, P75); @@ -41,20 +41,19 @@ public class Switch1x2 extends Part { public void setState(final boolean state) { this.state = state; - evaluate(); } @Override - public void _action() { + public void action() { state = !state; } @Override - protected void _render() { + protected void _render(final Graphics2D g) { if (!state) { - render.line(common, output0, common.getColor(), SWITCH_STROKE); + drawLine(g, common, output0, common.getColor(), SWITCH_STROKE); } else { - render.line(common, output1, common.getColor(), SWITCH_STROKE); + drawLine(g, common, output1, common.getColor(), SWITCH_STROKE); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCross.java b/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCross.java index c660a78..40bf958 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCross.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCross.java @@ -1,16 +1,16 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.ToString; +import java.awt.*; import java.util.List; import static de.ph87.electro.CONFIG.*; +import static de.ph87.electro.circuit.CircuitPainter.drawLine; @Getter @ToString(callSuper = true) @@ -26,16 +26,16 @@ public class SwitchCross extends Part { private boolean state = false; - public SwitchCross(final Circuit circuit, final Position position) { - super(circuit, "Kreuzschalter", position); + public SwitchCross(final Point position) { + super("Kreuzschalter", position); common0 = addJunction("C0", P10, P25); common1 = addJunction("C1", P10, P75); output0 = addJunction("O0", P90, P25); output1 = addJunction("O1", P90, P75); } - public SwitchCross(final Circuit circuit, final SwitchCrossDto dto) { - super(circuit, dto); + public SwitchCross(final SwitchCrossDto dto) { + super(dto); common0 = addJunction(dto.getCommon0(), P10, P25); common1 = addJunction(dto.getCommon1(), P10, P75); output0 = addJunction(dto.getOutput0(), P90, P25); @@ -45,22 +45,21 @@ public class SwitchCross extends Part { public void setState(final boolean state) { this.state = state; - evaluate(); } @Override - public void _action() { + public void action() { state = !state; } @Override - protected void _render() { + protected void _render(final Graphics2D g) { if (!state) { - render.line(common0, output0, common0.getColor(), SWITCH_STROKE); - render.line(common1, output1, common1.getColor(), SWITCH_STROKE); + drawLine(g, common0, output0, common0.getColor(), SWITCH_STROKE); + drawLine(g, common1, output1, common1.getColor(), SWITCH_STROKE); } else { - render.line(common0, output1, common0.getColor(), SWITCH_STROKE); - render.line(common1, output0, common1.getColor(), SWITCH_STROKE); + drawLine(g, common0, output1, common0.getColor(), SWITCH_STROKE); + drawLine(g, common1, output0, common1.getColor(), SWITCH_STROKE); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Voltmeter.java b/src/main/java/de/ph87/electro/circuit/part/parts/Voltmeter.java index 2cfee12..e6bbbba 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Voltmeter.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Voltmeter.java @@ -1,93 +1,90 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.PartDto; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; +import lombok.Setter; import org.apache.commons.math3.linear.ArrayRealVector; -import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.linear.RealVector; import java.awt.*; import java.util.List; import static de.ph87.electro.CONFIG.*; -import static de.ph87.electro.circuit.part.Position.ABS; +import static de.ph87.electro.circuit.CircuitPainter.*; +import static java.lang.Math.round; @Getter public class Voltmeter extends Part { - private static final double FINGER_LENGTH = P70; + private static final int FINGER_LENGTH = P65; - private static final RealVector ANCHOR = new ArrayRealVector(new double[]{P50, P80}); + private static final RealVector ANCHOR = new ArrayRealVector(new double[]{P50, P75}); - private static final RealVector FINGER = new ArrayRealVector(new double[]{ANCHOR.getEntry(0) + FINGER_LENGTH, P50}).subtract(ANCHOR); + private static final RealVector FINGER = new ArrayRealVector(new double[]{FINGER_LENGTH - P05, 0}); private static final Stroke SCALE_STROKE = new BasicStroke(1); private static final double DEGREES_RANGE = 90; - public static final double DEGREES_OFFSET = (180 - DEGREES_RANGE) / 2; - private final Junction a; private final Junction b; + @Setter private double min = -3; + @Setter private double max = 3; - private double voltage; - private RealVector tip; - public Voltmeter(final Circuit circuit, final Position position) { - super(circuit, "Voltmeter", position); + public Voltmeter(final Point position) { + super("Voltmeter", position); a = addJunction("A", P10, P90); b = addJunction("B", P90, P90); postCalculate(); // TODO remove } - public Voltmeter(final Circuit circuit, final PartDto dto) { - super(circuit, dto); + public Voltmeter(final PartDto dto) { + super(dto); a = addJunction("A", P10, P90); b = addJunction("B", P90, P90); postCalculate(); // TODO remove } - public void setMin(final double min) { - this.min = min; - evaluate(); + double x = 0; + + @Override + public void _render(final Graphics2D g) { + // scale + final double DEGREES_OFFSET = 45; + drawCircle(g, P(ANCHOR), FINGER_LENGTH, DEGREES_OFFSET, DEGREES_RANGE, Color.BLACK, SCALE_STROKE, Color.white); + + // finger + final double ratio = (getVoltage() - min) / (max - min); + final double degrees = -(DEGREES_OFFSET + DEGREES_RANGE * (1 - ratio)); + final RealVector finger = RotationMatrix.rotateDegrees(FINGER, degrees); + tip = ANCHOR.add(finger); + drawLine(g, P(ANCHOR), P(tip), Color.BLACK, SCALE_STROKE); + + // anchor + drawCircle(g, P(ANCHOR), P03, 0, 360, null, null, Color.black); } - public void setMax(final double max) { - this.max = max; - evaluate(); + public static Point P(final RealVector anchor) { + return new Point((int) round(anchor.getEntry(0)), (int) round(anchor.getEntry(1))); + } + + private double getVoltage() { + return !Double.isNaN(b.getVoltage()) && !Double.isNaN(a.getVoltage()) ? b.getVoltage() - a.getVoltage() : 0.0; } @Override - public void postCalculate() { - voltage = !Double.isNaN(b.getVoltage()) && !Double.isNaN(a.getVoltage()) ? b.getVoltage() - a.getVoltage() : 0.0; - final double ratio = (voltage - min) / (max - min); - final double degrees = DEGREES_RANGE * ratio + DEGREES_OFFSET / 2; - final RealMatrix rotate = RotationMatrix.ofDegrees(degrees); - final RealVector rotatedFinger = rotate.operate(FINGER); - tip = ANCHOR.add(rotatedFinger); - } - - @Override - public void _render() { - render.clockwise(getOrientation()); - render.circle(ABS(ANCHOR), FINGER_LENGTH, Color.BLACK, SCALE_STROKE, Color.white, DEGREES_OFFSET, DEGREES_RANGE); - render.line(ABS(ANCHOR), ABS(tip), Color.BLACK, SCALE_STROKE); - } - - @Override - protected void _labels() { - render.textCenter(LABEL_FONT, "%.2f V".formatted(voltage), P50, P90, Color.BLACK); + protected void _labels(final Graphics2D g) { + drawText(g, LABEL_FONT, "%.2f V".formatted(getVoltage()), P50, P90, Color.BLACK, orientation); } @Override diff --git a/src/main/java/de/ph87/electro/circuit/wire/Wire.java b/src/main/java/de/ph87/electro/circuit/wire/Wire.java index beb3d42..9606f53 100644 --- a/src/main/java/de/ph87/electro/circuit/wire/Wire.java +++ b/src/main/java/de/ph87/electro/circuit/wire/Wire.java @@ -1,6 +1,5 @@ package de.ph87.electro.circuit.wire; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.junction.Junction; import lombok.Getter; import lombok.NonNull; @@ -11,8 +10,7 @@ import java.awt.*; import java.awt.geom.Rectangle2D; import static de.ph87.electro.CONFIG.*; -import static java.lang.Math.abs; -import static java.lang.Math.round; +import static java.lang.Math.*; @ToString public class Wire { @@ -35,8 +33,25 @@ public class Wire { b.getWires().add(this); } - public boolean intersects(final Position position) { - return position.distanceToLine(a.getPosition(), b.getPosition()); + public boolean intersects(final Point position) { + return distanceToLine(position, a.getAbsolute(), b.getAbsolute()); + } + + public boolean distanceToLine(final Point point, final Point lineStart, final Point lineEnd) { + double dx = lineEnd.x - lineStart.x; + double dy = lineEnd.y - lineStart.y; + double lineLength = dx * dx + dy * dy; + if (lineLength == 0) { + return sqrt(pow(lineStart.x - point.x, 2) + pow(lineStart.y - point.y, 2)) <= WIRE_HOVER_STROKE_BACK.getLineWidth(); + } + + double t = ((point.x - lineStart.x) * dx + (point.y - lineStart.y) * dy) / lineLength; + t = Math.max(0, Math.min(1, t)); + + double closestX = lineStart.x + t * dx; + double closestY = lineStart.y + t * dy; + final double distance = sqrt(pow(closestX - point.x, 2) + pow(closestY - point.y, 2)); + return distance <= WIRE_HOVER_STROKE_BACK.getLineWidth(); } public Junction getOpposite(final Junction junction) { @@ -55,7 +70,7 @@ public class Wire { public void draw(final Graphics2D g) { g.setColor(a.getColor()); g.setStroke(WIRE_STROKE); - g.drawLine(a.getPosition().absolute.x, a.getPosition().absolute.y, b.getPosition().absolute.x, b.getPosition().absolute.y); + g.drawLine(a.getAbsolute().x, a.getAbsolute().y, b.getAbsolute().x, b.getAbsolute().y); if (SHOW_WIRE_DETAILS) { drawValues(g, "%.2f A".formatted(abs(current)), -0.5); @@ -66,8 +81,11 @@ public class Wire { private void drawValues(final Graphics2D g, final String string, final double offset) { g.setFont(LABEL_FONT); final Rectangle2D bounds = g.getFontMetrics().getStringBounds(string, g); - final int mx = (a.getPosition().absolute.x + b.getPosition().absolute.x) / 2; - final int my = (a.getPosition().absolute.y + b.getPosition().absolute.y) / 2; + final Point aa = a.getAbsolute(); + final Point bb = b.getAbsolute(); + + final int mx = (aa.x + bb.x) / 2; + final int my = (aa.y + bb.y) / 2; final int bx = (int) round((mx - bounds.getWidth() / 2)) - 2; final int by = (int) round((my - bounds.getHeight() / 2) + offset * bounds.getHeight()) - 2; diff --git a/src/main/java/de/ph87/electro/sidebar/Sidebar.java b/src/main/java/de/ph87/electro/sidebar/Sidebar.java index 7ab860b..ca62c7d 100644 --- a/src/main/java/de/ph87/electro/sidebar/Sidebar.java +++ b/src/main/java/de/ph87/electro/sidebar/Sidebar.java @@ -1,9 +1,7 @@ package de.ph87.electro.sidebar; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.Position; import de.ph87.electro.circuit.part.parts.*; -import lombok.Setter; import javax.swing.*; import java.awt.*; @@ -14,37 +12,26 @@ import static de.ph87.electro.CONFIG.*; public class Sidebar extends JPanel { - @Setter - private Runnable repaintCallback = null; - - public Sidebar(final Runnable newCircuit, final Runnable save) { + public Sidebar(final Runnable newCircuit) { setPreferredSize(new Dimension(0, 200)); addButton("Neu", null, newCircuit, new Color(128, 202, 255)); - addToggle("Details", () -> SHOW_WIRE_DETAILS, v -> { - SHOW_WIRE_DETAILS = v; - save.run(); - }); - addToggle("Namen", () -> SHOW_JUNCTION_NAMES, v -> { - SHOW_JUNCTION_NAMES = v; - save.run(); - }); - addToggle("Spannungen", () -> SHOW_JUNCTION_VOLTAGES, v -> { - SHOW_JUNCTION_VOLTAGES = v; - save.run(); - }); + addToggle("Details", () -> SHOW_WIRE_DETAILS, v -> SHOW_WIRE_DETAILS = v); + addToggle("Namen", () -> SHOW_JUNCTION_NAMES, v -> SHOW_JUNCTION_NAMES = v); + addToggle("Spannungen", () -> SHOW_JUNCTION_VOLTAGES, v -> SHOW_JUNCTION_VOLTAGES = v); - addPart(new Battery(null, Position.ZERO)); - addPart(new ConnectorCorner(null, Position.ZERO)); - addPart(new ConnectorEdge(null, Position.ZERO)); - addPart(new ConnectorMiddle(null, Position.ZERO)); - addPart(new Light(null, Position.ZERO)); - addPart(new Switch1x1(null, Position.ZERO)); - addPart(new Switch1x2(null, Position.ZERO)); - addPart(new SwitchCross(null, Position.ZERO)); - addPart(new Poti(null, Position.ZERO)); - addPart(new Voltmeter(null, Position.ZERO)); + final Point ZERO = new Point(); + addPart(new Battery(ZERO)); + addPart(new ConnectorCorner(ZERO)); + addPart(new ConnectorEdge(ZERO)); + addPart(new ConnectorMiddle(ZERO)); + addPart(new Light(ZERO)); + addPart(new Switch1x1(ZERO)); + addPart(new Switch1x2(ZERO)); + addPart(new SwitchCross(ZERO)); + addPart(new Poti(ZERO)); + addPart(new Voltmeter(ZERO)); } @SuppressWarnings("UnusedReturnValue") @@ -56,10 +43,7 @@ public class Sidebar extends JPanel { button.setBackground(new Color(255, 128, 128)); } }; - final Runnable click = () -> { - set.accept(!get.get()); - triggerRepaint(); - }; + final Runnable click = () -> set.accept(!get.get()); return addButton(label, refresh, click, null); } @@ -80,12 +64,6 @@ public class Sidebar extends JPanel { return button; } - private void triggerRepaint() { - if (repaintCallback != null) { - repaintCallback.run(); - } - } - private void addPart(final Part part) { final SidebarPart entry = new SidebarPart(part); add(entry); diff --git a/src/main/java/de/ph87/electro/sidebar/SidebarPart.java b/src/main/java/de/ph87/electro/sidebar/SidebarPart.java index de05d23..552aea4 100644 --- a/src/main/java/de/ph87/electro/sidebar/SidebarPart.java +++ b/src/main/java/de/ph87/electro/sidebar/SidebarPart.java @@ -30,12 +30,11 @@ public class SidebarPart extends JPanel { DnDConstants.ACTION_COPY_OR_MOVE, event -> dragSource.startDrag(event, DragSource.DefaultCopyDrop, new StringSelection(part.getClass().getSimpleName()), null) ); - part.render(); } @Override public void paint(final Graphics g) { - part.paint((Graphics2D) g); + part.draw((Graphics2D) g); g.setColor(Color.black); g.drawRect(0, 0, RASTER - 1, RASTER - 1); } diff --git a/src/test/java/de/ph87/electro/circuit/CalculationServiceTest.java b/src/test/java/de/ph87/electro/circuit/CalculationServiceTest.java index 1302ac8..eadaf11 100644 --- a/src/test/java/de/ph87/electro/circuit/CalculationServiceTest.java +++ b/src/test/java/de/ph87/electro/circuit/CalculationServiceTest.java @@ -8,7 +8,7 @@ import de.ph87.electro.circuit.wire.Wire; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; -import static de.ph87.electro.circuit.part.Position.RST; +import static de.ph87.electro.CONFIG.RASTER; @Slf4j class CalculationServiceTest { @@ -16,8 +16,8 @@ class CalculationServiceTest { @Test void test() { final Circuit circuit = new Circuit(); - final Battery battery = circuit.addPart(new Battery(circuit, RST(0, 0))); - final Light light = circuit.addPart(new Light(circuit, RST(0, 1))); + final Battery battery = circuit.addPart(new Battery(RASTER(0, 0))); + final Light light = circuit.addPart(new Light(RASTER(0, 1))); circuit.connect(battery.getMinus(), light.getA()); circuit.connect(battery.getPlus(), light.getB()); diff --git a/src/test/java/de/ph87/electro/circuit/io/CircuitIOServiceTest.java b/src/test/java/de/ph87/electro/circuit/io/CircuitIOServiceTest.java index 3d42974..2d038e8 100644 --- a/src/test/java/de/ph87/electro/circuit/io/CircuitIOServiceTest.java +++ b/src/test/java/de/ph87/electro/circuit/io/CircuitIOServiceTest.java @@ -13,8 +13,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; +import static de.ph87.electro.CONFIG.RASTER; import static de.ph87.electro.circuit.CircuitIOService.serialize; -import static de.ph87.electro.circuit.part.Position.RST; import static org.junit.jupiter.api.Assertions.assertEquals; class CircuitIOServiceTest { @@ -22,8 +22,8 @@ class CircuitIOServiceTest { @Test void serialization() throws IOException { final Circuit circuit = new Circuit(); - final Battery battery = circuit.addPart(new Battery(circuit, RST(0, 0))); - final Light light = circuit.addPart(new Light(circuit, RST(0, 1))); + final Battery battery = circuit.addPart(new Battery(RASTER(0, 0))); + final Light light = circuit.addPart(new Light(RASTER(0, 1))); circuit.connect(battery.getPlus(), light.getB()); circuit.connect(light.getA(), battery.getMinus()); check(circuit); @@ -38,6 +38,9 @@ class CircuitIOServiceTest { final ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()); final Circuit reloaded = CircuitIOService.load(null, input); + original.evaluate(); + reloaded.evaluate(); + assertEquals(original.getCreated(), reloaded.getCreated()); assertEquals(original.getPartCount(), reloaded.getPartCount()); original.streamParts().forEach(originalPart -> { @@ -53,8 +56,7 @@ class CircuitIOServiceTest { 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.getAbsolute(), reloadedJunction.getAbsolute()); assertEquals(originalJunction.getWires().size(), reloadedJunction.getWires().size()); originalJunction.getWires().stream() .map(originalWire -> originalWire.getOpposite(originalJunction)) diff --git a/src/test/java/de/ph87/electro/circuit/part/parts/BatteryLightTest.java b/src/test/java/de/ph87/electro/circuit/part/parts/BatteryLightTest.java index af13e95..a6a76ae 100644 --- a/src/test/java/de/ph87/electro/circuit/part/parts/BatteryLightTest.java +++ b/src/test/java/de/ph87/electro/circuit/part/parts/BatteryLightTest.java @@ -4,8 +4,8 @@ import de.ph87.electro.circuit.Circuit; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import static de.ph87.electro.CONFIG.RASTER; import static de.ph87.electro.circuit.AssertHelper.assertVoltage; -import static de.ph87.electro.circuit.part.Position.RST; import static org.junit.jupiter.api.Assertions.assertFalse; public class BatteryLightTest { @@ -14,9 +14,9 @@ public class BatteryLightTest { private static final Circuit CIRCUIT = new Circuit(); - private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0))); + private static final Battery battery = CIRCUIT.addPart(new Battery(RASTER(0, 0))); - private static final Light light = CIRCUIT.addPart(new Light(CIRCUIT, RST(0, 1))); + private static final Light light = CIRCUIT.addPart(new Light(RASTER(0, 1))); @BeforeAll public static void setUp() { @@ -26,6 +26,8 @@ public class BatteryLightTest { @Test void test() { + CIRCUIT.evaluate(); + assertVoltage(VOLTAGE, battery.getPlus().getVoltage()); assertVoltage(VOLTAGE, light.getB().getVoltage()); assertVoltage(VOLTAGE, light.getPotentialDifference()); diff --git a/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher1x1Test.java b/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher1x1Test.java index 3d71d20..aaf2b23 100644 --- a/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher1x1Test.java +++ b/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher1x1Test.java @@ -4,8 +4,8 @@ import de.ph87.electro.circuit.Circuit; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import static de.ph87.electro.CONFIG.RASTER; import static de.ph87.electro.circuit.AssertHelper.assertVoltage; -import static de.ph87.electro.circuit.part.Position.RST; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -15,11 +15,11 @@ public class BatterySwitcher1x1Test { private static final Circuit CIRCUIT = new Circuit(); - private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0))); + private static final Battery battery = CIRCUIT.addPart(new Battery(RASTER(0, 0))); - private static final Switch1x1 switcher = CIRCUIT.addPart(new Switch1x1(CIRCUIT, RST(0, 1))); + private static final Switch1x1 switcher = CIRCUIT.addPart(new Switch1x1(RASTER(0, 1))); - private static final Light light = CIRCUIT.addPart(new Light(CIRCUIT, RST(1, 0))); + private static final Light light = CIRCUIT.addPart(new Light(RASTER(1, 0))); @BeforeAll public static void setUp() { @@ -42,6 +42,7 @@ public class BatterySwitcher1x1Test { final double voltage = state ? VOLTAGE : 0.0; switcher.setState(state); + CIRCUIT.evaluate(); assertEquals(state, switcher.isState()); diff --git a/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher1x2Test.java b/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher1x2Test.java index 921bd41..bb2a888 100644 --- a/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher1x2Test.java +++ b/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher1x2Test.java @@ -4,8 +4,8 @@ import de.ph87.electro.circuit.Circuit; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import static de.ph87.electro.CONFIG.RASTER; import static de.ph87.electro.circuit.AssertHelper.assertVoltage; -import static de.ph87.electro.circuit.part.Position.RST; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -15,13 +15,13 @@ public class BatterySwitcher1x2Test { private static final Circuit CIRCUIT = new Circuit(); - private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0))); + private static final Battery battery = CIRCUIT.addPart(new Battery(RASTER(0, 0))); - private static final Switch1x2 switcher = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(0, 2))); + private static final Switch1x2 switcher = CIRCUIT.addPart(new Switch1x2(RASTER(0, 2))); - private static final Light light0 = CIRCUIT.addPart(new Light(CIRCUIT, RST(1, 1))); + private static final Light light0 = CIRCUIT.addPart(new Light(RASTER(1, 1))); - private static final Light light1 = CIRCUIT.addPart(new Light(CIRCUIT, RST(1, 3))); + private static final Light light1 = CIRCUIT.addPart(new Light(RASTER(1, 3))); @BeforeAll public static void setUp() { @@ -47,6 +47,7 @@ public class BatterySwitcher1x2Test { final double voltage1 = state ? VOLTAGE : 0.0; switcher.setState(state); + CIRCUIT.evaluate(); assertEquals(state, switcher.isState()); diff --git a/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher2x2Test.java b/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher2x2Test.java index 03b7a75..b7b2319 100644 --- a/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher2x2Test.java +++ b/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcher2x2Test.java @@ -4,8 +4,8 @@ import de.ph87.electro.circuit.Circuit; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import static de.ph87.electro.CONFIG.RASTER; import static de.ph87.electro.circuit.AssertHelper.assertVoltage; -import static de.ph87.electro.circuit.part.Position.RST; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -15,13 +15,13 @@ public class BatterySwitcher2x2Test { private static final Circuit CIRCUIT = new Circuit(); - private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0))); + private static final Battery battery = CIRCUIT.addPart(new Battery(RASTER(0, 0))); - private static final Switch1x2 switcher0 = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(0, 1))); + private static final Switch1x2 switcher0 = CIRCUIT.addPart(new Switch1x2(RASTER(0, 1))); - private static final Switch1x2 switcher1 = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(1, 1))); + private static final Switch1x2 switcher1 = CIRCUIT.addPart(new Switch1x2(RASTER(1, 1))); - private static final Light light = CIRCUIT.addPart(new Light(CIRCUIT, RST(1, 0))); + private static final Light light = CIRCUIT.addPart(new Light(RASTER(1, 0))); @BeforeAll public static void setUp() { @@ -59,6 +59,7 @@ public class BatterySwitcher2x2Test { switcher0.setState(state0); switcher1.setState(state1); + CIRCUIT.evaluate(); assertEquals(state0, switcher0.isState()); assertEquals(state1, switcher1.isState()); diff --git a/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcherCrossTest.java b/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcherCrossTest.java index 2e814f0..4da6cde 100644 --- a/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcherCrossTest.java +++ b/src/test/java/de/ph87/electro/circuit/part/parts/BatterySwitcherCrossTest.java @@ -4,8 +4,8 @@ import de.ph87.electro.circuit.Circuit; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import static de.ph87.electro.CONFIG.RASTER; import static de.ph87.electro.circuit.AssertHelper.assertVoltage; -import static de.ph87.electro.circuit.part.Position.RST; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -15,15 +15,15 @@ public class BatterySwitcherCrossTest { private static final Circuit CIRCUIT = new Circuit(); - private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0))); + private static final Battery battery = CIRCUIT.addPart(new Battery(RASTER(0, 0))); - private static final Switch1x2 switcher0 = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(0, 1))); + private static final Switch1x2 switcher0 = CIRCUIT.addPart(new Switch1x2(RASTER(0, 1))); - private static final SwitchCross switcherX = CIRCUIT.addPart(new SwitchCross(CIRCUIT, RST(1, 1))); + private static final SwitchCross switcherX = CIRCUIT.addPart(new SwitchCross(RASTER(1, 1))); - private static final Switch1x2 switcher1 = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(2, 1))); + private static final Switch1x2 switcher1 = CIRCUIT.addPart(new Switch1x2(RASTER(2, 1))); - private static final Light light = CIRCUIT.addPart(new Light(CIRCUIT, RST(2, 0))); + private static final Light light = CIRCUIT.addPart(new Light(RASTER(2, 0))); @BeforeAll public static void setUp() { @@ -86,6 +86,7 @@ public class BatterySwitcherCrossTest { switcher0.setState(state0); switcherX.setState(stateX); switcher1.setState(state1); + CIRCUIT.evaluate(); assertEquals(state0, switcher0.isState()); assertEquals(stateX, switcherX.isState());