Circuit, Battery, Light, propagate

This commit is contained in:
Patrick Haßel 2024-05-14 12:47:54 +02:00
commit 803145617b
11 changed files with 378 additions and 0 deletions

40
.gitignore vendored Normal file
View File

@ -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

30
pom.xml Normal file
View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.ph87</groupId>
<artifactId>Electro</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.12</version>
</dependency>
</dependencies>
</project>

View File

@ -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);
}
}

View File

@ -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<Part> parts = new ArrayList<>();
private final List<PartBattery> batteries = new ArrayList<>();
private final List<PartOther> others = new ArrayList<>();
private final List<Wire> 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);
}
}

View File

@ -0,0 +1,5 @@
package de.ph87.electro.circuit;
public class ShortCircuit extends Exception {
}

View File

@ -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<Wire> 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();
}
}

View File

@ -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();
}
}

View File

@ -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<Junction> 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);
}
}

View File

@ -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;
}
}
}

View File

@ -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();
}

View File

@ -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;
}
}
}