From 47c46c03d6762ca615512640fdce4f0ef08f2f29 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Fri, 7 Jul 2023 19:32:30 +0300 Subject: [PATCH 01/26] improvements --- pom.xml | 2 +- src/main/java/main/graphics/Window.java | 12 ++-- .../java/vehicleGraphics/BorderPainter.java | 7 +- .../java/vehicleGraphics/VehiclePainter.java | 70 ++++++++++--------- .../java/vehicleGraphics/VehiclePanel.java | 14 +++- .../vehicleGraphics/VehiclePanelData.java | 20 ++++-- 6 files changed, 71 insertions(+), 54 deletions(-) diff --git a/pom.xml b/pom.xml index 4b2e48f..cc587ba 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.github.KrumSpace SpacePlane - 0.2 + 0.3 19 diff --git a/src/main/java/main/graphics/Window.java b/src/main/java/main/graphics/Window.java index 1623f7c..e582ce7 100644 --- a/src/main/java/main/graphics/Window.java +++ b/src/main/java/main/graphics/Window.java @@ -6,14 +6,14 @@ import javax.swing.JFrame; import javax.swing.JPanel; -import vehicles.Vehicle; import vehicleGraphics.VehiclePanelData; import vehicleGraphics.VehiclePanel; import vehicles.VehicleAdapter; // public class Window extends JFrame { - private static final int[] SIZE_CORRECTION = new int[] {17, 40}; + private static final Dimension PANEL_SIZE = new Dimension(1000, 900); + private static final int[] WINDOW_SIZE_CORRECTION = new int[] {17, 40}; private static final Point LOCATION = new Point(600, 50); private static final String WINDOW_TITLE = "Vehicle viewer"; private static final Color BACKGROUND = Color.BLACK; @@ -30,11 +30,9 @@ public Window(VehicleAdapter vehicleAdapter) { private void setWindowConfig() { setDefaultCloseOperation(EXIT_ON_CLOSE); setLocation(LOCATION); - - Dimension optimalSize = VehiclePanelData.getOptimalSize(); setSize(new Dimension( - optimalSize.width + SIZE_CORRECTION[0], - optimalSize.height + SIZE_CORRECTION[1])); + PANEL_SIZE.width + WINDOW_SIZE_CORRECTION[0], + PANEL_SIZE.height + WINDOW_SIZE_CORRECTION[1])); setTitle(WINDOW_TITLE); } @@ -45,6 +43,6 @@ private void setContents(VehicleAdapter vehicleAdapter) { } private JPanel getVehiclePanel(VehicleAdapter vehicleAdapter) { - return new VehiclePanel(new VehiclePanelData(vehicleAdapter)); + return new VehiclePanel(new VehiclePanelData(vehicleAdapter, PANEL_SIZE)); } } \ No newline at end of file diff --git a/src/main/java/vehicleGraphics/BorderPainter.java b/src/main/java/vehicleGraphics/BorderPainter.java index 3ae5f48..3a2f385 100644 --- a/src/main/java/vehicleGraphics/BorderPainter.java +++ b/src/main/java/vehicleGraphics/BorderPainter.java @@ -6,22 +6,21 @@ // class BorderPainter implements PainterInterface { private final VehiclePanelData panelData; - private final Dimension size; // - protected BorderPainter(VehiclePanelData panelData, Dimension size) { + protected BorderPainter(VehiclePanelData panelData) { this.panelData = panelData; - this.size = size; } // @Override public void paint(Graphics g, int[] drawLocation) { - g.setColor(panelData.getBorderColor()); + Dimension size = panelData.getPanelSize(); int offset = panelData.getBorderOffset(), x = size.width, y = size.height; + g.setColor(panelData.getBorderColor()); g.drawRect(offset, offset, Math.max(0, x - 2 * offset), Math.max(0, y - 2 * offset)); } } \ No newline at end of file diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index f91031c..033d8c9 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -12,7 +12,6 @@ // class VehiclePainter implements PainterInterface { - private static final int[] VEHICLE_DRAW_SIZE = new int[] {980, 880}; private static final Color PART_COLOR = new Color(100, 100, 100), PART_BORDER_COLOR = new Color(150, 150, 150), @@ -23,39 +22,50 @@ class VehiclePainter implements PainterInterface { private static final int PART_MASS_DECIMAL_DIGITS = 2, PART_LENGTH_DECIMAL_DIGITS = 1; + private final ImageObserver imageObserver; private final VehiclePanelData panelData; - private final int[] - panelDrawSize, - vehicleDrawSize; + private final double angle; // - protected VehiclePainter(ImageObserver imageObserver, VehiclePanelData panelData) { + protected VehiclePainter(ImageObserver imageObserver, VehiclePanelData panelData, double angle) { this.imageObserver = imageObserver; this.panelData = panelData; - - Dimension size = VehiclePanelData.getOptimalSize(); - panelDrawSize = new int[] {size.width, size.height}; - vehicleDrawSize = VEHICLE_DRAW_SIZE; + this.angle = angle; } // @Override public final void paint(Graphics g, int[] drawLocation) { + Dimension panelSize = panelData.getPanelSize(); + int drawDiameter = Math.min(panelSize.width, panelSize.height); + + //draw y = actual -x + //draw x = actual -y + + //vehicle & scale + Vehicle vehicle = panelData.getVehicle(); + double scale = vehicle.getLength() / drawDiameter; + + //buffered image stuff + int[] + bufferedImageSize = new int[] { + drawDiameter, //define width here, currently width = height + drawDiameter}, + bufferedImageCenter = new int[] { + bufferedImageSize[0] / 2, + bufferedImageSize[1] / 2}, + bufferedImageLocation = new int[] { + drawLocation[0] + (panelSize.width - bufferedImageSize[0]) / 2, + drawLocation[1] + (panelSize.height - bufferedImageSize[1]) / 2}; + BufferedImage image = new BufferedImage( - panelDrawSize[0], panelDrawSize[1], + bufferedImageSize[0], bufferedImageSize[1], BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = image.createGraphics(); - double angle = -20; - g2.transform(getTransform( - angle, new int[] { - vehicleDrawSize[0] / 2, - vehicleDrawSize[1] / 2})); - paintVehicle(g2, vehicleDrawSize); - int[] vehicleDrawLocation = new int[] { - drawLocation[0] + (panelDrawSize[0] - vehicleDrawSize[0]) / 2, - drawLocation[1] + (panelDrawSize[1] - vehicleDrawSize[1]) / 2}; - g.drawImage(image, vehicleDrawLocation[0], vehicleDrawLocation[1], imageObserver); + g2.transform(getTransform(angle, bufferedImageCenter)); + paintVehicle(g2, bufferedImageSize, vehicle, scale); + g.drawImage(image, bufferedImageLocation[0], bufferedImageLocation[1], imageObserver); } //for rotation @@ -67,25 +77,19 @@ private AffineTransform getTransform(double angle, int[] center) { }}; } - private void paintVehicle(Graphics2D g2, int[] drawSize) { + private void paintVehicle(Graphics2D g2, int[] drawSize, Vehicle vehicle, double scale) { int[] drawCenter = new int[] {drawSize[0] / 2, drawSize[1] / 2}; - - //vehicle - Vehicle vehicle = panelData.getVehicle(); - double scale = vehicle.getLength() / drawSize[0]; - - //parts List parts = vehicle.getParts(); - int xPart = 0; + double xPart = 0; for (int i = 0; i < parts.size(); i++) { VehiclePart part = parts.get(i); double[] scaledPartSize = new double[] { - part.getLength() / scale, - part.getDiameter() / scale}, + part.getDiameter() / scale, + part.getLength() / scale}, partDrawLoc = new double[] { - drawCenter[0] + (double) drawSize[0] / 2 - scaledPartSize[0] - xPart / scale, - drawCenter[1] - scaledPartSize[1] / 2}; + drawCenter[0] - scaledPartSize[0] / 2, + xPart / scale}; paintVehiclePart(g2, part, partDrawLoc, scaledPartSize); xPart += part.getLength(); } @@ -107,7 +111,7 @@ private void paintVehiclePart(Graphics2D g2, VehiclePart part, private void paintPartInfo(Graphics2D g2, VehiclePart part, double[] partDrawLoc, double[] scaledPartSize) { g2.setColor(PART_TEXT_COLOR); - int[] textOffset = new int[] {-35, 5}; + int[] textOffset = new int[]{-35, 5}; //title g2.setFont(PART_TITLE_FONT); diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index e876fcc..9d918db 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -1,10 +1,12 @@ package vehicleGraphics; +import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel; // public class VehiclePanel extends JPanel { + private static final double VEHICLE_DRAW_ANGLE = 30; private final VehiclePanelData panelData; private final PainterInterface borderPainter, @@ -16,9 +18,17 @@ public VehiclePanel(VehiclePanelData panelData) { super(); this.panelData = panelData; setBackground(panelData.getBackgroundColor()); - borderPainter = new BorderPainter(panelData, VehiclePanelData.getOptimalSize()); + + borderPainter = new BorderPainter(panelData); rotationTestPainter = new RotationTestPainter(this); - vehiclePainter = new VehiclePainter(this, this.panelData); + vehiclePainter = new VehiclePainter(this, this.panelData, VEHICLE_DRAW_ANGLE); + } + + @Override + public void update(Graphics g) { + super.update(g); + Dimension size = getSize(); + panelData.setPanelSize(size.width, size.height); } // diff --git a/src/main/java/vehicleGraphics/VehiclePanelData.java b/src/main/java/vehicleGraphics/VehiclePanelData.java index 81c445d..f029578 100644 --- a/src/main/java/vehicleGraphics/VehiclePanelData.java +++ b/src/main/java/vehicleGraphics/VehiclePanelData.java @@ -7,23 +7,29 @@ // public class VehiclePanelData { - private static final Dimension - OPTIMAL_SIZE = new Dimension(1000, 900); private static final Color BACKGROUND = Color.BLACK, BORDER_COLOR = Color.RED; private static final int BORDER_OFFSET = 0; + private final VehicleAdapter vehicleAdapter; + private final Dimension panelSize; + // - public static Dimension getOptimalSize() { - return OPTIMAL_SIZE; + public VehiclePanelData(VehicleAdapter vehicleAdapter, Dimension panelSize) { + this.vehicleAdapter = vehicleAdapter; + this.panelSize = panelSize; } - private final VehicleAdapter vehicleAdapter; + // + public void setPanelSize(int width, int height) { + panelSize.width = width; + panelSize.height = height; + } // - public VehiclePanelData(VehicleAdapter vehicleAdapter) { - this.vehicleAdapter = vehicleAdapter; + public Dimension getPanelSize() { + return panelSize; } // From e6d84f8c5ddcda22af2498a1c5f52090147fa320 Mon Sep 17 00:00:00 2001 From: thelordgod Date: Sat, 8 Jul 2023 03:12:53 +0300 Subject: [PATCH 02/26] update --- .../java/vehicleGraphics/VehiclePainter.java | 64 ++++++++++++++++--- .../java/vehicleGraphics/VehiclePanel.java | 5 +- src/main/java/vehicles/Vehicle.java | 19 +++++- src/main/java/vehicles/VehiclePart.java | 5 +- src/main/java/vehicles/VehiclePartInfo.java | 13 ++++ 5 files changed, 87 insertions(+), 19 deletions(-) create mode 100644 src/main/java/vehicles/VehiclePartInfo.java diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 033d8c9..d658df4 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -9,6 +9,7 @@ import vehicles.Vehicle; import vehicles.VehiclePart; +import vehicles.VehiclePartInfo; // class VehiclePainter implements PainterInterface { @@ -47,27 +48,74 @@ public final void paint(Graphics g, int[] drawLocation) { Vehicle vehicle = panelData.getVehicle(); double scale = vehicle.getLength() / drawDiameter; + double[] drawCenter = new double[] { + panelSize.width / 2.0, + panelSize.height / 2.0 + }; + + for (VehiclePart part : vehicle.getParts()) { + paintPart(g, part, vehicle.getPartInfo(part), drawCenter, scale); + } + //buffered image stuff + } + + private void paintPart(Graphics g, VehiclePart part, VehiclePartInfo partInfo, double[] drawCenter, double scale) { + double[] partDrawLoc = new double[] { + drawCenter[0] - partInfo.getLocation()[1] / scale, + drawCenter[1] - partInfo.getLocation()[0] / scale}; + paintPartImage(g, part, partDrawLoc, scale); + paintPartInfo(g, part, partDrawLoc); + } + + private void paintPartImage(Graphics g, VehiclePart part, double[] partDrawLoc, double scale) { int[] bufferedImageSize = new int[] { - drawDiameter, //define width here, currently width = height - drawDiameter}, + (int) (part.getDiameter() / scale), + (int) (part.getLength() / scale)}, bufferedImageCenter = new int[] { bufferedImageSize[0] / 2, bufferedImageSize[1] / 2}, bufferedImageLocation = new int[] { - drawLocation[0] + (panelSize.width - bufferedImageSize[0]) / 2, - drawLocation[1] + (panelSize.height - bufferedImageSize[1]) / 2}; + (int) partDrawLoc[0] - bufferedImageSize[0] / 2, + (int) partDrawLoc[1] - bufferedImageSize[1] / 2}; BufferedImage image = new BufferedImage( bufferedImageSize[0], bufferedImageSize[1], BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = image.createGraphics(); g2.transform(getTransform(angle, bufferedImageCenter)); - paintVehicle(g2, bufferedImageSize, vehicle, scale); + + g2.setColor(PART_COLOR); + g2.fillRect( + 0, 0, + bufferedImageSize[0], bufferedImageSize[1]); + g2.setColor(PART_BORDER_COLOR); + g2.drawRect( + 0, 0, + bufferedImageSize[0], bufferedImageSize[1]); + g.drawImage(image, bufferedImageLocation[0], bufferedImageLocation[1], imageObserver); } + private void paintPartInfo(Graphics g, VehiclePart part, double[] partDrawLoc) { + //part title + g.setColor(PART_TEXT_COLOR); + g.setFont(PART_TITLE_FONT); + g.drawString( + part.getName(), + (int) partDrawLoc[0], (int) partDrawLoc[1] - 5); + + //part details + g.setFont(PART_DETAILS_FONT); + g.drawString( + "Mass: " + String.format("%." + PART_MASS_DECIMAL_DIGITS + "f", part.getMass()) + " kg", + (int) partDrawLoc[0], (int) partDrawLoc[1] + 15); + g.drawString( + "Length: " + String.format("%." + PART_LENGTH_DECIMAL_DIGITS + "f", part.getLength()) + " m", + (int) partDrawLoc[0], (int) partDrawLoc[1] + 30); + } + //for rotation private AffineTransform getTransform(double angle, int[] center) { return new AffineTransform() {{ @@ -80,7 +128,6 @@ private AffineTransform getTransform(double angle, int[] center) { private void paintVehicle(Graphics2D g2, int[] drawSize, Vehicle vehicle, double scale) { int[] drawCenter = new int[] {drawSize[0] / 2, drawSize[1] / 2}; List parts = vehicle.getParts(); - double xPart = 0; for (int i = 0; i < parts.size(); i++) { VehiclePart part = parts.get(i); double[] @@ -88,10 +135,9 @@ private void paintVehicle(Graphics2D g2, int[] drawSize, Vehicle vehicle, double part.getDiameter() / scale, part.getLength() / scale}, partDrawLoc = new double[] { - drawCenter[0] - scaledPartSize[0] / 2, - xPart / scale}; + drawCenter[0] - scaledPartSize[0] / 2 - vehicle.getPartInfo(part).getLocation()[1] / scale, + drawCenter[1] - scaledPartSize[1] / 2 - vehicle.getPartInfo(part).getLocation()[0] / scale}; paintVehiclePart(g2, part, partDrawLoc, scaledPartSize); - xPart += part.getLength(); } } diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index 9d918db..04e0608 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -8,10 +8,7 @@ public class VehiclePanel extends JPanel { private static final double VEHICLE_DRAW_ANGLE = 30; private final VehiclePanelData panelData; - private final PainterInterface - borderPainter, - rotationTestPainter, - vehiclePainter; + private final PainterInterface borderPainter, rotationTestPainter, vehiclePainter; // public VehiclePanel(VehiclePanelData panelData) { diff --git a/src/main/java/vehicles/Vehicle.java b/src/main/java/vehicles/Vehicle.java index 82058f5..938530b 100644 --- a/src/main/java/vehicles/Vehicle.java +++ b/src/main/java/vehicles/Vehicle.java @@ -1,14 +1,25 @@ package vehicles; +import java.util.HashMap; import java.util.List; +import java.util.Map; // public abstract class Vehicle { private final List parts; + private final Map partInfo; // public Vehicle() { parts = getInitialParts(); + partInfo = new HashMap<>() {{ + double x = getLength() / 2; + + for (VehiclePart part : parts) { + put(part, new VehiclePartInfo(new double[]{x - part.getLength() / 2, 0})); + x -= part.getLength(); + } + }}; } //must be ordered for now @@ -18,9 +29,13 @@ public List getParts() { return parts; } + public VehiclePartInfo getPartInfo(VehiclePart part) { + return partInfo.get(part); + } + public double getMass() { double total = 0; - for(VehiclePart part : parts) { + for (VehiclePart part : parts) { total += part.getMass(); } return total; @@ -28,7 +43,7 @@ public double getMass() { public double getLength() { double total = 0; - for(VehiclePart part : parts) { + for (VehiclePart part : parts) { total += part.getLength(); } return total; diff --git a/src/main/java/vehicles/VehiclePart.java b/src/main/java/vehicles/VehiclePart.java index adb29a0..d9449cf 100644 --- a/src/main/java/vehicles/VehiclePart.java +++ b/src/main/java/vehicles/VehiclePart.java @@ -3,10 +3,7 @@ // public class VehiclePart { private final String name; - private final double - mass, - length, - diameter; + private final double mass, length, diameter; // VehiclePart(String name, int mass, int length, int diameter) { diff --git a/src/main/java/vehicles/VehiclePartInfo.java b/src/main/java/vehicles/VehiclePartInfo.java new file mode 100644 index 0000000..ab9a57e --- /dev/null +++ b/src/main/java/vehicles/VehiclePartInfo.java @@ -0,0 +1,13 @@ +package vehicles; + +public class VehiclePartInfo { + private double[] location; + + public VehiclePartInfo(double[] location) { + this.location = location; + } + + public double[] getLocation() { + return location; + } +} From 05ee9ee8f7adbd8e6742a7b0a783a14ef8da37d1 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 18:17:30 +0300 Subject: [PATCH 03/26] improvements --- src/main/java/main/graphics/Window.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/main/graphics/Window.java b/src/main/java/main/graphics/Window.java index e582ce7..0ac1000 100644 --- a/src/main/java/main/graphics/Window.java +++ b/src/main/java/main/graphics/Window.java @@ -1,8 +1,6 @@ package main.graphics; -import java.awt.Point; -import java.awt.Dimension; -import java.awt.Color; +import java.awt.*; import javax.swing.JFrame; import javax.swing.JPanel; @@ -18,12 +16,15 @@ public class Window extends JFrame { private static final String WINDOW_TITLE = "Vehicle viewer"; private static final Color BACKGROUND = Color.BLACK; + private final VehiclePanelData vehiclePanelData; + // public Window(VehicleAdapter vehicleAdapter) { super(); setWindowConfig(); - setContents(vehicleAdapter); - setResizable(false); + vehiclePanelData = new VehiclePanelData(vehicleAdapter, PANEL_SIZE); + setContents(); + //setResizable(false); setVisible(true); } @@ -37,12 +38,12 @@ private void setWindowConfig() { setTitle(WINDOW_TITLE); } - private void setContents(VehicleAdapter vehicleAdapter) { + private void setContents() { setBackground(BACKGROUND); - add(getVehiclePanel(vehicleAdapter)); + add(getVehiclePanel()); } - private JPanel getVehiclePanel(VehicleAdapter vehicleAdapter) { - return new VehiclePanel(new VehiclePanelData(vehicleAdapter, PANEL_SIZE)); + private JPanel getVehiclePanel() { + return new VehiclePanel(vehiclePanelData); } } \ No newline at end of file From 98e98a7b9d956ae517ad836656243432bd68abaf Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 18:46:16 +0300 Subject: [PATCH 04/26] fixes --- .../java/vehicleGraphics/VehiclePainter.java | 12 ++++++++---- .../java/vehicleGraphics/VehiclePanel.java | 6 +++++- src/main/java/vehicles/Vehicle.java | 18 +++++++++++------- src/main/java/vehicles/VehiclePart.java | 5 ++++- src/main/java/vehicles/VehiclePartInfo.java | 13 ------------- .../java/vehicles/VehiclePartLocationInfo.java | 16 ++++++++++++++++ 6 files changed, 44 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/vehicles/VehiclePartInfo.java create mode 100644 src/main/java/vehicles/VehiclePartLocationInfo.java diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index d658df4..58f8b55 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -9,7 +9,7 @@ import vehicles.Vehicle; import vehicles.VehiclePart; -import vehicles.VehiclePartInfo; +import vehicles.VehiclePartLocationInfo; // class VehiclePainter implements PainterInterface { @@ -29,7 +29,8 @@ class VehiclePainter implements PainterInterface { private final double angle; // - protected VehiclePainter(ImageObserver imageObserver, VehiclePanelData panelData, double angle) { + protected VehiclePainter(ImageObserver imageObserver, VehiclePanelData panelData, + double angle) { this.imageObserver = imageObserver; this.panelData = panelData; this.angle = angle; @@ -60,7 +61,9 @@ public final void paint(Graphics g, int[] drawLocation) { //buffered image stuff } - private void paintPart(Graphics g, VehiclePart part, VehiclePartInfo partInfo, double[] drawCenter, double scale) { + private void paintPart(Graphics g, + VehiclePart part, VehiclePartLocationInfo partInfo, + double[] drawCenter, double scale) { double[] partDrawLoc = new double[] { drawCenter[0] - partInfo.getLocation()[1] / scale, drawCenter[1] - partInfo.getLocation()[0] / scale}; @@ -68,7 +71,8 @@ private void paintPart(Graphics g, VehiclePart part, VehiclePartInfo partInfo, d paintPartInfo(g, part, partDrawLoc); } - private void paintPartImage(Graphics g, VehiclePart part, double[] partDrawLoc, double scale) { + private void paintPartImage(Graphics g, VehiclePart part, + double[] partDrawLoc, double scale) { int[] bufferedImageSize = new int[] { (int) (part.getDiameter() / scale), diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index 04e0608..72cf369 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -8,7 +8,10 @@ public class VehiclePanel extends JPanel { private static final double VEHICLE_DRAW_ANGLE = 30; private final VehiclePanelData panelData; - private final PainterInterface borderPainter, rotationTestPainter, vehiclePainter; + private final PainterInterface + borderPainter, + rotationTestPainter, + vehiclePainter; // public VehiclePanel(VehiclePanelData panelData) { @@ -21,6 +24,7 @@ public VehiclePanel(VehiclePanelData panelData) { vehiclePainter = new VehiclePainter(this, this.panelData, VEHICLE_DRAW_ANGLE); } + // @Override public void update(Graphics g) { super.update(g); diff --git a/src/main/java/vehicles/Vehicle.java b/src/main/java/vehicles/Vehicle.java index 938530b..d2f9a89 100644 --- a/src/main/java/vehicles/Vehicle.java +++ b/src/main/java/vehicles/Vehicle.java @@ -1,22 +1,24 @@ package vehicles; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.HashMap; // public abstract class Vehicle { private final List parts; - private final Map partInfo; + private final Map partLocationMap; // public Vehicle() { parts = getInitialParts(); - partInfo = new HashMap<>() {{ + partLocationMap = new HashMap<>() {{ double x = getLength() / 2; - for (VehiclePart part : parts) { - put(part, new VehiclePartInfo(new double[]{x - part.getLength() / 2, 0})); + put( + part, + new VehiclePartLocationInfo( + new double[]{x, 0})); x -= part.getLength(); } }}; @@ -29,10 +31,11 @@ public List getParts() { return parts; } - public VehiclePartInfo getPartInfo(VehiclePart part) { - return partInfo.get(part); + public VehiclePartLocationInfo getPartInfo(VehiclePart part) { + return partLocationMap.get(part); } + // public double getMass() { double total = 0; for (VehiclePart part : parts) { @@ -41,6 +44,7 @@ public double getMass() { return total; } + // public double getLength() { double total = 0; for (VehiclePart part : parts) { diff --git a/src/main/java/vehicles/VehiclePart.java b/src/main/java/vehicles/VehiclePart.java index d9449cf..adb29a0 100644 --- a/src/main/java/vehicles/VehiclePart.java +++ b/src/main/java/vehicles/VehiclePart.java @@ -3,7 +3,10 @@ // public class VehiclePart { private final String name; - private final double mass, length, diameter; + private final double + mass, + length, + diameter; // VehiclePart(String name, int mass, int length, int diameter) { diff --git a/src/main/java/vehicles/VehiclePartInfo.java b/src/main/java/vehicles/VehiclePartInfo.java deleted file mode 100644 index ab9a57e..0000000 --- a/src/main/java/vehicles/VehiclePartInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package vehicles; - -public class VehiclePartInfo { - private double[] location; - - public VehiclePartInfo(double[] location) { - this.location = location; - } - - public double[] getLocation() { - return location; - } -} diff --git a/src/main/java/vehicles/VehiclePartLocationInfo.java b/src/main/java/vehicles/VehiclePartLocationInfo.java new file mode 100644 index 0000000..67d2bc9 --- /dev/null +++ b/src/main/java/vehicles/VehiclePartLocationInfo.java @@ -0,0 +1,16 @@ +package vehicles; + +// +public class VehiclePartLocationInfo { + private final double[] location; + + // + public VehiclePartLocationInfo(double[] location) { + this.location = location; + } + + // + public double[] getLocation() { + return location; + } +} From eea2ed1a909c0b4b6f8348dace697901778df503 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 19:34:55 +0300 Subject: [PATCH 05/26] fixes --- .../java/vehicleGraphics/VehiclePainter.java | 158 ++++++++---------- 1 file changed, 72 insertions(+), 86 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 58f8b55..406bdcc 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -20,9 +20,6 @@ class VehiclePainter implements PainterInterface { private static final Font PART_TITLE_FONT = new Font("Verdana", Font.BOLD, 18), PART_DETAILS_FONT = new Font(null, Font.BOLD, 15); - private static final int - PART_MASS_DECIMAL_DIGITS = 2, - PART_LENGTH_DECIMAL_DIGITS = 1; private final ImageObserver imageObserver; private final VehiclePanelData panelData; @@ -40,39 +37,40 @@ protected VehiclePainter(ImageObserver imageObserver, VehiclePanelData panelData @Override public final void paint(Graphics g, int[] drawLocation) { Dimension panelSize = panelData.getPanelSize(); - int drawDiameter = Math.min(panelSize.width, panelSize.height); - - //draw y = actual -x - //draw x = actual -y + double[] drawCenter = new double[] { + panelSize.width / 2.0, + panelSize.height / 2.0}; + int maxDrawLength = Math.min( + (int) (panelSize.width * Math.sin(angle)), + (int) (panelSize.height * Math.cos(angle))); //vehicle & scale Vehicle vehicle = panelData.getVehicle(); - double scale = vehicle.getLength() / drawDiameter; - - double[] drawCenter = new double[] { - panelSize.width / 2.0, - panelSize.height / 2.0 - }; + double scale = vehicle.getLength() / maxDrawLength * 1.5; for (VehiclePart part : vehicle.getParts()) { - paintPart(g, part, vehicle.getPartInfo(part), drawCenter, scale); + VehiclePartLocationInfo partInfo = vehicle.getPartInfo(part); + double[] + scaledPartLoc = new double[] { + - partInfo.getLocation()[1] / scale, //draw x = actual -y + - partInfo.getLocation()[0] / scale //draw y = actual -x + }, + partDrawLoc = new double[] { //use trigonometry here + drawCenter[0] + scaledPartLoc[0] * Math.sin(angle) + scaledPartLoc[1] * Math.cos(angle), + drawCenter[1] + scaledPartLoc[0] * Math.cos(angle) + scaledPartLoc[1] * Math.sin(angle)}; + paintPart(g, part, partDrawLoc, scale); } - - //buffered image stuff } - private void paintPart(Graphics g, - VehiclePart part, VehiclePartLocationInfo partInfo, - double[] drawCenter, double scale) { - double[] partDrawLoc = new double[] { - drawCenter[0] - partInfo.getLocation()[1] / scale, - drawCenter[1] - partInfo.getLocation()[0] / scale}; - paintPartImage(g, part, partDrawLoc, scale); + private void paintPart(Graphics g, VehiclePart part, + double[] partDrawLoc, double scale) { + //paintPartImage(g, part, partDrawLoc, scale); paintPartInfo(g, part, partDrawLoc); } - private void paintPartImage(Graphics g, VehiclePart part, + /*private void paintPartImage(Graphics g, VehiclePart part, double[] partDrawLoc, double scale) { + //buffered image stuff int[] bufferedImageSize = new int[] { (int) (part.getDiameter() / scale), @@ -100,44 +98,17 @@ private void paintPartImage(Graphics g, VehiclePart part, bufferedImageSize[0], bufferedImageSize[1]); g.drawImage(image, bufferedImageLocation[0], bufferedImageLocation[1], imageObserver); - } - - private void paintPartInfo(Graphics g, VehiclePart part, double[] partDrawLoc) { - //part title - g.setColor(PART_TEXT_COLOR); - g.setFont(PART_TITLE_FONT); - g.drawString( - part.getName(), - (int) partDrawLoc[0], (int) partDrawLoc[1] - 5); - - //part details - g.setFont(PART_DETAILS_FONT); - g.drawString( - "Mass: " + String.format("%." + PART_MASS_DECIMAL_DIGITS + "f", part.getMass()) + " kg", - (int) partDrawLoc[0], (int) partDrawLoc[1] + 15); - g.drawString( - "Length: " + String.format("%." + PART_LENGTH_DECIMAL_DIGITS + "f", part.getLength()) + " m", - (int) partDrawLoc[0], (int) partDrawLoc[1] + 30); - } + }*/ - //for rotation - private AffineTransform getTransform(double angle, int[] center) { - return new AffineTransform() {{ - translate(center[0], center[1]); - rotate(Math.toRadians(angle)); - translate(-center[0], -center[1]); - }}; - } - - private void paintVehicle(Graphics2D g2, int[] drawSize, Vehicle vehicle, double scale) { + /*private void paintVehicle(Graphics2D g2, int[] drawSize, Vehicle vehicle, double scale) { int[] drawCenter = new int[] {drawSize[0] / 2, drawSize[1] / 2}; List parts = vehicle.getParts(); for (int i = 0; i < parts.size(); i++) { VehiclePart part = parts.get(i); double[] scaledPartSize = new double[] { - part.getDiameter() / scale, - part.getLength() / scale}, + part.getDiameter() / scale, + part.getLength() / scale}, partDrawLoc = new double[] { drawCenter[0] - scaledPartSize[0] / 2 - vehicle.getPartInfo(part).getLocation()[1] / scale, drawCenter[1] - scaledPartSize[1] / 2 - vehicle.getPartInfo(part).getLocation()[0] / scale}; @@ -156,44 +127,59 @@ private void paintVehiclePart(Graphics2D g2, VehiclePart part, (int) partDrawLoc[0], (int) partDrawLoc[1], (int) scaledPartSize[0], (int) scaledPartSize[1]); paintPartInfo(g2, part, partDrawLoc, scaledPartSize); - } + }*/ - private void paintPartInfo(Graphics2D g2, VehiclePart part, - double[] partDrawLoc, double[] scaledPartSize) { - g2.setColor(PART_TEXT_COLOR); - int[] textOffset = new int[]{-35, 5}; + private void paintPartInfo(Graphics g, VehiclePart part, double[] partDrawLoc) { + int[] textOffset = new int[] {-35, 5}; + g.setColor(PART_TEXT_COLOR); - //title - g2.setFont(PART_TITLE_FONT); - g2.drawString( + //part title + g.setFont(PART_TITLE_FONT); + g.drawString( part.getName(), - (int) (partDrawLoc[0] + scaledPartSize[0] / 2 + textOffset[0]), - (int) (partDrawLoc[1] + scaledPartSize[1] / 2 + textOffset[1])); - - //details - g2.setFont(PART_DETAILS_FONT); - String massString = "M: " + convertMassToTonnes(part.getMass()) + " t"; - g2.drawString( - massString, - (int) (partDrawLoc[0] + scaledPartSize[0] / 2 + textOffset[0]), - (int) (partDrawLoc[1] + scaledPartSize[1] / 2 + textOffset[1]) + 20); - - String sizeString = "L: " + roundLength(part.getLength()) + " m"; - g2.drawString( - sizeString, - (int) (partDrawLoc[0] + scaledPartSize[0] / 2 + textOffset[0]), - (int) (partDrawLoc[1] + scaledPartSize[1] / 2 + textOffset[1]) + 40); - } + (int) partDrawLoc[0] + textOffset[0], + (int) partDrawLoc[1] + textOffset[1]); - private double convertMassToTonnes(double mass) { - return roundToDecimalDigits(mass / 1000, PART_MASS_DECIMAL_DIGITS); + //part details + g.setFont(PART_DETAILS_FONT); + String massString = "M: " + ValueConvertor.convertMassToTonnes(part.getMass()) + " t"; + g.drawString(massString, + (int) partDrawLoc[0] + textOffset[0], + (int) partDrawLoc[1] + textOffset[1] + 15); + String sizeString = "L: " + ValueConvertor.roundLength(part.getLength()) + " m"; + g.drawString(sizeString, + (int) partDrawLoc[0] + textOffset[0], + (int) partDrawLoc[1] + textOffset[1] + 30); } - private double roundLength(double length) { - return roundToDecimalDigits(length, PART_LENGTH_DECIMAL_DIGITS); + //for rotation + private AffineTransform getTransform(double angle, int[] center) { + return new AffineTransform() {{ + translate(center[0], center[1]); + rotate(Math.toRadians(angle)); + translate(-center[0], -center[1]); + }}; } - private double roundToDecimalDigits(double value, int decimalDigits) { - return ((int) (value * Math.pow(10, decimalDigits))) / Math.pow(10.0, decimalDigits); + // + static class ValueConvertor { + private static final int + PART_MASS_DECIMAL_DIGITS = 2, + PART_LENGTH_DECIMAL_DIGITS = 1; + + // + static double convertMassToTonnes(double mass) { + return roundToDecimalDigits(mass / 1000, PART_MASS_DECIMAL_DIGITS); + } + + // + static double roundLength(double length) { + return roundToDecimalDigits(length, PART_LENGTH_DECIMAL_DIGITS); + } + + // + static double roundToDecimalDigits(double value, int decimalDigits) { + return ((int) (value * Math.pow(10, decimalDigits))) / Math.pow(10.0, decimalDigits); + } } } \ No newline at end of file From aa73bff0680feb1bc3fcc21deb90ba7ed3a03e9e Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:10:41 +0300 Subject: [PATCH 06/26] fixes --- .../java/vehicleGraphics/VehiclePainter.java | 66 ++++++------------- .../java/vehicleGraphics/VehiclePanel.java | 2 +- 2 files changed, 21 insertions(+), 47 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 406bdcc..f8949c7 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -38,37 +38,38 @@ protected VehiclePainter(ImageObserver imageObserver, VehiclePanelData panelData public final void paint(Graphics g, int[] drawLocation) { Dimension panelSize = panelData.getPanelSize(); double[] drawCenter = new double[] { - panelSize.width / 2.0, - panelSize.height / 2.0}; - int maxDrawLength = Math.min( - (int) (panelSize.width * Math.sin(angle)), - (int) (panelSize.height * Math.cos(angle))); + (double) panelSize.width / 2, + (double) panelSize.height / 2}; //vehicle & scale Vehicle vehicle = panelData.getVehicle(); - double scale = vehicle.getLength() / maxDrawLength * 1.5; + double scaleIncreaseTestCoefficient = 1; + int maxDrawLength = Math.min( + (int) (panelSize.width * Math.sin(Math.toRadians(angle))), + (int) (panelSize.height * Math.cos(Math.toRadians(angle)))); + double scale = vehicle.getLength() / maxDrawLength * scaleIncreaseTestCoefficient; for (VehiclePart part : vehicle.getParts()) { VehiclePartLocationInfo partInfo = vehicle.getPartInfo(part); double[] - scaledPartLoc = new double[] { - - partInfo.getLocation()[1] / scale, //draw x = actual -y - - partInfo.getLocation()[0] / scale //draw y = actual -x + scaledPartLoc = new double[] { //actual loc + -1 * partInfo.getLocation()[1] / scale, //draw x = actual -y + -1 * partInfo.getLocation()[0] / scale //draw y = actual -x }, partDrawLoc = new double[] { //use trigonometry here - drawCenter[0] + scaledPartLoc[0] * Math.sin(angle) + scaledPartLoc[1] * Math.cos(angle), - drawCenter[1] + scaledPartLoc[0] * Math.cos(angle) + scaledPartLoc[1] * Math.sin(angle)}; + drawCenter[0] + scaledPartLoc[0] * Math.sin(Math.toRadians(angle)) + scaledPartLoc[1] * Math.cos(Math.toRadians(angle)), + drawCenter[1] + scaledPartLoc[0] * Math.cos(Math.toRadians(angle)) + scaledPartLoc[1] * Math.sin(Math.toRadians(angle))}; paintPart(g, part, partDrawLoc, scale); } } private void paintPart(Graphics g, VehiclePart part, double[] partDrawLoc, double scale) { - //paintPartImage(g, part, partDrawLoc, scale); + paintPartImage(g, part, partDrawLoc, scale); paintPartInfo(g, part, partDrawLoc); } - /*private void paintPartImage(Graphics g, VehiclePart part, + private void paintPartImage(Graphics g, VehiclePart part, double[] partDrawLoc, double scale) { //buffered image stuff int[] @@ -77,14 +78,12 @@ private void paintPart(Graphics g, VehiclePart part, (int) (part.getLength() / scale)}, bufferedImageCenter = new int[] { bufferedImageSize[0] / 2, - bufferedImageSize[1] / 2}, - bufferedImageLocation = new int[] { - (int) partDrawLoc[0] - bufferedImageSize[0] / 2, - (int) partDrawLoc[1] - bufferedImageSize[1] / 2}; + bufferedImageSize[1] / 2}; BufferedImage image = new BufferedImage( bufferedImageSize[0], bufferedImageSize[1], BufferedImage.TYPE_INT_ARGB); + Graphics2D g2 = image.createGraphics(); g2.transform(getTransform(angle, bufferedImageCenter)); @@ -97,38 +96,13 @@ private void paintPart(Graphics g, VehiclePart part, 0, 0, bufferedImageSize[0], bufferedImageSize[1]); - g.drawImage(image, bufferedImageLocation[0], bufferedImageLocation[1], imageObserver); - }*/ + int[] bufferedImageLocation = new int[] { + (int) partDrawLoc[0] - bufferedImageSize[0] / 2, + (int) partDrawLoc[1] - bufferedImageSize[1] / 2}; - /*private void paintVehicle(Graphics2D g2, int[] drawSize, Vehicle vehicle, double scale) { - int[] drawCenter = new int[] {drawSize[0] / 2, drawSize[1] / 2}; - List parts = vehicle.getParts(); - for (int i = 0; i < parts.size(); i++) { - VehiclePart part = parts.get(i); - double[] - scaledPartSize = new double[] { - part.getDiameter() / scale, - part.getLength() / scale}, - partDrawLoc = new double[] { - drawCenter[0] - scaledPartSize[0] / 2 - vehicle.getPartInfo(part).getLocation()[1] / scale, - drawCenter[1] - scaledPartSize[1] / 2 - vehicle.getPartInfo(part).getLocation()[0] / scale}; - paintVehiclePart(g2, part, partDrawLoc, scaledPartSize); - } + g.drawImage(image, bufferedImageLocation[0], bufferedImageLocation[1], imageObserver); } - private void paintVehiclePart(Graphics2D g2, VehiclePart part, - double[] partDrawLoc, double[] scaledPartSize) { - g2.setColor(PART_COLOR); - g2.fillRect( - (int) partDrawLoc[0], (int) partDrawLoc[1], - (int) scaledPartSize[0], (int) scaledPartSize[1]); - g2.setColor(PART_BORDER_COLOR); - g2.drawRect( - (int) partDrawLoc[0], (int) partDrawLoc[1], - (int) scaledPartSize[0], (int) scaledPartSize[1]); - paintPartInfo(g2, part, partDrawLoc, scaledPartSize); - }*/ - private void paintPartInfo(Graphics g, VehiclePart part, double[] partDrawLoc) { int[] textOffset = new int[] {-35, 5}; g.setColor(PART_TEXT_COLOR); diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index 72cf369..4af68df 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -6,7 +6,7 @@ // public class VehiclePanel extends JPanel { - private static final double VEHICLE_DRAW_ANGLE = 30; + private static final double VEHICLE_DRAW_ANGLE = 45; private final VehiclePanelData panelData; private final PainterInterface borderPainter, From 9724533b9a3c247799819e74e39fd278230dac27 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:19:13 +0300 Subject: [PATCH 07/26] fixes --- src/main/java/vehicleGraphics/VehiclePainter.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index f8949c7..a672ed6 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -43,16 +43,17 @@ public final void paint(Graphics g, int[] drawLocation) { //vehicle & scale Vehicle vehicle = panelData.getVehicle(); - double scaleIncreaseTestCoefficient = 1; int maxDrawLength = Math.min( (int) (panelSize.width * Math.sin(Math.toRadians(angle))), (int) (panelSize.height * Math.cos(Math.toRadians(angle)))); - double scale = vehicle.getLength() / maxDrawLength * scaleIncreaseTestCoefficient; + double scaleTestCoefficient = 1; + //actual * scale = draw + double scale = vehicle.getLength() / maxDrawLength * scaleTestCoefficient; for (VehiclePart part : vehicle.getParts()) { VehiclePartLocationInfo partInfo = vehicle.getPartInfo(part); double[] - scaledPartLoc = new double[] { //actual loc + scaledPartLoc = new double[] { //actual loc scaled to drawable for g2 -1 * partInfo.getLocation()[1] / scale, //draw x = actual -y -1 * partInfo.getLocation()[0] / scale //draw y = actual -x }, From ca5053f69d7d65073795f71e62b8c0abeb59459e Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:19:38 +0300 Subject: [PATCH 08/26] fixes --- src/main/java/vehicleGraphics/VehiclePainter.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index a672ed6..7e77393 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -1,7 +1,5 @@ package vehicleGraphics; -import java.util.List; - import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; From 7bc9c6f35ba9dc6a1a3bb952713583b856ff6954 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:23:59 +0300 Subject: [PATCH 09/26] testing --- src/main/java/vehicleGraphics/VehiclePainter.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 7e77393..89c6adb 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -100,6 +100,12 @@ private void paintPartImage(Graphics g, VehiclePart part, (int) partDrawLoc[1] - bufferedImageSize[1] / 2}; g.drawImage(image, bufferedImageLocation[0], bufferedImageLocation[1], imageObserver); + + //test square + g.setColor(Color.red); + g.drawRect( + bufferedImageLocation[0], bufferedImageLocation[1], + bufferedImageSize[0], bufferedImageSize[1]); } private void paintPartInfo(Graphics g, VehiclePart part, double[] partDrawLoc) { From 5e53d47f014f45fa65528feb5f72897ae202f1b3 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:32:44 +0300 Subject: [PATCH 10/26] fixes --- .../java/vehicleGraphics/VehiclePainter.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 89c6adb..8103afb 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -70,11 +70,16 @@ private void paintPart(Graphics g, VehiclePart part, private void paintPartImage(Graphics g, VehiclePart part, double[] partDrawLoc, double scale) { + double[] scaledPartSize = new double[] { + part.getDiameter() / scale, + part.getLength() / scale}; + int bufferedImageSizeMaxDimension = (int) Math.max(scaledPartSize[0], scaledPartSize[1]); + //buffered image stuff int[] bufferedImageSize = new int[] { - (int) (part.getDiameter() / scale), - (int) (part.getLength() / scale)}, + bufferedImageSizeMaxDimension, + bufferedImageSizeMaxDimension}, bufferedImageCenter = new int[] { bufferedImageSize[0] / 2, bufferedImageSize[1] / 2}; @@ -88,12 +93,14 @@ private void paintPartImage(Graphics g, VehiclePart part, g2.setColor(PART_COLOR); g2.fillRect( - 0, 0, - bufferedImageSize[0], bufferedImageSize[1]); + (int) (bufferedImageCenter[0] - scaledPartSize[0] / 2), + (int) (bufferedImageCenter[1] - scaledPartSize[1] / 2), + (int) scaledPartSize[0], (int) scaledPartSize[1]); g2.setColor(PART_BORDER_COLOR); g2.drawRect( - 0, 0, - bufferedImageSize[0], bufferedImageSize[1]); + (int) (bufferedImageCenter[0] - scaledPartSize[0] / 2), + (int) (bufferedImageCenter[1] - scaledPartSize[1] / 2), + (int) scaledPartSize[0], (int) scaledPartSize[1]); int[] bufferedImageLocation = new int[] { (int) partDrawLoc[0] - bufferedImageSize[0] / 2, From 7aff03358546c4b069bee943f55c3ad9abe7563d Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:34:47 +0300 Subject: [PATCH 11/26] fixes --- src/main/java/vehicleGraphics/VehiclePainter.java | 2 +- src/main/java/vehicleGraphics/VehiclePanel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 8103afb..5152e19 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -73,7 +73,7 @@ private void paintPartImage(Graphics g, VehiclePart part, double[] scaledPartSize = new double[] { part.getDiameter() / scale, part.getLength() / scale}; - int bufferedImageSizeMaxDimension = (int) Math.max(scaledPartSize[0], scaledPartSize[1]); + int bufferedImageSizeMaxDimension = (int) Math.hypot(scaledPartSize[0], scaledPartSize[1]); //buffered image stuff int[] diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index 4af68df..72cf369 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -6,7 +6,7 @@ // public class VehiclePanel extends JPanel { - private static final double VEHICLE_DRAW_ANGLE = 45; + private static final double VEHICLE_DRAW_ANGLE = 30; private final VehiclePanelData panelData; private final PainterInterface borderPainter, From 76d5a6d1701892a7d227f014c06ae40bb68eeaeb Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:51:45 +0300 Subject: [PATCH 12/26] fixes --- .../java/vehicleGraphics/VehiclePainter.java | 50 +++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 5152e19..0eb8fbe 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -21,14 +21,14 @@ class VehiclePainter implements PainterInterface { private final ImageObserver imageObserver; private final VehiclePanelData panelData; - private final double angle; + private final double angle; // in radians // protected VehiclePainter(ImageObserver imageObserver, VehiclePanelData panelData, double angle) { this.imageObserver = imageObserver; this.panelData = panelData; - this.angle = angle; + this.angle = Math.toRadians(angle); } // @@ -42,8 +42,8 @@ public final void paint(Graphics g, int[] drawLocation) { //vehicle & scale Vehicle vehicle = panelData.getVehicle(); int maxDrawLength = Math.min( - (int) (panelSize.width * Math.sin(Math.toRadians(angle))), - (int) (panelSize.height * Math.cos(Math.toRadians(angle)))); + (int) (panelSize.width / Math.sin(angle)), + (int) (panelSize.height / Math.cos(angle))); double scaleTestCoefficient = 1; //actual * scale = draw double scale = vehicle.getLength() / maxDrawLength * scaleTestCoefficient; @@ -56,8 +56,8 @@ public final void paint(Graphics g, int[] drawLocation) { -1 * partInfo.getLocation()[0] / scale //draw y = actual -x }, partDrawLoc = new double[] { //use trigonometry here - drawCenter[0] + scaledPartLoc[0] * Math.sin(Math.toRadians(angle)) + scaledPartLoc[1] * Math.cos(Math.toRadians(angle)), - drawCenter[1] + scaledPartLoc[0] * Math.cos(Math.toRadians(angle)) + scaledPartLoc[1] * Math.sin(Math.toRadians(angle))}; + drawCenter[0] + scaledPartLoc[0] * Math.sin(angle) + scaledPartLoc[1] * Math.cos(angle), + drawCenter[1] + scaledPartLoc[0] * Math.cos(angle) + scaledPartLoc[1] * Math.sin(angle)}; paintPart(g, part, partDrawLoc, scale); } } @@ -73,7 +73,9 @@ private void paintPartImage(Graphics g, VehiclePart part, double[] scaledPartSize = new double[] { part.getDiameter() / scale, part.getLength() / scale}; - int bufferedImageSizeMaxDimension = (int) Math.hypot(scaledPartSize[0], scaledPartSize[1]); + int bufferedImageSizeMaxDimension = (int) Math.hypot( + scaledPartSize[0], + scaledPartSize[1]); //buffered image stuff int[] @@ -84,28 +86,20 @@ private void paintPartImage(Graphics g, VehiclePart part, bufferedImageSize[0] / 2, bufferedImageSize[1] / 2}; + //create image and apply transform BufferedImage image = new BufferedImage( bufferedImageSize[0], bufferedImageSize[1], BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = image.createGraphics(); g2.transform(getTransform(angle, bufferedImageCenter)); - g2.setColor(PART_COLOR); - g2.fillRect( - (int) (bufferedImageCenter[0] - scaledPartSize[0] / 2), - (int) (bufferedImageCenter[1] - scaledPartSize[1] / 2), - (int) scaledPartSize[0], (int) scaledPartSize[1]); - g2.setColor(PART_BORDER_COLOR); - g2.drawRect( - (int) (bufferedImageCenter[0] - scaledPartSize[0] / 2), - (int) (bufferedImageCenter[1] - scaledPartSize[1] / 2), - (int) scaledPartSize[0], (int) scaledPartSize[1]); + //paint on image + paintPartOnImage(g2, bufferedImageCenter, scale, part); + //paint image int[] bufferedImageLocation = new int[] { (int) partDrawLoc[0] - bufferedImageSize[0] / 2, (int) partDrawLoc[1] - bufferedImageSize[1] / 2}; - g.drawImage(image, bufferedImageLocation[0], bufferedImageLocation[1], imageObserver); //test square @@ -115,6 +109,22 @@ private void paintPartImage(Graphics g, VehiclePart part, bufferedImageSize[0], bufferedImageSize[1]); } + private void paintPartOnImage(Graphics2D g2, int[] imageCenter, double scale, VehiclePart part) { + double[] scaledPartSize = new double[] { + part.getDiameter() / scale, + part.getLength() / scale}; + g2.setColor(PART_COLOR); + g2.fillRect( + (int) (imageCenter[0] - scaledPartSize[0] / 2), + (int) (imageCenter[1] - scaledPartSize[1] / 2), + (int) scaledPartSize[0], (int) scaledPartSize[1]); + g2.setColor(PART_BORDER_COLOR); + g2.drawRect( + (int) (imageCenter[0] - scaledPartSize[0] / 2), + (int) (imageCenter[1] - scaledPartSize[1] / 2), + (int) scaledPartSize[0], (int) scaledPartSize[1]); + } + private void paintPartInfo(Graphics g, VehiclePart part, double[] partDrawLoc) { int[] textOffset = new int[] {-35, 5}; g.setColor(PART_TEXT_COLOR); @@ -142,7 +152,7 @@ private void paintPartInfo(Graphics g, VehiclePart part, double[] partDrawLoc) { private AffineTransform getTransform(double angle, int[] center) { return new AffineTransform() {{ translate(center[0], center[1]); - rotate(Math.toRadians(angle)); + rotate(angle); //already in radians translate(-center[0], -center[1]); }}; } From e29be1a81fbc9d0143011bc1caae357ca2508016 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 21:24:16 +0300 Subject: [PATCH 13/26] fixes --- .../java/vehicleGraphics/VehiclePainter.java | 34 ++++++++++++------- .../java/vehicleGraphics/VehiclePanel.java | 2 +- src/main/java/vehicles/Vehicle.java | 24 +++++++------ 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 0eb8fbe..4a6bd31 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -48,20 +48,30 @@ public final void paint(Graphics g, int[] drawLocation) { //actual * scale = draw double scale = vehicle.getLength() / maxDrawLength * scaleTestCoefficient; + //paint parts for (VehiclePart part : vehicle.getParts()) { VehiclePartLocationInfo partInfo = vehicle.getPartInfo(part); - double[] - scaledPartLoc = new double[] { //actual loc scaled to drawable for g2 - -1 * partInfo.getLocation()[1] / scale, //draw x = actual -y - -1 * partInfo.getLocation()[0] / scale //draw y = actual -x - }, - partDrawLoc = new double[] { //use trigonometry here - drawCenter[0] + scaledPartLoc[0] * Math.sin(angle) + scaledPartLoc[1] * Math.cos(angle), - drawCenter[1] + scaledPartLoc[0] * Math.cos(angle) + scaledPartLoc[1] * Math.sin(angle)}; - paintPart(g, part, partDrawLoc, scale); + paintPart( + g, part, + getDrawLoc(partInfo.getLocation(), drawCenter, scale), + scale); } } + private double[] getDrawLoc(double[] actualLoc, double[] drawCenter, double scale) { + double[] relativeOrthogonalLoc = new double[] { //actual loc scaled to drawable for g2 + -1 * actualLoc[1] / scale, //draw x = actual -y + -1 * actualLoc[0] / scale}; //draw y = actual -x + + return new double[] { //use trigonometry here + drawCenter[0] + + relativeOrthogonalLoc[0] * Math.cos(angle) + + relativeOrthogonalLoc[1] * Math.sin(angle), + drawCenter[1] + + relativeOrthogonalLoc[1] * Math.cos(angle) + + relativeOrthogonalLoc[0] * Math.sin(angle)}; + } + private void paintPart(Graphics g, VehiclePart part, double[] partDrawLoc, double scale) { paintPartImage(g, part, partDrawLoc, scale); @@ -73,15 +83,15 @@ private void paintPartImage(Graphics g, VehiclePart part, double[] scaledPartSize = new double[] { part.getDiameter() / scale, part.getLength() / scale}; - int bufferedImageSizeMaxDimension = (int) Math.hypot( + int bufferedImageMaxSize = (int) Math.hypot( scaledPartSize[0], scaledPartSize[1]); //buffered image stuff int[] bufferedImageSize = new int[] { - bufferedImageSizeMaxDimension, - bufferedImageSizeMaxDimension}, + bufferedImageMaxSize, + bufferedImageMaxSize}, bufferedImageCenter = new int[] { bufferedImageSize[0] / 2, bufferedImageSize[1] / 2}; diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index 72cf369..6e88f41 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -6,7 +6,7 @@ // public class VehiclePanel extends JPanel { - private static final double VEHICLE_DRAW_ANGLE = 30; + private static final double VEHICLE_DRAW_ANGLE = 15; private final VehiclePanelData panelData; private final PainterInterface borderPainter, diff --git a/src/main/java/vehicles/Vehicle.java b/src/main/java/vehicles/Vehicle.java index d2f9a89..ba828d4 100644 --- a/src/main/java/vehicles/Vehicle.java +++ b/src/main/java/vehicles/Vehicle.java @@ -12,16 +12,8 @@ public abstract class Vehicle { // public Vehicle() { parts = getInitialParts(); - partLocationMap = new HashMap<>() {{ - double x = getLength() / 2; - for (VehiclePart part : parts) { - put( - part, - new VehiclePartLocationInfo( - new double[]{x, 0})); - x -= part.getLength(); - } - }}; + partLocationMap = new HashMap<>(); + setPartLocationInfo(); } //must be ordered for now @@ -31,6 +23,18 @@ public List getParts() { return parts; } + private void setPartLocationInfo() { + double x = getLength() / 2; // {0, 0} at amidship + for (VehiclePart part : parts) { + double partLength = part.getLength(); + partLocationMap.put(part, new VehiclePartLocationInfo(new double[] { + x - partLength / 2, + 0} + )); + x -= partLength; + } + } + public VehiclePartLocationInfo getPartInfo(VehiclePart part) { return partLocationMap.get(part); } From 1acc10fa38dbaf57e14344b639fdf3c4b850ff27 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 21:29:50 +0300 Subject: [PATCH 14/26] fixes --- .../java/vehicleGraphics/VehiclePainter.java | 18 ++++++++++-------- .../java/vehicleGraphics/VehiclePanel.java | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index 4a6bd31..fa56582 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -48,14 +48,22 @@ public final void paint(Graphics g, int[] drawLocation) { //actual * scale = draw double scale = vehicle.getLength() / maxDrawLength * scaleTestCoefficient; - //paint parts + //paint part images for (VehiclePart part : vehicle.getParts()) { VehiclePartLocationInfo partInfo = vehicle.getPartInfo(part); - paintPart( + paintPartImage( g, part, getDrawLoc(partInfo.getLocation(), drawCenter, scale), scale); } + + //paint part info + for (VehiclePart part : vehicle.getParts()) { + VehiclePartLocationInfo partInfo = vehicle.getPartInfo(part); + paintPartInfo( + g, part, + getDrawLoc(partInfo.getLocation(), drawCenter, scale)); + } } private double[] getDrawLoc(double[] actualLoc, double[] drawCenter, double scale) { @@ -72,12 +80,6 @@ private double[] getDrawLoc(double[] actualLoc, double[] drawCenter, double scal + relativeOrthogonalLoc[0] * Math.sin(angle)}; } - private void paintPart(Graphics g, VehiclePart part, - double[] partDrawLoc, double scale) { - paintPartImage(g, part, partDrawLoc, scale); - paintPartInfo(g, part, partDrawLoc); - } - private void paintPartImage(Graphics g, VehiclePart part, double[] partDrawLoc, double scale) { double[] scaledPartSize = new double[] { diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index 6e88f41..1b21916 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -6,7 +6,7 @@ // public class VehiclePanel extends JPanel { - private static final double VEHICLE_DRAW_ANGLE = 15; + private static final double VEHICLE_DRAW_ANGLE = 10; private final VehiclePanelData panelData; private final PainterInterface borderPainter, From 29739fe1f5cf8679dec17c9b22f63842a6768723 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 8 Jul 2023 21:33:42 +0300 Subject: [PATCH 15/26] final fix --- src/main/java/vehicleGraphics/VehiclePainter.java | 4 ++-- src/main/java/vehicleGraphics/VehiclePanel.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePainter.java b/src/main/java/vehicleGraphics/VehiclePainter.java index fa56582..cc0b49f 100644 --- a/src/main/java/vehicleGraphics/VehiclePainter.java +++ b/src/main/java/vehicleGraphics/VehiclePainter.java @@ -74,10 +74,10 @@ private double[] getDrawLoc(double[] actualLoc, double[] drawCenter, double scal return new double[] { //use trigonometry here drawCenter[0] + relativeOrthogonalLoc[0] * Math.cos(angle) - + relativeOrthogonalLoc[1] * Math.sin(angle), + - relativeOrthogonalLoc[1] * Math.sin(angle), drawCenter[1] + relativeOrthogonalLoc[1] * Math.cos(angle) - + relativeOrthogonalLoc[0] * Math.sin(angle)}; + - relativeOrthogonalLoc[0] * Math.sin(angle)}; } private void paintPartImage(Graphics g, VehiclePart part, diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index 1b21916..5b80937 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -6,7 +6,7 @@ // public class VehiclePanel extends JPanel { - private static final double VEHICLE_DRAW_ANGLE = 10; + private static final double VEHICLE_DRAW_ANGLE = 55; private final VehiclePanelData panelData; private final PainterInterface borderPainter, From 74a1bc1075268d738230c61c33402a1d775699fa Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 22 Jul 2023 12:55:25 +0300 Subject: [PATCH 16/26] improvements --- src/main/java/vehicles/SimpleVehicle.java | 90 ++++++++++++++++--- src/main/java/vehicles/VehiclePart.java | 2 +- .../vehicles/VehiclePartLocationInfo.java | 2 +- 3 files changed, 79 insertions(+), 15 deletions(-) diff --git a/src/main/java/vehicles/SimpleVehicle.java b/src/main/java/vehicles/SimpleVehicle.java index d80c0d7..d363526 100644 --- a/src/main/java/vehicles/SimpleVehicle.java +++ b/src/main/java/vehicles/SimpleVehicle.java @@ -5,6 +5,9 @@ // public class SimpleVehicle extends Vehicle { + private static final int PASSENGER_COUNT = 5; + private static final double TARGET_DIAMETER = 3.0; + // public SimpleVehicle() { super(); @@ -14,42 +17,103 @@ public SimpleVehicle() { @Override List getInitialParts() { return new ArrayList<>() {{ - add(new Cockpit()); - add(new Storage()); - add(new FuelTanks()); - add(new Engines()); + add(Cockpit.newCockpit(TARGET_DIAMETER, PASSENGER_COUNT)); + add(new Storage(TARGET_DIAMETER)); + add(new FuelTanks(TARGET_DIAMETER)); + add(new Engines(TARGET_DIAMETER)); }}; } // private static class Cockpit extends VehiclePart { - // - Cockpit() { - super("Cockpit", 10, 2, 3); + private static final String PART_NAME = "Cockpit"; + private static final double + MINIMUM_LENGTH = 1.0, // arbitrary + MINIMUM_DIAMETER = 3.0, // arbitrary + VOLUME_PER_PASSENGER = 3.0, // arbitrary + PART_DENSITY = 500; // arbitrary + + //use this for creating new cockpit + @SuppressWarnings("SameParameterValue") + static Cockpit newCockpit(double targetDiameter, int passengerCount) { + double + finalDiameter = calculateFinalDiameter(targetDiameter), + finalLength = calculateFinalLength(finalDiameter, passengerCount), + mass = calculateMass(finalDiameter, finalLength); + return new Cockpit(mass, finalLength, finalDiameter); + } + + private Cockpit(double mass, double length, double diameter) { + super(PART_NAME, mass, length, diameter); + } + + private static double calculateFinalDiameter(double targetDiameter) { + return Math.max(targetDiameter, MINIMUM_DIAMETER); + } + + private static double calculateFinalLength(double diameter, int passengerCount) { + return Math.max( + getCylinderLength(passengerCount * VOLUME_PER_PASSENGER, diameter), + MINIMUM_LENGTH); + } + + private static double calculateMass(double diameter, double length) { + return PART_DENSITY * getCylinderVolume(diameter, length); } } // private static class Storage extends VehiclePart { // - Storage() { - super("Storage", 10, 5, 3); + Storage(double diameter) { + super("Storage", calculateMass(), 5, diameter); + } + + private static double calculateMass() { + return 10; } } // private static class FuelTanks extends VehiclePart { // - FuelTanks() { - super("Fuel Tanks", 10, 20, 3); + FuelTanks(double diameter) { + super("Fuel Tanks", calculateMass(), 20, diameter); + } + + private static double calculateMass() { + return 10; } } // private static class Engines extends VehiclePart { // - Engines() { - super("Engines", 10, 1, 3); + Engines(double diameter) { + super("Engines", calculateMass(), 1, diameter); + } + + private static double calculateMass() { + return 10; + } + } + + //unused yet + private abstract static class CylindricalPart extends VehiclePart { + CylindricalPart(String name, double length, double diameter) { + super(name, 0, length, diameter); } } + + private static double getCylinderCrossSection(double diameter) { + return Math.PI * Math.pow(diameter / 2, 2); + } + + private static double getCylinderLength(double volume, double diameter) { + return volume / getCylinderCrossSection(diameter); + } + + private static double getCylinderVolume(double diameter, double length) { + return getCylinderCrossSection(diameter) * length; + } } \ No newline at end of file diff --git a/src/main/java/vehicles/VehiclePart.java b/src/main/java/vehicles/VehiclePart.java index adb29a0..dcda2d6 100644 --- a/src/main/java/vehicles/VehiclePart.java +++ b/src/main/java/vehicles/VehiclePart.java @@ -9,7 +9,7 @@ public class VehiclePart { diameter; // - VehiclePart(String name, int mass, int length, int diameter) { + VehiclePart(String name, double mass, double length, double diameter) { this.name = name; this.mass = mass; this.length = length; diff --git a/src/main/java/vehicles/VehiclePartLocationInfo.java b/src/main/java/vehicles/VehiclePartLocationInfo.java index 67d2bc9..3e1c28f 100644 --- a/src/main/java/vehicles/VehiclePartLocationInfo.java +++ b/src/main/java/vehicles/VehiclePartLocationInfo.java @@ -13,4 +13,4 @@ public VehiclePartLocationInfo(double[] location) { public double[] getLocation() { return location; } -} +} \ No newline at end of file From 3967f9d1bb876b340e006592124d3881a439649b Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 22 Jul 2023 13:58:23 +0300 Subject: [PATCH 17/26] improvements --- src/main/java/vehicles/SimpleVehicle.java | 60 ++++++++----------- src/main/java/vehicles/Vehicle.java | 29 +++++++++ src/main/java/vehicles/VehiclePart.java | 2 +- .../java/vehicles/engines/ChemicalEngine.java | 14 +++++ src/main/java/vehicles/engines/Engine.java | 33 ++++++++++ .../java/vehicles/engines/EngineType.java | 7 +++ src/main/java/vehicles/engines/IonEngine.java | 14 +++++ .../UnsupportedEngineTypeException.java | 8 +++ 8 files changed, 132 insertions(+), 35 deletions(-) create mode 100644 src/main/java/vehicles/engines/ChemicalEngine.java create mode 100644 src/main/java/vehicles/engines/Engine.java create mode 100644 src/main/java/vehicles/engines/EngineType.java create mode 100644 src/main/java/vehicles/engines/IonEngine.java create mode 100644 src/main/java/vehicles/engines/UnsupportedEngineTypeException.java diff --git a/src/main/java/vehicles/SimpleVehicle.java b/src/main/java/vehicles/SimpleVehicle.java index d363526..a98aee3 100644 --- a/src/main/java/vehicles/SimpleVehicle.java +++ b/src/main/java/vehicles/SimpleVehicle.java @@ -3,9 +3,13 @@ import java.util.List; import java.util.ArrayList; +import vehicles.engines.EngineType; +import vehicles.engines.Engine; + // public class SimpleVehicle extends Vehicle { private static final int PASSENGER_COUNT = 5; + private static final EngineType ENGINE_TYPE = EngineType.CHEMICAL; private static final double TARGET_DIAMETER = 3.0; // @@ -20,10 +24,29 @@ List getInitialParts() { add(Cockpit.newCockpit(TARGET_DIAMETER, PASSENGER_COUNT)); add(new Storage(TARGET_DIAMETER)); add(new FuelTanks(TARGET_DIAMETER)); - add(new Engines(TARGET_DIAMETER)); + add(Engine.newEngine(TARGET_DIAMETER, ENGINE_TYPE)); }}; } + //unused yet + private abstract static class CylindricalPart extends VehiclePart { + CylindricalPart(String name, double length, double diameter) { + super(name, 0, length, diameter); + } + + static double getCylinderLength(double volume, double diameter) { + return volume / getCylinderCrossSection(diameter); + } + + static double getCylinderVolume(double diameter, double length) { + return getCylinderCrossSection(diameter) * length; + } + + private static double getCylinderCrossSection(double diameter) { + return Math.PI * Math.pow(diameter / 2, 2); + } + } + // private static class Cockpit extends VehiclePart { private static final String PART_NAME = "Cockpit"; @@ -53,12 +76,12 @@ private static double calculateFinalDiameter(double targetDiameter) { private static double calculateFinalLength(double diameter, int passengerCount) { return Math.max( - getCylinderLength(passengerCount * VOLUME_PER_PASSENGER, diameter), + CylindricalPart.getCylinderLength(passengerCount * VOLUME_PER_PASSENGER, diameter), MINIMUM_LENGTH); } private static double calculateMass(double diameter, double length) { - return PART_DENSITY * getCylinderVolume(diameter, length); + return PART_DENSITY * CylindricalPart.getCylinderVolume(diameter, length); } } @@ -85,35 +108,4 @@ private static double calculateMass() { return 10; } } - - // - private static class Engines extends VehiclePart { - // - Engines(double diameter) { - super("Engines", calculateMass(), 1, diameter); - } - - private static double calculateMass() { - return 10; - } - } - - //unused yet - private abstract static class CylindricalPart extends VehiclePart { - CylindricalPart(String name, double length, double diameter) { - super(name, 0, length, diameter); - } - } - - private static double getCylinderCrossSection(double diameter) { - return Math.PI * Math.pow(diameter / 2, 2); - } - - private static double getCylinderLength(double volume, double diameter) { - return volume / getCylinderCrossSection(diameter); - } - - private static double getCylinderVolume(double diameter, double length) { - return getCylinderCrossSection(diameter) * length; - } } \ No newline at end of file diff --git a/src/main/java/vehicles/Vehicle.java b/src/main/java/vehicles/Vehicle.java index ba828d4..4fb5543 100644 --- a/src/main/java/vehicles/Vehicle.java +++ b/src/main/java/vehicles/Vehicle.java @@ -4,16 +4,26 @@ import java.util.Map; import java.util.HashMap; +import vehicles.engines.Engine; + // public abstract class Vehicle { private final List parts; private final Map partLocationMap; + private final double exhaustVelocity; // public Vehicle() { parts = getInitialParts(); partLocationMap = new HashMap<>(); setPartLocationInfo(); + + try { + Engine engine = getEngine(); + exhaustVelocity = engine.getExhaustVelocity(); + } catch (NoEngineFoundException e) { + throw new RuntimeException(e); + } } //must be ordered for now @@ -56,4 +66,23 @@ public double getLength() { } return total; } + + private Engine getEngine() throws NoEngineFoundException { + for (VehiclePart part : parts) { + if (part instanceof Engine) { + return (Engine) part; + } + } + throw new NoEngineFoundException(); + } + + private static class NoEngineFoundException extends Exception { + NoEngineFoundException() { + super("No engine found!"); + } + } + + public double getExhaustVelocity() { + return exhaustVelocity; + } } \ No newline at end of file diff --git a/src/main/java/vehicles/VehiclePart.java b/src/main/java/vehicles/VehiclePart.java index dcda2d6..ed0a248 100644 --- a/src/main/java/vehicles/VehiclePart.java +++ b/src/main/java/vehicles/VehiclePart.java @@ -9,7 +9,7 @@ public class VehiclePart { diameter; // - VehiclePart(String name, double mass, double length, double diameter) { + public VehiclePart(String name, double mass, double length, double diameter) { this.name = name; this.mass = mass; this.length = length; diff --git a/src/main/java/vehicles/engines/ChemicalEngine.java b/src/main/java/vehicles/engines/ChemicalEngine.java new file mode 100644 index 0000000..d5242fe --- /dev/null +++ b/src/main/java/vehicles/engines/ChemicalEngine.java @@ -0,0 +1,14 @@ +package vehicles.engines; + +public class ChemicalEngine extends Engine { + private static final double EXHAUST_VELOCITY = 5000; + + protected ChemicalEngine(double diameter) { + super(diameter); + } + + @Override + public double getExhaustVelocity() { + return EXHAUST_VELOCITY; + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/Engine.java b/src/main/java/vehicles/engines/Engine.java new file mode 100644 index 0000000..e138790 --- /dev/null +++ b/src/main/java/vehicles/engines/Engine.java @@ -0,0 +1,33 @@ +package vehicles.engines; + +import vehicles.VehiclePart; + +// +public abstract class Engine extends VehiclePart { + private static final String PART_NAME = "Engine"; + + //use this for creating new engines + @SuppressWarnings({"SameParameterValue", "UnnecessaryDefault"}) + public static Engine newEngine(double diameter, EngineType type) { + try { + return switch (type) { + case CHEMICAL -> new ChemicalEngine(diameter); + case ION -> new IonEngine(diameter); + default -> throw new UnsupportedEngineTypeException(); + }; + } catch (UnsupportedEngineTypeException e) { + throw new RuntimeException(e); + } + } + + // + Engine(double diameter) { + super(PART_NAME, calculateMass(), 1, diameter); + } + + private static double calculateMass() { + return 10; + } + + public abstract double getExhaustVelocity(); +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/EngineType.java b/src/main/java/vehicles/engines/EngineType.java new file mode 100644 index 0000000..6093f94 --- /dev/null +++ b/src/main/java/vehicles/engines/EngineType.java @@ -0,0 +1,7 @@ +package vehicles.engines; + +//TODO: add javadoc +public enum EngineType { + CHEMICAL, + ION +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/IonEngine.java b/src/main/java/vehicles/engines/IonEngine.java new file mode 100644 index 0000000..9f09c85 --- /dev/null +++ b/src/main/java/vehicles/engines/IonEngine.java @@ -0,0 +1,14 @@ +package vehicles.engines; + +public class IonEngine extends Engine { + private static final double EXHAUST_VELOCITY = 20000; + + protected IonEngine(double diameter) { + super(diameter); + } + + @Override + public double getExhaustVelocity() { + return EXHAUST_VELOCITY; + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/UnsupportedEngineTypeException.java b/src/main/java/vehicles/engines/UnsupportedEngineTypeException.java new file mode 100644 index 0000000..db06015 --- /dev/null +++ b/src/main/java/vehicles/engines/UnsupportedEngineTypeException.java @@ -0,0 +1,8 @@ +package vehicles.engines; + +//TODO: add javadoc +class UnsupportedEngineTypeException extends Exception { + protected UnsupportedEngineTypeException() { + super("Unsupported engine type!"); + } +} \ No newline at end of file From 981e57ab3350e5eba22d23233a8eab36fbf51684 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 22 Jul 2023 14:32:54 +0300 Subject: [PATCH 18/26] improvements --- .../java/vehicles/engines/ChemicalEngine.java | 36 +++++++++++++++++-- src/main/java/vehicles/engines/Engine.java | 14 +++----- src/main/java/vehicles/engines/IonEngine.java | 8 +++-- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/main/java/vehicles/engines/ChemicalEngine.java b/src/main/java/vehicles/engines/ChemicalEngine.java index d5242fe..1ec8b06 100644 --- a/src/main/java/vehicles/engines/ChemicalEngine.java +++ b/src/main/java/vehicles/engines/ChemicalEngine.java @@ -2,13 +2,45 @@ public class ChemicalEngine extends Engine { private static final double EXHAUST_VELOCITY = 5000; + private static final double + COMBUSTION_CHAMBER_DIAMETER = 0.5, + NOZZLE_PROPORTIONS = 3, // length / diameter + HARDCODED_MASS = 1000; + private final double nozzleLength; - protected ChemicalEngine(double diameter) { - super(diameter); + //use this for creating new chemical engine + protected static ChemicalEngine newChemicalEngine(double targetDiameter) { + double + finalDiameter = calculateFinalDiameter(targetDiameter), + nozzleLength = finalDiameter * NOZZLE_PROPORTIONS, + finalLength = COMBUSTION_CHAMBER_DIAMETER + nozzleLength, + finalMass = calculateMass(); + return new ChemicalEngine(finalMass, finalLength, finalDiameter, nozzleLength); + } + + private ChemicalEngine(double mass, double length, double diameter, double nozzleLength) { + super(mass, length, diameter); + this.nozzleLength = nozzleLength; + } + + private static double calculateFinalDiameter(double targetDiameter) { + return Math.max(COMBUSTION_CHAMBER_DIAMETER, targetDiameter); + } + + private static double calculateMass() { + return HARDCODED_MASS; } @Override public double getExhaustVelocity() { return EXHAUST_VELOCITY; } + + public double getCombustionChamberDiameter() { + return COMBUSTION_CHAMBER_DIAMETER; + } + + public double[] getNozzleSize() { + return new double[] {nozzleLength, getDiameter()}; + } } \ No newline at end of file diff --git a/src/main/java/vehicles/engines/Engine.java b/src/main/java/vehicles/engines/Engine.java index e138790..abf96e5 100644 --- a/src/main/java/vehicles/engines/Engine.java +++ b/src/main/java/vehicles/engines/Engine.java @@ -8,11 +8,11 @@ public abstract class Engine extends VehiclePart { //use this for creating new engines @SuppressWarnings({"SameParameterValue", "UnnecessaryDefault"}) - public static Engine newEngine(double diameter, EngineType type) { + public static Engine newEngine(double targetDiameter, EngineType type) { try { return switch (type) { - case CHEMICAL -> new ChemicalEngine(diameter); - case ION -> new IonEngine(diameter); + case CHEMICAL -> ChemicalEngine.newChemicalEngine(targetDiameter); + case ION -> new IonEngine(targetDiameter); default -> throw new UnsupportedEngineTypeException(); }; } catch (UnsupportedEngineTypeException e) { @@ -21,12 +21,8 @@ public static Engine newEngine(double diameter, EngineType type) { } // - Engine(double diameter) { - super(PART_NAME, calculateMass(), 1, diameter); - } - - private static double calculateMass() { - return 10; + protected Engine(double mass, double length, double diameter) { + super(PART_NAME, mass, length, diameter); } public abstract double getExhaustVelocity(); diff --git a/src/main/java/vehicles/engines/IonEngine.java b/src/main/java/vehicles/engines/IonEngine.java index 9f09c85..b88ab68 100644 --- a/src/main/java/vehicles/engines/IonEngine.java +++ b/src/main/java/vehicles/engines/IonEngine.java @@ -3,8 +3,12 @@ public class IonEngine extends Engine { private static final double EXHAUST_VELOCITY = 20000; - protected IonEngine(double diameter) { - super(diameter); + protected IonEngine(double targetDiameter) { + super(calculateMass(), 1, targetDiameter); + } + + private static double calculateMass() { + return 10; } @Override From 8d40fa5b0779596c65748902f05c97c9d4224275 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 22 Jul 2023 14:51:16 +0300 Subject: [PATCH 19/26] improvements --- src/main/java/vehicles/Cockpit.java | 39 +++++++++++++++ src/main/java/vehicles/CylinderFunctions.java | 23 +++++++++ src/main/java/vehicles/SimpleVehicle.java | 50 ------------------- 3 files changed, 62 insertions(+), 50 deletions(-) create mode 100644 src/main/java/vehicles/Cockpit.java create mode 100644 src/main/java/vehicles/CylinderFunctions.java diff --git a/src/main/java/vehicles/Cockpit.java b/src/main/java/vehicles/Cockpit.java new file mode 100644 index 0000000..f7b970b --- /dev/null +++ b/src/main/java/vehicles/Cockpit.java @@ -0,0 +1,39 @@ +package vehicles; + +// +class Cockpit extends VehiclePart { + private static final String PART_NAME = "Cockpit"; + private static final double + MINIMUM_LENGTH = 1.0, // arbitrary + MINIMUM_DIAMETER = 3.0, // arbitrary + VOLUME_PER_PASSENGER = 3.0, // arbitrary + PART_DENSITY = 500; // arbitrary + + //use this for creating new cockpit + @SuppressWarnings("SameParameterValue") + static Cockpit newCockpit(double targetDiameter, int passengerCount) { + double + finalDiameter = calculateFinalDiameter(targetDiameter), + finalLength = calculateFinalLength(finalDiameter, passengerCount), + mass = calculateMass(finalDiameter, finalLength); + return new Cockpit(mass, finalLength, finalDiameter); + } + + private Cockpit(double mass, double length, double diameter) { + super(PART_NAME, mass, length, diameter); + } + + private static double calculateFinalDiameter(double targetDiameter) { + return Math.max(targetDiameter, MINIMUM_DIAMETER); + } + + private static double calculateFinalLength(double diameter, int passengerCount) { + return Math.max( + CylinderFunctions.getCylinderLength(passengerCount * VOLUME_PER_PASSENGER, diameter), + MINIMUM_LENGTH); + } + + private static double calculateMass(double diameter, double length) { + return PART_DENSITY * CylinderFunctions.getCylinderVolume(diameter, length); + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/CylinderFunctions.java b/src/main/java/vehicles/CylinderFunctions.java new file mode 100644 index 0000000..3017e5f --- /dev/null +++ b/src/main/java/vehicles/CylinderFunctions.java @@ -0,0 +1,23 @@ +package vehicles; + +// +public class CylinderFunctions { + // + public static double getCircleArea(double radius) { + return Math.PI * Math.pow(radius, 2); + } + + private static double getCrossSection(double diameter) { + return getCircleArea(diameter / 2); + } + + // + public static double getCylinderVolume(double diameter, double length) { + return getCrossSection(diameter) * length; + } + + // + public static double getCylinderLength(double volume, double diameter) { + return volume / getCrossSection(diameter); + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/SimpleVehicle.java b/src/main/java/vehicles/SimpleVehicle.java index a98aee3..b6a7913 100644 --- a/src/main/java/vehicles/SimpleVehicle.java +++ b/src/main/java/vehicles/SimpleVehicle.java @@ -33,56 +33,6 @@ private abstract static class CylindricalPart extends VehiclePart { CylindricalPart(String name, double length, double diameter) { super(name, 0, length, diameter); } - - static double getCylinderLength(double volume, double diameter) { - return volume / getCylinderCrossSection(diameter); - } - - static double getCylinderVolume(double diameter, double length) { - return getCylinderCrossSection(diameter) * length; - } - - private static double getCylinderCrossSection(double diameter) { - return Math.PI * Math.pow(diameter / 2, 2); - } - } - - // - private static class Cockpit extends VehiclePart { - private static final String PART_NAME = "Cockpit"; - private static final double - MINIMUM_LENGTH = 1.0, // arbitrary - MINIMUM_DIAMETER = 3.0, // arbitrary - VOLUME_PER_PASSENGER = 3.0, // arbitrary - PART_DENSITY = 500; // arbitrary - - //use this for creating new cockpit - @SuppressWarnings("SameParameterValue") - static Cockpit newCockpit(double targetDiameter, int passengerCount) { - double - finalDiameter = calculateFinalDiameter(targetDiameter), - finalLength = calculateFinalLength(finalDiameter, passengerCount), - mass = calculateMass(finalDiameter, finalLength); - return new Cockpit(mass, finalLength, finalDiameter); - } - - private Cockpit(double mass, double length, double diameter) { - super(PART_NAME, mass, length, diameter); - } - - private static double calculateFinalDiameter(double targetDiameter) { - return Math.max(targetDiameter, MINIMUM_DIAMETER); - } - - private static double calculateFinalLength(double diameter, int passengerCount) { - return Math.max( - CylindricalPart.getCylinderLength(passengerCount * VOLUME_PER_PASSENGER, diameter), - MINIMUM_LENGTH); - } - - private static double calculateMass(double diameter, double length) { - return PART_DENSITY * CylindricalPart.getCylinderVolume(diameter, length); - } } // From c54a6e9fd9b9a1ebe09a0772ea3e0522b276a3cf Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 22 Jul 2023 15:49:33 +0300 Subject: [PATCH 20/26] improvements --- .../java/vehicles/engines/ChemicalEngine.java | 46 ----------------- src/main/java/vehicles/engines/Engine.java | 1 + .../engines/chemical/ChemicalEngine.java | 51 +++++++++++++++++++ .../engines/chemical/CombustionChamber.java | 18 +++++++ .../vehicles/engines/chemical/Nozzle.java | 31 +++++++++++ 5 files changed, 101 insertions(+), 46 deletions(-) delete mode 100644 src/main/java/vehicles/engines/ChemicalEngine.java create mode 100644 src/main/java/vehicles/engines/chemical/ChemicalEngine.java create mode 100644 src/main/java/vehicles/engines/chemical/CombustionChamber.java create mode 100644 src/main/java/vehicles/engines/chemical/Nozzle.java diff --git a/src/main/java/vehicles/engines/ChemicalEngine.java b/src/main/java/vehicles/engines/ChemicalEngine.java deleted file mode 100644 index 1ec8b06..0000000 --- a/src/main/java/vehicles/engines/ChemicalEngine.java +++ /dev/null @@ -1,46 +0,0 @@ -package vehicles.engines; - -public class ChemicalEngine extends Engine { - private static final double EXHAUST_VELOCITY = 5000; - private static final double - COMBUSTION_CHAMBER_DIAMETER = 0.5, - NOZZLE_PROPORTIONS = 3, // length / diameter - HARDCODED_MASS = 1000; - private final double nozzleLength; - - //use this for creating new chemical engine - protected static ChemicalEngine newChemicalEngine(double targetDiameter) { - double - finalDiameter = calculateFinalDiameter(targetDiameter), - nozzleLength = finalDiameter * NOZZLE_PROPORTIONS, - finalLength = COMBUSTION_CHAMBER_DIAMETER + nozzleLength, - finalMass = calculateMass(); - return new ChemicalEngine(finalMass, finalLength, finalDiameter, nozzleLength); - } - - private ChemicalEngine(double mass, double length, double diameter, double nozzleLength) { - super(mass, length, diameter); - this.nozzleLength = nozzleLength; - } - - private static double calculateFinalDiameter(double targetDiameter) { - return Math.max(COMBUSTION_CHAMBER_DIAMETER, targetDiameter); - } - - private static double calculateMass() { - return HARDCODED_MASS; - } - - @Override - public double getExhaustVelocity() { - return EXHAUST_VELOCITY; - } - - public double getCombustionChamberDiameter() { - return COMBUSTION_CHAMBER_DIAMETER; - } - - public double[] getNozzleSize() { - return new double[] {nozzleLength, getDiameter()}; - } -} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/Engine.java b/src/main/java/vehicles/engines/Engine.java index abf96e5..8f1b394 100644 --- a/src/main/java/vehicles/engines/Engine.java +++ b/src/main/java/vehicles/engines/Engine.java @@ -1,6 +1,7 @@ package vehicles.engines; import vehicles.VehiclePart; +import vehicles.engines.chemical.ChemicalEngine; // public abstract class Engine extends VehiclePart { diff --git a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java new file mode 100644 index 0000000..f845f4a --- /dev/null +++ b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java @@ -0,0 +1,51 @@ +package vehicles.engines.chemical; + +import vehicles.engines.Engine; + +// +public class ChemicalEngine extends Engine { + private static final double EXHAUST_VELOCITY = 5000; + private static final double + EXHAUST_DIAMETER = 1, + HARDCODED_MASS = 1000; + + private final CombustionChamber combustionChamber; + private final Nozzle nozzle; + + //use this for creating new chemical engine + public static ChemicalEngine newChemicalEngine(double targetDiameter) { + Nozzle nozzle = new Nozzle(EXHAUST_DIAMETER); + CombustionChamber combustionChamber = new CombustionChamber(nozzle.getThroatDiameter()); + double + finalDiameter = Math.max(combustionChamber.getDiameter(), nozzle.getDiameter()), + finalLength = combustionChamber.getDiameter() + nozzle.getLength(), + finalMass = HARDCODED_MASS; + + return new ChemicalEngine( + finalMass, finalLength, finalDiameter, + combustionChamber, nozzle); + } + + private ChemicalEngine(double mass, double length, double diameter, + CombustionChamber combustionChamber, Nozzle nozzle) { + super(mass, length, diameter); + this.combustionChamber = combustionChamber; + this.nozzle = nozzle; + } + + // + @Override + public double getExhaustVelocity() { + return EXHAUST_VELOCITY; + } + + // + public CombustionChamber getCombustionChamber() { + return combustionChamber; + } + + // + public Nozzle getNozzle() { + return nozzle; + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/chemical/CombustionChamber.java b/src/main/java/vehicles/engines/chemical/CombustionChamber.java new file mode 100644 index 0000000..7aeea66 --- /dev/null +++ b/src/main/java/vehicles/engines/chemical/CombustionChamber.java @@ -0,0 +1,18 @@ +package vehicles.engines.chemical; + +//a spherical combustion chamber +public class CombustionChamber { + private static final double DIAMETER_THROAT_RATIO = 2.0; + + private final double diameter; + + // + protected CombustionChamber(double throatDiameter) { + diameter = throatDiameter * DIAMETER_THROAT_RATIO; + } + + // + public double getDiameter() { + return diameter; + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/chemical/Nozzle.java b/src/main/java/vehicles/engines/chemical/Nozzle.java new file mode 100644 index 0000000..8cce847 --- /dev/null +++ b/src/main/java/vehicles/engines/chemical/Nozzle.java @@ -0,0 +1,31 @@ +package vehicles.engines.chemical; + +// +public class Nozzle { + private static final double + DIAMETER_THROAT_RATIO = 2.0, + LENGTH_DIAMETER_RATIO = 3.0; + + private final double diameter, length; + + // + protected Nozzle(double exhaustDiameter) { + diameter = exhaustDiameter; + length = diameter * LENGTH_DIAMETER_RATIO; + } + + // + public double getDiameter() { + return diameter; + } + + // + public double getLength() { + return length; + } + + // + public double getThroatDiameter() { + return diameter / DIAMETER_THROAT_RATIO; + } +} \ No newline at end of file From 78c03cdaf275316e19d7c91529ac081463de466f Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sat, 22 Jul 2023 16:03:23 +0300 Subject: [PATCH 21/26] improvements --- src/main/java/vehicleGraphics/VehiclePanel.java | 2 +- src/main/java/vehicles/engines/chemical/ChemicalEngine.java | 2 +- src/main/java/vehicles/engines/chemical/Nozzle.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/vehicleGraphics/VehiclePanel.java b/src/main/java/vehicleGraphics/VehiclePanel.java index 5b80937..54d801f 100644 --- a/src/main/java/vehicleGraphics/VehiclePanel.java +++ b/src/main/java/vehicleGraphics/VehiclePanel.java @@ -6,7 +6,7 @@ // public class VehiclePanel extends JPanel { - private static final double VEHICLE_DRAW_ANGLE = 55; + private static final double VEHICLE_DRAW_ANGLE = 33; private final VehiclePanelData panelData; private final PainterInterface borderPainter, diff --git a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java index f845f4a..4fc391c 100644 --- a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java +++ b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java @@ -4,8 +4,8 @@ // public class ChemicalEngine extends Engine { - private static final double EXHAUST_VELOCITY = 5000; private static final double + EXHAUST_VELOCITY = 5000, EXHAUST_DIAMETER = 1, HARDCODED_MASS = 1000; diff --git a/src/main/java/vehicles/engines/chemical/Nozzle.java b/src/main/java/vehicles/engines/chemical/Nozzle.java index 8cce847..520bdb1 100644 --- a/src/main/java/vehicles/engines/chemical/Nozzle.java +++ b/src/main/java/vehicles/engines/chemical/Nozzle.java @@ -3,8 +3,8 @@ // public class Nozzle { private static final double - DIAMETER_THROAT_RATIO = 2.0, - LENGTH_DIAMETER_RATIO = 3.0; + DIAMETER_THROAT_RATIO = 30.0, // arbitrary + LENGTH_DIAMETER_RATIO = 1 / Math.tan(Math.toRadians(15)); // approximate private final double diameter, length; From bb488b84dc937088961a5f1daea022becead0d88 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sun, 23 Jul 2023 09:31:19 +0300 Subject: [PATCH 22/26] improvements --- src/main/java/mathUtilities/Circles.java | 24 +++++++++++ src/main/java/mathUtilities/Cylinders.java | 18 ++++++++ src/main/java/vehicles/Cockpit.java | 6 ++- src/main/java/vehicles/CylinderFunctions.java | 23 ---------- src/main/java/vehicles/SimpleVehicle.java | 32 ++++++++------ src/main/java/vehicles/engines/Engine.java | 9 ++-- src/main/java/vehicles/engines/IonEngine.java | 23 ++++++++-- .../engines/chemical/ChemicalEngine.java | 26 ++++++++---- .../engines/chemical/CombustionChamber.java | 8 ++++ .../vehicles/engines/chemical/Nozzle.java | 42 +++++++++++++++++-- 10 files changed, 154 insertions(+), 57 deletions(-) create mode 100644 src/main/java/mathUtilities/Circles.java create mode 100644 src/main/java/mathUtilities/Cylinders.java delete mode 100644 src/main/java/vehicles/CylinderFunctions.java diff --git a/src/main/java/mathUtilities/Circles.java b/src/main/java/mathUtilities/Circles.java new file mode 100644 index 0000000..b8b8d87 --- /dev/null +++ b/src/main/java/mathUtilities/Circles.java @@ -0,0 +1,24 @@ +package mathUtilities; + +// +public class Circles { + // C = 2 * pi * R + public static double getCircumference(double radius) { + return 2 * Math.PI * radius; + } + + // R = C / 2 / pi + public static double getRadiusFromCircumference(double circumference) { + return circumference / 2 / Math.PI; + } + + // S = pi * R ^ 2 + public static double getArea(double radius) { + return Math.PI * Math.pow(radius, 2); + } + + // R = sqrt(S / pi) + public static double getRadiusFromArea(double area) { + return Math.sqrt(area / Math.PI); + } +} \ No newline at end of file diff --git a/src/main/java/mathUtilities/Cylinders.java b/src/main/java/mathUtilities/Cylinders.java new file mode 100644 index 0000000..7155aba --- /dev/null +++ b/src/main/java/mathUtilities/Cylinders.java @@ -0,0 +1,18 @@ +package mathUtilities; + +// +public class Cylinders { + // + public static double getVolume(double diameter, double length) { + return getCrossSection(diameter) * length; + } + + // + public static double getLength(double volume, double diameter) { + return volume / getCrossSection(diameter); + } + + private static double getCrossSection(double diameter) { + return Circles.getArea(diameter / 2); + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/Cockpit.java b/src/main/java/vehicles/Cockpit.java index f7b970b..a31350b 100644 --- a/src/main/java/vehicles/Cockpit.java +++ b/src/main/java/vehicles/Cockpit.java @@ -1,5 +1,7 @@ package vehicles; +import mathUtilities.Cylinders; + // class Cockpit extends VehiclePart { private static final String PART_NAME = "Cockpit"; @@ -29,11 +31,11 @@ private static double calculateFinalDiameter(double targetDiameter) { private static double calculateFinalLength(double diameter, int passengerCount) { return Math.max( - CylinderFunctions.getCylinderLength(passengerCount * VOLUME_PER_PASSENGER, diameter), + Cylinders.getLength(passengerCount * VOLUME_PER_PASSENGER, diameter), MINIMUM_LENGTH); } private static double calculateMass(double diameter, double length) { - return PART_DENSITY * CylinderFunctions.getCylinderVolume(diameter, length); + return PART_DENSITY * Cylinders.getVolume(diameter, length); } } \ No newline at end of file diff --git a/src/main/java/vehicles/CylinderFunctions.java b/src/main/java/vehicles/CylinderFunctions.java deleted file mode 100644 index 3017e5f..0000000 --- a/src/main/java/vehicles/CylinderFunctions.java +++ /dev/null @@ -1,23 +0,0 @@ -package vehicles; - -// -public class CylinderFunctions { - // - public static double getCircleArea(double radius) { - return Math.PI * Math.pow(radius, 2); - } - - private static double getCrossSection(double diameter) { - return getCircleArea(diameter / 2); - } - - // - public static double getCylinderVolume(double diameter, double length) { - return getCrossSection(diameter) * length; - } - - // - public static double getCylinderLength(double volume, double diameter) { - return volume / getCrossSection(diameter); - } -} \ No newline at end of file diff --git a/src/main/java/vehicles/SimpleVehicle.java b/src/main/java/vehicles/SimpleVehicle.java index b6a7913..e3583ce 100644 --- a/src/main/java/vehicles/SimpleVehicle.java +++ b/src/main/java/vehicles/SimpleVehicle.java @@ -10,7 +10,9 @@ public class SimpleVehicle extends Vehicle { private static final int PASSENGER_COUNT = 5; private static final EngineType ENGINE_TYPE = EngineType.CHEMICAL; - private static final double TARGET_DIAMETER = 3.0; + private static final double + ENGINE_THRUST_KN = 1000, // in kN; arbitrary + TARGET_DIAMETER = 3.0; // public SimpleVehicle() { @@ -20,42 +22,46 @@ public SimpleVehicle() { // @Override List getInitialParts() { + double thrust_SI = ENGINE_THRUST_KN * 1000; return new ArrayList<>() {{ add(Cockpit.newCockpit(TARGET_DIAMETER, PASSENGER_COUNT)); add(new Storage(TARGET_DIAMETER)); add(new FuelTanks(TARGET_DIAMETER)); - add(Engine.newEngine(TARGET_DIAMETER, ENGINE_TYPE)); + add(Engine.newEngine(ENGINE_TYPE, thrust_SI)); }}; } - //unused yet - private abstract static class CylindricalPart extends VehiclePart { - CylindricalPart(String name, double length, double diameter) { - super(name, 0, length, diameter); - } - } - // private static class Storage extends VehiclePart { + private static final String PART_NAME = "Storage"; + private static final double + LENGTH = 5, + MASS = 10; + // Storage(double diameter) { - super("Storage", calculateMass(), 5, diameter); + super(PART_NAME, calculateMass(), LENGTH, diameter); } private static double calculateMass() { - return 10; + return MASS; } } // private static class FuelTanks extends VehiclePart { + private static final String PART_NAME = "Fuel tanks"; + private static final double + LENGTH = 20, + MASS = 10; + // FuelTanks(double diameter) { - super("Fuel Tanks", calculateMass(), 20, diameter); + super(PART_NAME, calculateMass(), LENGTH, diameter); } private static double calculateMass() { - return 10; + return MASS; } } } \ No newline at end of file diff --git a/src/main/java/vehicles/engines/Engine.java b/src/main/java/vehicles/engines/Engine.java index 8f1b394..f1cbbd1 100644 --- a/src/main/java/vehicles/engines/Engine.java +++ b/src/main/java/vehicles/engines/Engine.java @@ -9,11 +9,13 @@ public abstract class Engine extends VehiclePart { //use this for creating new engines @SuppressWarnings({"SameParameterValue", "UnnecessaryDefault"}) - public static Engine newEngine(double targetDiameter, EngineType type) { + public static Engine newEngine(EngineType type, double thrust) { + System.out.println("Creating new " + type + " engine."); + System.out.println("Thrust: " + (thrust / 1000) + " kN"); try { return switch (type) { - case CHEMICAL -> ChemicalEngine.newChemicalEngine(targetDiameter); - case ION -> new IonEngine(targetDiameter); + case CHEMICAL -> ChemicalEngine.newChemicalEngine(thrust); + case ION -> new IonEngine(); default -> throw new UnsupportedEngineTypeException(); }; } catch (UnsupportedEngineTypeException e) { @@ -26,5 +28,6 @@ protected Engine(double mass, double length, double diameter) { super(PART_NAME, mass, length, diameter); } + // public abstract double getExhaustVelocity(); } \ No newline at end of file diff --git a/src/main/java/vehicles/engines/IonEngine.java b/src/main/java/vehicles/engines/IonEngine.java index b88ab68..fd6a91f 100644 --- a/src/main/java/vehicles/engines/IonEngine.java +++ b/src/main/java/vehicles/engines/IonEngine.java @@ -1,16 +1,31 @@ package vehicles.engines; +// public class IonEngine extends Engine { - private static final double EXHAUST_VELOCITY = 20000; + private static final double + EXHAUST_VELOCITY = 20000, // arbitrary + HARDCODED_DIAMETER = 3, // arbitrary + HARDCODED_LENGTH = 1, // arbitrary + HARDCODED_MASS = 1000; // arbitrary - protected IonEngine(double targetDiameter) { - super(calculateMass(), 1, targetDiameter); + // + protected IonEngine() { + super(calculateMass(), calculateLength(), calculateDiameter()); + } + + private static double calculateDiameter() { + return HARDCODED_DIAMETER; + } + + private static double calculateLength() { + return HARDCODED_LENGTH; } private static double calculateMass() { - return 10; + return HARDCODED_MASS; } + // @Override public double getExhaustVelocity() { return EXHAUST_VELOCITY; diff --git a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java index 4fc391c..27dee06 100644 --- a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java +++ b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java @@ -5,24 +5,32 @@ // public class ChemicalEngine extends Engine { private static final double - EXHAUST_VELOCITY = 5000, - EXHAUST_DIAMETER = 1, - HARDCODED_MASS = 1000; + EXHAUST_VELOCITY = 5000, // average, approximate + PROPELLANT_MOLAR_MASS = 18 / 1000.0, + EXHAUST_TEMPERATURE = 5000, + EXHAUST_PRESSURE = 200000, + HARDCODED_MASS = 5000; // arbitrary private final CombustionChamber combustionChamber; private final Nozzle nozzle; //use this for creating new chemical engine - public static ChemicalEngine newChemicalEngine(double targetDiameter) { - Nozzle nozzle = new Nozzle(EXHAUST_DIAMETER); - CombustionChamber combustionChamber = new CombustionChamber(nozzle.getThroatDiameter()); + public static ChemicalEngine newChemicalEngine(double thrust) { + Nozzle nozzle = new Nozzle( + thrust, EXHAUST_VELOCITY, + PROPELLANT_MOLAR_MASS, EXHAUST_TEMPERATURE, EXHAUST_PRESSURE); + double throatDiameter = nozzle.getThroatDiameter(); + System.out.println("Throat diameter: " + throatDiameter + " m"); + CombustionChamber combustionChamber = new CombustionChamber(throatDiameter); + double finalDiameter = Math.max(combustionChamber.getDiameter(), nozzle.getDiameter()), - finalLength = combustionChamber.getDiameter() + nozzle.getLength(), - finalMass = HARDCODED_MASS; + finalLength = combustionChamber.getDiameter() + nozzle.getLength(); + + System.out.println("Total engine size: " + finalLength + " x " + finalDiameter); return new ChemicalEngine( - finalMass, finalLength, finalDiameter, + HARDCODED_MASS, finalLength, finalDiameter, combustionChamber, nozzle); } diff --git a/src/main/java/vehicles/engines/chemical/CombustionChamber.java b/src/main/java/vehicles/engines/chemical/CombustionChamber.java index 7aeea66..5e508ba 100644 --- a/src/main/java/vehicles/engines/chemical/CombustionChamber.java +++ b/src/main/java/vehicles/engines/chemical/CombustionChamber.java @@ -9,6 +9,14 @@ public class CombustionChamber { // protected CombustionChamber(double throatDiameter) { diameter = throatDiameter * DIAMETER_THROAT_RATIO; + printParametersToConsole(diameter); + } + + private static void printParametersToConsole(double diameter) { + double + diameter_mm = diameter * 1000, + diameter_mm_rounded = ((int) (diameter_mm * 100)) / 100.0; + System.out.println("Combustion chamber diameter: " + diameter_mm_rounded + " mm"); } // diff --git a/src/main/java/vehicles/engines/chemical/Nozzle.java b/src/main/java/vehicles/engines/chemical/Nozzle.java index 520bdb1..1679d96 100644 --- a/src/main/java/vehicles/engines/chemical/Nozzle.java +++ b/src/main/java/vehicles/engines/chemical/Nozzle.java @@ -1,17 +1,53 @@ package vehicles.engines.chemical; +import mathUtilities.Circles; + // public class Nozzle { private static final double + GAS_CONSTANT = 8.31, DIAMETER_THROAT_RATIO = 30.0, // arbitrary LENGTH_DIAMETER_RATIO = 1 / Math.tan(Math.toRadians(15)); // approximate - private final double diameter, length; + private final double + diameter, + length; // - protected Nozzle(double exhaustDiameter) { - diameter = exhaustDiameter; + protected Nozzle(double thrust, double exhaustVelocity, + double propellantMolarMass, double exhaustTemperature, double exhaustPressure) { + double + propellantDensityAtExhaust = calculatePropellantDensityAtExhaust( + propellantMolarMass, exhaustTemperature, exhaustPressure), + exhaustCrossSection = calculateExhaustCrossSection( + thrust, exhaustVelocity, propellantDensityAtExhaust); + diameter = calculateExhaustDiameter(exhaustCrossSection); length = diameter * LENGTH_DIAMETER_RATIO; + printParametersToConsole(propellantDensityAtExhaust, length, diameter); + } + + // ro = p * M / R / T + private double calculatePropellantDensityAtExhaust(double molarMass, double temperature, double pressure) { + return pressure * molarMass / GAS_CONSTANT / temperature; + } + + // S = F / (ro * ve ^ 2) + private double calculateExhaustCrossSection(double thrust, double exhaustVelocity, double propellantDensity) { + return thrust / (propellantDensity * Math.pow(exhaustVelocity, 2)); + } + + private double calculateExhaustDiameter(double crossSection) { + return Circles.getRadiusFromArea(crossSection) * 2; + } + + private static void printParametersToConsole(double propellantDensityAtExhaust, + double length, double diameter) { + double + propellantDensity_rounded = ((int) (propellantDensityAtExhaust * 1000)) / 1000.0, + length_rounded = ((int) (length * 1000)) / 1000.0, + diameter_rounded = ((int) (diameter * 1000)) / 1000.0; + System.out.println("Propellant density at exhaust: " + propellantDensity_rounded + " kg/m3"); + System.out.println("Nozzle size: " + length_rounded + " x " + diameter_rounded); } // From c6386ac513e2c20aa8bcb9a7344cc16089bdd31d Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sun, 23 Jul 2023 10:21:25 +0300 Subject: [PATCH 23/26] improvements --- .../engines/chemical/ChemicalEngine.java | 23 ++++++++---- .../engines/chemical/CombustionChamber.java | 2 +- .../vehicles/engines/chemical/Nozzle.java | 37 ++++++++++++------- .../engines/propellants/Propellant.java | 18 +++++++++ .../engines/propellants/WaterPropellant.java | 11 ++++++ 5 files changed, 68 insertions(+), 23 deletions(-) create mode 100644 src/main/java/vehicles/engines/propellants/Propellant.java create mode 100644 src/main/java/vehicles/engines/propellants/WaterPropellant.java diff --git a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java index 27dee06..a3b3336 100644 --- a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java +++ b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java @@ -1,15 +1,17 @@ package vehicles.engines.chemical; import vehicles.engines.Engine; +import vehicles.engines.propellants.Propellant; +import vehicles.engines.propellants.WaterPropellant; // public class ChemicalEngine extends Engine { private static final double EXHAUST_VELOCITY = 5000, // average, approximate - PROPELLANT_MOLAR_MASS = 18 / 1000.0, - EXHAUST_TEMPERATURE = 5000, - EXHAUST_PRESSURE = 200000, + EXHAUST_TEMPERATURE = 5000, // arbitrary + EXHAUST_PRESSURE = 200000, // arbitrary HARDCODED_MASS = 5000; // arbitrary + private static final Propellant PROPELLANT = new WaterPropellant(); private final CombustionChamber combustionChamber; private final Nozzle nozzle; @@ -17,23 +19,28 @@ public class ChemicalEngine extends Engine { //use this for creating new chemical engine public static ChemicalEngine newChemicalEngine(double thrust) { Nozzle nozzle = new Nozzle( + PROPELLANT, thrust, EXHAUST_VELOCITY, - PROPELLANT_MOLAR_MASS, EXHAUST_TEMPERATURE, EXHAUST_PRESSURE); + EXHAUST_TEMPERATURE, EXHAUST_PRESSURE); double throatDiameter = nozzle.getThroatDiameter(); - System.out.println("Throat diameter: " + throatDiameter + " m"); CombustionChamber combustionChamber = new CombustionChamber(throatDiameter); double finalDiameter = Math.max(combustionChamber.getDiameter(), nozzle.getDiameter()), finalLength = combustionChamber.getDiameter() + nozzle.getLength(); - - System.out.println("Total engine size: " + finalLength + " x " + finalDiameter); - + printParametersToConsole(finalLength, finalDiameter); return new ChemicalEngine( HARDCODED_MASS, finalLength, finalDiameter, combustionChamber, nozzle); } + private static void printParametersToConsole(double length, double diameter) { + double + lengthRounded = ((int) (length * 1000)) / 1000.0, + diameterRounded = ((int) (diameter * 1000)) / 1000.0; + System.out.println("Total engine size: " + lengthRounded + " m x " + diameterRounded + " m"); + } + private ChemicalEngine(double mass, double length, double diameter, CombustionChamber combustionChamber, Nozzle nozzle) { super(mass, length, diameter); diff --git a/src/main/java/vehicles/engines/chemical/CombustionChamber.java b/src/main/java/vehicles/engines/chemical/CombustionChamber.java index 5e508ba..bdc0090 100644 --- a/src/main/java/vehicles/engines/chemical/CombustionChamber.java +++ b/src/main/java/vehicles/engines/chemical/CombustionChamber.java @@ -2,7 +2,7 @@ //a spherical combustion chamber public class CombustionChamber { - private static final double DIAMETER_THROAT_RATIO = 2.0; + private static final double DIAMETER_THROAT_RATIO = 2.0; // arbitrary private final double diameter; diff --git a/src/main/java/vehicles/engines/chemical/Nozzle.java b/src/main/java/vehicles/engines/chemical/Nozzle.java index 1679d96..3428f1d 100644 --- a/src/main/java/vehicles/engines/chemical/Nozzle.java +++ b/src/main/java/vehicles/engines/chemical/Nozzle.java @@ -1,11 +1,11 @@ package vehicles.engines.chemical; import mathUtilities.Circles; +import vehicles.engines.propellants.Propellant; // public class Nozzle { private static final double - GAS_CONSTANT = 8.31, DIAMETER_THROAT_RATIO = 30.0, // arbitrary LENGTH_DIAMETER_RATIO = 1 / Math.tan(Math.toRadians(15)); // approximate @@ -14,21 +14,20 @@ public class Nozzle { length; // - protected Nozzle(double thrust, double exhaustVelocity, - double propellantMolarMass, double exhaustTemperature, double exhaustPressure) { + protected Nozzle(Propellant propellant, + double thrust, double exhaustVelocity, + double exhaustTemperature, double exhaustPressure) { double - propellantDensityAtExhaust = calculatePropellantDensityAtExhaust( - propellantMolarMass, exhaustTemperature, exhaustPressure), + propellantDensityAtExhaust = propellant.getDensity(exhaustTemperature, exhaustPressure), exhaustCrossSection = calculateExhaustCrossSection( thrust, exhaustVelocity, propellantDensityAtExhaust); diameter = calculateExhaustDiameter(exhaustCrossSection); length = diameter * LENGTH_DIAMETER_RATIO; - printParametersToConsole(propellantDensityAtExhaust, length, diameter); - } - // ro = p * M / R / T - private double calculatePropellantDensityAtExhaust(double molarMass, double temperature, double pressure) { - return pressure * molarMass / GAS_CONSTANT / temperature; + printParametersToConsole( + propellantDensityAtExhaust, + length, diameter, + getThroatDiameter()); } // S = F / (ro * ve ^ 2) @@ -41,13 +40,23 @@ private double calculateExhaustDiameter(double crossSection) { } private static void printParametersToConsole(double propellantDensityAtExhaust, - double length, double diameter) { + double length, double diameter, + double throatDiameter) { + //propellant density + double propellantDensity_rounded = ((int) (propellantDensityAtExhaust * 1000)) / 1000.0; + System.out.println("Propellant density at exhaust: " + propellantDensity_rounded + " kg/m3"); + + //length x diameter double - propellantDensity_rounded = ((int) (propellantDensityAtExhaust * 1000)) / 1000.0, length_rounded = ((int) (length * 1000)) / 1000.0, diameter_rounded = ((int) (diameter * 1000)) / 1000.0; - System.out.println("Propellant density at exhaust: " + propellantDensity_rounded + " kg/m3"); - System.out.println("Nozzle size: " + length_rounded + " x " + diameter_rounded); + System.out.println("Nozzle size: " + length_rounded + " m x " + diameter_rounded + " m"); + + //throat diameter + double + throatDiameter_mm = throatDiameter * 1000, + throatDiameter_mm_rounded = ((int) (throatDiameter_mm * 100)) / 100.0; + System.out.println("Throat diameter: " + throatDiameter_mm_rounded + " mm"); } // diff --git a/src/main/java/vehicles/engines/propellants/Propellant.java b/src/main/java/vehicles/engines/propellants/Propellant.java new file mode 100644 index 0000000..9216869 --- /dev/null +++ b/src/main/java/vehicles/engines/propellants/Propellant.java @@ -0,0 +1,18 @@ +package vehicles.engines.propellants; + +// +public class Propellant { + private static final double GAS_CONSTANT = 8.31; + + private final double molarMass; + + // + public Propellant(double molarMass) { + this.molarMass = molarMass; + } + + // ro = M * p / (R * T) + public double getDensity(double temperature, double pressure) { + return molarMass * pressure / (GAS_CONSTANT * temperature); + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/propellants/WaterPropellant.java b/src/main/java/vehicles/engines/propellants/WaterPropellant.java new file mode 100644 index 0000000..67d35be --- /dev/null +++ b/src/main/java/vehicles/engines/propellants/WaterPropellant.java @@ -0,0 +1,11 @@ +package vehicles.engines.propellants; + +// +public class WaterPropellant extends Propellant { + private static final double MOLAR_MASS = 18.0 / 1000; // approximate + + // + public WaterPropellant() { + super(MOLAR_MASS); + } +} \ No newline at end of file From ded08041ee3eb2d209a08b5423f6789af283a8b2 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sun, 23 Jul 2023 10:39:41 +0300 Subject: [PATCH 24/26] improvements --- .../engines/propellants/CarbonDioxidePropellant.java | 11 +++++++++++ .../engines/propellants/PotassiumPropellant.java | 11 +++++++++++ .../java/vehicles/engines/propellants/Propellant.java | 1 - .../engines/propellants/SodiumPropellant.java | 11 +++++++++++ .../vehicles/engines/propellants/WaterPropellant.java | 2 +- 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/main/java/vehicles/engines/propellants/CarbonDioxidePropellant.java create mode 100644 src/main/java/vehicles/engines/propellants/PotassiumPropellant.java create mode 100644 src/main/java/vehicles/engines/propellants/SodiumPropellant.java diff --git a/src/main/java/vehicles/engines/propellants/CarbonDioxidePropellant.java b/src/main/java/vehicles/engines/propellants/CarbonDioxidePropellant.java new file mode 100644 index 0000000..175bb5b --- /dev/null +++ b/src/main/java/vehicles/engines/propellants/CarbonDioxidePropellant.java @@ -0,0 +1,11 @@ +package vehicles.engines.propellants; + +//for chemical engine +public class CarbonDioxidePropellant extends Propellant { + private static final double MOLAR_MASS = 44.0 / 1000; // approximate + + // + public CarbonDioxidePropellant() { + super(MOLAR_MASS); + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/propellants/PotassiumPropellant.java b/src/main/java/vehicles/engines/propellants/PotassiumPropellant.java new file mode 100644 index 0000000..aeb8bfd --- /dev/null +++ b/src/main/java/vehicles/engines/propellants/PotassiumPropellant.java @@ -0,0 +1,11 @@ +package vehicles.engines.propellants; + +//for ion engine +public class PotassiumPropellant extends Propellant { + private static final double MOLAR_MASS = 39.0 / 1000; // approximate + + // + public PotassiumPropellant() { + super(MOLAR_MASS); + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/propellants/Propellant.java b/src/main/java/vehicles/engines/propellants/Propellant.java index 9216869..ae73f4e 100644 --- a/src/main/java/vehicles/engines/propellants/Propellant.java +++ b/src/main/java/vehicles/engines/propellants/Propellant.java @@ -3,7 +3,6 @@ // public class Propellant { private static final double GAS_CONSTANT = 8.31; - private final double molarMass; // diff --git a/src/main/java/vehicles/engines/propellants/SodiumPropellant.java b/src/main/java/vehicles/engines/propellants/SodiumPropellant.java new file mode 100644 index 0000000..0896086 --- /dev/null +++ b/src/main/java/vehicles/engines/propellants/SodiumPropellant.java @@ -0,0 +1,11 @@ +package vehicles.engines.propellants; + +//for ion engine +public class SodiumPropellant extends Propellant { + private static final double MOLAR_MASS = 23.0 / 1000; // approximate + + // + public SodiumPropellant() { + super(MOLAR_MASS); + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/propellants/WaterPropellant.java b/src/main/java/vehicles/engines/propellants/WaterPropellant.java index 67d35be..a57d473 100644 --- a/src/main/java/vehicles/engines/propellants/WaterPropellant.java +++ b/src/main/java/vehicles/engines/propellants/WaterPropellant.java @@ -1,6 +1,6 @@ package vehicles.engines.propellants; -// +//for chemical engine public class WaterPropellant extends Propellant { private static final double MOLAR_MASS = 18.0 / 1000; // approximate From 471a9778021a0f331acb132094acb3c42af8f0c8 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sun, 23 Jul 2023 11:34:28 +0300 Subject: [PATCH 25/26] improvements --- src/main/java/vehicles/engines/Engine.java | 12 +++++-- src/main/java/vehicles/engines/Exhaust.java | 33 +++++++++++++++++++ src/main/java/vehicles/engines/IonEngine.java | 33 ++++++++++--------- .../engines/chemical/ChemicalEngine.java | 8 ----- .../vehicles/engines/chemical/Nozzle.java | 20 +++-------- 5 files changed, 63 insertions(+), 43 deletions(-) create mode 100644 src/main/java/vehicles/engines/Exhaust.java diff --git a/src/main/java/vehicles/engines/Engine.java b/src/main/java/vehicles/engines/Engine.java index f1cbbd1..f4218e7 100644 --- a/src/main/java/vehicles/engines/Engine.java +++ b/src/main/java/vehicles/engines/Engine.java @@ -11,13 +11,19 @@ public abstract class Engine extends VehiclePart { @SuppressWarnings({"SameParameterValue", "UnnecessaryDefault"}) public static Engine newEngine(EngineType type, double thrust) { System.out.println("Creating new " + type + " engine."); - System.out.println("Thrust: " + (thrust / 1000) + " kN"); + System.out.println("Thrust: " + (((int) (thrust / 1000 / 10)) * 10.0) + " kN"); + try { - return switch (type) { + Engine engine = switch (type) { case CHEMICAL -> ChemicalEngine.newChemicalEngine(thrust); - case ION -> new IonEngine(); + case ION -> IonEngine.newIonEngine(thrust); default -> throw new UnsupportedEngineTypeException(); }; + double + lengthRounded = ((int) (engine.getLength() * 1000)) / 1000.0, + diameterRounded = ((int) (engine.getDiameter() * 1000)) / 1000.0; + System.out.println("Total engine size: " + lengthRounded + " m x " + diameterRounded + " m"); + return engine; } catch (UnsupportedEngineTypeException e) { throw new RuntimeException(e); } diff --git a/src/main/java/vehicles/engines/Exhaust.java b/src/main/java/vehicles/engines/Exhaust.java new file mode 100644 index 0000000..6ec6177 --- /dev/null +++ b/src/main/java/vehicles/engines/Exhaust.java @@ -0,0 +1,33 @@ +package vehicles.engines; + +import mathUtilities.Circles; + +// +public class Exhaust { + private final double + crossSection, + diameter, + massFlowRate; + + // + public Exhaust(double thrust, double velocity, double propellantDensity) { + crossSection = thrust / (propellantDensity * Math.pow(velocity, 2)); + diameter = Circles.getRadiusFromArea(crossSection) * 2; + massFlowRate = velocity * propellantDensity * crossSection; + } + + // + public double getCrossSection() { + return crossSection; + } + + // + public double getDiameter() { + return diameter; + } + + // + public double getMassFlowRate() { + return massFlowRate; + } +} \ No newline at end of file diff --git a/src/main/java/vehicles/engines/IonEngine.java b/src/main/java/vehicles/engines/IonEngine.java index fd6a91f..7839b0a 100644 --- a/src/main/java/vehicles/engines/IonEngine.java +++ b/src/main/java/vehicles/engines/IonEngine.java @@ -1,28 +1,29 @@ package vehicles.engines; +import vehicles.engines.propellants.Propellant; +import vehicles.engines.propellants.SodiumPropellant; + // public class IonEngine extends Engine { private static final double - EXHAUST_VELOCITY = 20000, // arbitrary - HARDCODED_DIAMETER = 3, // arbitrary - HARDCODED_LENGTH = 1, // arbitrary - HARDCODED_MASS = 1000; // arbitrary + EXHAUST_VELOCITY = 20000, // arbitrary + EXHAUST_TEMPERATURE = 10000, // arbitrary + EXHAUST_PRESSURE = 100000, // arbitrary + HARDCODED_LENGTH = 2, // arbitrary + HARDCODED_MASS = 10000; // arbitrary + private static final Propellant PROPELLANT = new SodiumPropellant(); // - protected IonEngine() { - super(calculateMass(), calculateLength(), calculateDiameter()); - } - - private static double calculateDiameter() { - return HARDCODED_DIAMETER; + protected static IonEngine newIonEngine(double thrust) { + Exhaust exhaust = new Exhaust( + thrust, EXHAUST_VELOCITY, + PROPELLANT.getDensity(EXHAUST_TEMPERATURE, EXHAUST_PRESSURE)); + return new IonEngine(HARDCODED_MASS, HARDCODED_LENGTH, exhaust.getDiameter()); } - private static double calculateLength() { - return HARDCODED_LENGTH; - } - - private static double calculateMass() { - return HARDCODED_MASS; + // + private IonEngine(double mass, double length, double diameter) { + super(mass, length, diameter); } // diff --git a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java index a3b3336..e0e5a09 100644 --- a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java +++ b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java @@ -28,19 +28,11 @@ public static ChemicalEngine newChemicalEngine(double thrust) { double finalDiameter = Math.max(combustionChamber.getDiameter(), nozzle.getDiameter()), finalLength = combustionChamber.getDiameter() + nozzle.getLength(); - printParametersToConsole(finalLength, finalDiameter); return new ChemicalEngine( HARDCODED_MASS, finalLength, finalDiameter, combustionChamber, nozzle); } - private static void printParametersToConsole(double length, double diameter) { - double - lengthRounded = ((int) (length * 1000)) / 1000.0, - diameterRounded = ((int) (diameter * 1000)) / 1000.0; - System.out.println("Total engine size: " + lengthRounded + " m x " + diameterRounded + " m"); - } - private ChemicalEngine(double mass, double length, double diameter, CombustionChamber combustionChamber, Nozzle nozzle) { super(mass, length, diameter); diff --git a/src/main/java/vehicles/engines/chemical/Nozzle.java b/src/main/java/vehicles/engines/chemical/Nozzle.java index 3428f1d..5df8ec2 100644 --- a/src/main/java/vehicles/engines/chemical/Nozzle.java +++ b/src/main/java/vehicles/engines/chemical/Nozzle.java @@ -1,6 +1,6 @@ package vehicles.engines.chemical; -import mathUtilities.Circles; +import vehicles.engines.Exhaust; import vehicles.engines.propellants.Propellant; // @@ -8,7 +8,6 @@ public class Nozzle { private static final double DIAMETER_THROAT_RATIO = 30.0, // arbitrary LENGTH_DIAMETER_RATIO = 1 / Math.tan(Math.toRadians(15)); // approximate - private final double diameter, length; @@ -17,11 +16,9 @@ public class Nozzle { protected Nozzle(Propellant propellant, double thrust, double exhaustVelocity, double exhaustTemperature, double exhaustPressure) { - double - propellantDensityAtExhaust = propellant.getDensity(exhaustTemperature, exhaustPressure), - exhaustCrossSection = calculateExhaustCrossSection( - thrust, exhaustVelocity, propellantDensityAtExhaust); - diameter = calculateExhaustDiameter(exhaustCrossSection); + double propellantDensityAtExhaust = propellant.getDensity(exhaustTemperature, exhaustPressure); + Exhaust exhaust = new Exhaust(thrust, exhaustVelocity, propellantDensityAtExhaust); + diameter = exhaust.getDiameter(); length = diameter * LENGTH_DIAMETER_RATIO; printParametersToConsole( @@ -30,15 +27,6 @@ protected Nozzle(Propellant propellant, getThroatDiameter()); } - // S = F / (ro * ve ^ 2) - private double calculateExhaustCrossSection(double thrust, double exhaustVelocity, double propellantDensity) { - return thrust / (propellantDensity * Math.pow(exhaustVelocity, 2)); - } - - private double calculateExhaustDiameter(double crossSection) { - return Circles.getRadiusFromArea(crossSection) * 2; - } - private static void printParametersToConsole(double propellantDensityAtExhaust, double length, double diameter, double throatDiameter) { From f0966ccead49073fb258210846090baef3bc10a2 Mon Sep 17 00:00:00 2001 From: Oskars AA <66279792+Krumuvecis@users.noreply.github.com> Date: Sun, 23 Jul 2023 12:34:43 +0300 Subject: [PATCH 26/26] improvements --- src/main/java/vehicles/engines/IonEngine.java | 10 +++++----- .../java/vehicles/engines/chemical/ChemicalEngine.java | 8 ++++---- src/main/java/vehicles/engines/chemical/Nozzle.java | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/vehicles/engines/IonEngine.java b/src/main/java/vehicles/engines/IonEngine.java index 7839b0a..380583c 100644 --- a/src/main/java/vehicles/engines/IonEngine.java +++ b/src/main/java/vehicles/engines/IonEngine.java @@ -6,11 +6,11 @@ // public class IonEngine extends Engine { private static final double - EXHAUST_VELOCITY = 20000, // arbitrary - EXHAUST_TEMPERATURE = 10000, // arbitrary - EXHAUST_PRESSURE = 100000, // arbitrary - HARDCODED_LENGTH = 2, // arbitrary - HARDCODED_MASS = 10000; // arbitrary + EXHAUST_VELOCITY = 20000, // arbitrary + EXHAUST_TEMPERATURE = 5000, // arbitrary + EXHAUST_PRESSURE = 0.1 * 10000, // arbitrary + HARDCODED_LENGTH = 2, // arbitrary + HARDCODED_MASS = 10000; // arbitrary private static final Propellant PROPELLANT = new SodiumPropellant(); // diff --git a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java index e0e5a09..15415a4 100644 --- a/src/main/java/vehicles/engines/chemical/ChemicalEngine.java +++ b/src/main/java/vehicles/engines/chemical/ChemicalEngine.java @@ -7,10 +7,10 @@ // public class ChemicalEngine extends Engine { private static final double - EXHAUST_VELOCITY = 5000, // average, approximate - EXHAUST_TEMPERATURE = 5000, // arbitrary - EXHAUST_PRESSURE = 200000, // arbitrary - HARDCODED_MASS = 5000; // arbitrary + EXHAUST_VELOCITY = 5000, // average, approximate + EXHAUST_TEMPERATURE = 2000, // arbitrary + EXHAUST_PRESSURE = 0.7 * 10000, // arbitrary + HARDCODED_MASS = 5000; // arbitrary private static final Propellant PROPELLANT = new WaterPropellant(); private final CombustionChamber combustionChamber; diff --git a/src/main/java/vehicles/engines/chemical/Nozzle.java b/src/main/java/vehicles/engines/chemical/Nozzle.java index 5df8ec2..dbf6860 100644 --- a/src/main/java/vehicles/engines/chemical/Nozzle.java +++ b/src/main/java/vehicles/engines/chemical/Nozzle.java @@ -6,7 +6,7 @@ // public class Nozzle { private static final double - DIAMETER_THROAT_RATIO = 30.0, // arbitrary + DIAMETER_THROAT_RATIO = 50.0, // arbitrary LENGTH_DIAMETER_RATIO = 1 / Math.tan(Math.toRadians(15)); // approximate private final double diameter,