From 803145617bbc1925b9e34a994354326c254a6287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Tue, 14 May 2024 12:47:54 +0200 Subject: [PATCH] Circuit, Battery, Light, propagate --- .gitignore | 40 ++++++++++++ pom.xml | 30 +++++++++ src/main/java/de/ph87/electro/Main.java | 19 ++++++ .../java/de/ph87/electro/circuit/Circuit.java | 50 +++++++++++++++ .../de/ph87/electro/circuit/ShortCircuit.java | 5 ++ .../electro/circuit/junction/Junction.java | 64 +++++++++++++++++++ .../ph87/electro/circuit/junction/Wire.java | 42 ++++++++++++ .../de/ph87/electro/circuit/part/Part.java | 33 ++++++++++ .../electro/circuit/part/PartBattery.java | 39 +++++++++++ .../ph87/electro/circuit/part/PartOther.java | 11 ++++ .../electro/circuit/part/other/PartLight.java | 45 +++++++++++++ 11 files changed, 378 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/de/ph87/electro/Main.java create mode 100644 src/main/java/de/ph87/electro/circuit/Circuit.java create mode 100644 src/main/java/de/ph87/electro/circuit/ShortCircuit.java create mode 100644 src/main/java/de/ph87/electro/circuit/junction/Junction.java create mode 100644 src/main/java/de/ph87/electro/circuit/junction/Wire.java create mode 100644 src/main/java/de/ph87/electro/circuit/part/Part.java create mode 100644 src/main/java/de/ph87/electro/circuit/part/PartBattery.java create mode 100644 src/main/java/de/ph87/electro/circuit/part/PartOther.java create mode 100644 src/main/java/de/ph87/electro/circuit/part/other/PartLight.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..99e57a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +/.idea/ + +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b7c617a --- /dev/null +++ b/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + de.ph87 + Electro + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + + + org.projectlombok + lombok + 1.18.32 + + + org.slf4j + slf4j-simple + 2.0.12 + + + + \ No newline at end of file diff --git a/src/main/java/de/ph87/electro/Main.java b/src/main/java/de/ph87/electro/Main.java new file mode 100644 index 0000000..a24ddfb --- /dev/null +++ b/src/main/java/de/ph87/electro/Main.java @@ -0,0 +1,19 @@ +package de.ph87.electro; + +import de.ph87.electro.circuit.Circuit; +import de.ph87.electro.circuit.part.PartBattery; +import de.ph87.electro.circuit.part.other.PartLight; + +public class Main { + + public static void main(String[] args) { + final Circuit circuit = new Circuit(); + final PartBattery battery = circuit.addBattery("Batterie", 1, 0, 3); + final PartLight light = circuit.addLight("Licht", 1, 1, 3); + circuit.connect(battery.getMinus(), light.getMinus()); + circuit.connect(battery.getPlus(), light.getPlus()); + circuit.evaluate(); + circuit.getParts().forEach(System.out::println); + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/Circuit.java b/src/main/java/de/ph87/electro/circuit/Circuit.java new file mode 100644 index 0000000..6ac3594 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/Circuit.java @@ -0,0 +1,50 @@ +package de.ph87.electro.circuit; + +import de.ph87.electro.circuit.junction.Junction; +import de.ph87.electro.circuit.junction.Wire; +import de.ph87.electro.circuit.part.Part; +import de.ph87.electro.circuit.part.PartOther; +import de.ph87.electro.circuit.part.PartBattery; +import de.ph87.electro.circuit.part.other.PartLight; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class Circuit { + + private final List parts = new ArrayList<>(); + + private final List batteries = new ArrayList<>(); + + private final List others = new ArrayList<>(); + + private final List wires = new ArrayList<>(); + + public PartBattery addBattery(final String name, final int x, final int y, final double voltage) { + final PartBattery battery = new PartBattery(name, x, y, voltage); + parts.add(battery); + batteries.add(battery); + return battery; + } + + public PartLight addLight(final String name, final int x, final int y, final double maxVoltage) { + final PartLight light = new PartLight(name, x, y, maxVoltage); + parts.add(light); + others.add(light); + return light; + } + + public void connect(final Junction a, final Junction b) { + wires.add(new Wire(a, b)); + } + + public void evaluate() { + wires.forEach(Wire::reset); + parts.forEach(Part::reset); + batteries.forEach(PartBattery::propagate); + others.forEach(PartOther::evaluate); + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/ShortCircuit.java b/src/main/java/de/ph87/electro/circuit/ShortCircuit.java new file mode 100644 index 0000000..b620b29 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/ShortCircuit.java @@ -0,0 +1,5 @@ +package de.ph87.electro.circuit; + +public class ShortCircuit extends Exception { + +} diff --git a/src/main/java/de/ph87/electro/circuit/junction/Junction.java b/src/main/java/de/ph87/electro/circuit/junction/Junction.java new file mode 100644 index 0000000..a05aacf --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/junction/Junction.java @@ -0,0 +1,64 @@ +package de.ph87.electro.circuit.junction; + +import de.ph87.electro.circuit.ShortCircuit; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +@Getter +@ToString(onlyExplicitlyIncluded = true) +public class Junction { + + @ToString.Include + private final String name; + + private final Point position; + + @Setter + @ToString.Include + private double voltage = Double.NaN; + + private final List wires = new ArrayList<>(); + + public Junction(final String name, final int x, final int y) { + this.name = name; + this.position = new Point(x, y); + } + + public void reset() { + voltage = Double.NaN; + } + + public void injectVoltage(final double newVoltage) throws ShortCircuit { + if (voltage == newVoltage) { + return; + } + if (Double.isNaN(voltage)) { + voltage = newVoltage; + for (Wire wire : wires) { + wire.propagateVoltage(this); + } + return; + } + throw new ShortCircuit(); + } + + public void propagateVoltage(final Wire source) throws ShortCircuit { + if (voltage == source.getVoltage()) { + return; + } + if (Double.isNaN(voltage)) { + voltage = source.getVoltage(); + for (Wire wire : this.wires) { + wire.propagateVoltage(this); + } + return; + } + throw new ShortCircuit(); + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/junction/Wire.java b/src/main/java/de/ph87/electro/circuit/junction/Wire.java new file mode 100644 index 0000000..e747ca1 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/junction/Wire.java @@ -0,0 +1,42 @@ +package de.ph87.electro.circuit.junction; + +import de.ph87.electro.circuit.ShortCircuit; +import lombok.Getter; + +@Getter +public class Wire { + + private final Junction junction0; + + private final Junction junction1; + + private double voltage = Double.NaN; + + public Wire(final Junction junction0, final Junction junction1) { + if (junction0 == junction1) { + throw new RuntimeException("Cannot connect Pin to itself!"); + } + this.junction0 = junction0; + this.junction1 = junction1; + junction0.getWires().add(this); + junction1.getWires().add(this); + } + + public void reset() { + voltage = Double.NaN; + } + + public void propagateVoltage(final Junction source) throws ShortCircuit { + if (voltage == source.getVoltage()) { + return; + } + if (Double.isNaN(this.voltage)) { + voltage = source.getVoltage(); + junction0.propagateVoltage(this); + junction1.propagateVoltage(this); + return; + } + throw new ShortCircuit(); + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/Part.java b/src/main/java/de/ph87/electro/circuit/part/Part.java new file mode 100644 index 0000000..cffded1 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/Part.java @@ -0,0 +1,33 @@ +package de.ph87.electro.circuit.part; + +import de.ph87.electro.circuit.junction.Junction; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@ToString(onlyExplicitlyIncluded = true) +public abstract class Part { + + @ToString.Include + private String name; + + private Point position; + + protected final List junctions = new ArrayList<>(); + + protected Part(final String name, final int x, final int y) { + this.name = name; + this.position = new Point(x, y); + } + + public void reset() { + junctions.forEach(Junction::reset); + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/PartBattery.java b/src/main/java/de/ph87/electro/circuit/part/PartBattery.java new file mode 100644 index 0000000..09e5889 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/PartBattery.java @@ -0,0 +1,39 @@ +package de.ph87.electro.circuit.part; + +import de.ph87.electro.circuit.ShortCircuit; +import de.ph87.electro.circuit.junction.Junction; +import lombok.Getter; +import lombok.ToString; + +@Getter +@ToString(callSuper = true) +public class PartBattery extends Part { + + private final Junction plus; + + private final Junction minus; + + private final double voltage; + + private ShortCircuit shortCircuit = null; + + public PartBattery(final String name, final int x, final int y, final double voltage) { + super(name, x, y); + this.voltage = voltage; + minus = new Junction("-", 0, 1); + plus = new Junction("+", 2, 1); + junctions.add(minus); + junctions.add(plus); + } + + public void propagate() { + try { + shortCircuit = null; + minus.injectVoltage(0); + plus.injectVoltage(voltage); + } catch (ShortCircuit e) { + shortCircuit = e; + } + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/PartOther.java b/src/main/java/de/ph87/electro/circuit/part/PartOther.java new file mode 100644 index 0000000..d3cd1e8 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/PartOther.java @@ -0,0 +1,11 @@ +package de.ph87.electro.circuit.part; + +public abstract class PartOther extends Part { + + protected PartOther(final String name, final int x, final int y) { + super(name, x, y); + } + + public abstract void evaluate(); + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/other/PartLight.java b/src/main/java/de/ph87/electro/circuit/part/other/PartLight.java new file mode 100644 index 0000000..2cbe0af --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/other/PartLight.java @@ -0,0 +1,45 @@ +package de.ph87.electro.circuit.part.other; + +import de.ph87.electro.circuit.junction.Junction; +import de.ph87.electro.circuit.part.PartOther; +import lombok.Getter; +import lombok.ToString; + +import static java.lang.Math.abs; + +@Getter +@ToString(callSuper = true) +public class PartLight extends PartOther { + + private final double maxVoltage; + + private final Junction minus; + + private final Junction plus; + + private boolean defect = false; + + private double voltage = 0; + + public PartLight(final String name, final int x, final int y, final double maxVoltage) { + super(name, x, y); + this.maxVoltage = maxVoltage; + minus = new Junction("", 0, 1); + plus = new Junction("", 2, 1); + junctions.add(minus); + junctions.add(plus); + } + + public void repair() { + defect = false; + } + + @Override + public void evaluate() { + voltage = abs(plus.getVoltage() - minus.getVoltage()); + if (voltage > maxVoltage) { + defect = true; + } + } + +}