diff --git a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java new file mode 100644 index 0000000..e12e0e3 --- /dev/null +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -0,0 +1,76 @@ +package kcl.teamIndexZero.traffic.gui; + +import kcl.teamIndexZero.traffic.log.Logger_Interface; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by kumar awijeet on 2/24/2016. thanks for Working!! + */ +public class GUI_Primitives { + protected static Logger_Interface log; + InputStream imageStream; + int j = 0, k = 0; + Image image, image1; + + public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics2D g) throws IOException { + drawCar(x3, y3, angleToXAxis, "gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg", g); + } + + public void drawTruck(int x3, int y3, double angleToXAxis, Graphics2D g) throws IOException { + drawCar(x3, y3, angleToXAxis, "gui/src/main/resources/sprites/8460_st0640_117.jpg", g); + } + + private void drawCar(int x3, int y3, double angleToXAxis, String filename, Graphics2D g) throws IOException { + /* + Files taken from + http://all-free-download.com/free-vector/car-vector-top-view-download.html + http://hdimagelib.com/trailer+truck+top+view + */ + Graphics2D graphics = g; + AffineTransform originalTransform = graphics.getTransform(); + try { + AffineTransform newTransformation = new AffineTransform(); + newTransformation.rotate(angleToXAxis, x3, y3); + graphics.setTransform(newTransformation); + //InputStream imageStream; + if ((filename == "gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg") && (k == 0)) { + imageStream = new BufferedInputStream(getClass().getResourceAsStream(filename)); + image = ImageIO.read(imageStream); + graphics.drawImage(image, x3 - 18, y3 - 18, 40, 40, null); + k++; + } else if ((filename == "gui/src/main/resources/sprites/8460_st0640_117.jpg") && (j == 0)) { + imageStream = new BufferedInputStream(getClass().getResourceAsStream(filename)); + image1 = ImageIO.read(imageStream); + graphics.drawImage(image1, x3 - 18, y3 - 18, 40, 40, null); + j++; + } else { + if (filename == "gui/src/main/resources/sprites/8460_st0640_117.jpg") { + graphics.drawImage(image1, x3 - 18, y3 - 18, 40, 40, null); + } else if (filename == "gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg") { + graphics.drawImage(image, x3 - 18, y3 - 18, 40, 40, null); + } + } + } catch (Exception e) { + e.printStackTrace(); + if (e instanceof IOException) { + log.log_Fatal(e.getMessage(), "GUI_Primnitives"); + } + if (e instanceof IllegalArgumentException) { + log.log_Error("Check function, parameter passing error", "GUI_Primitives"); + } else { + log.log_Exception(e); + } + } finally { + graphics.setTransform(originalTransform); + if (imageStream != null) { + imageStream.close(); + } + } + } +} diff --git a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java index c4b8aea..31970b7 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -13,6 +13,7 @@ import java.awt.*; import java.awt.image.BufferedImage; +import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; @@ -43,6 +44,7 @@ public class SimulationImageProducer { }; private static final Stroke BASIC_STROKE = new BasicStroke(1); protected static Logger_Interface LOG = Logger.getLoggerInstance(SimulationImageProducer.class.getSimpleName()); + protected static Logger_Interface log; private final SimulationMap map; private final GuiModel model; private final Primitives primitives; @@ -51,7 +53,6 @@ public class SimulationImageProducer { private BufferedImage image = null; private BufferedImage roadsImage = null; private Graphics2D graphics; - //helper variable used to cycle colors when debugging road - helpful to spot issues in distribution. private int debugRoadsColorCounter; @@ -190,12 +191,21 @@ public void drawAllDynamicObjects() { map.getObjectsOnSurface().forEach(mapObject -> { Vehicle v = (Vehicle) mapObject; GeoPoint point = v.getPositionOnMap(); + int x, y; + x = (int) point.xMeters; + y = (int) point.yMeters; if (point == null) { return; } - + GUI_Primitives cars = new GUI_Primitives(); if (model.getViewport().getPixelsInMeter() < 1) { - primitives.drawCircle(graphics, point, 2, v.getColor(), true); + try { + cars.drawSmallCar(x, y, 2, graphics); + } catch (IOException e) { + log.log_Fatal(e.getMessage(), "SimulationImageProducer"); + + } + //primitives.drawCircle(graphics, point, 2, v.getColor(), true); } else { double bearing = v.getBearing(); primitives.drawSegment(graphics, @@ -209,16 +219,26 @@ public void drawAllDynamicObjects() { v.getColor(), getStrokeByWidthMeters(v.getWidthMeters()) ); - primitives.drawCircle(graphics, point, (int) (Math.floor(v.getWidthMeters() * model.getViewport().getPixelsInMeter())), Color.YELLOW, true); + try { + cars.drawSmallCar(x, y, bearing, graphics); + } catch (IOException e) { + log.log_Fatal(e.getMessage(), "SimulationImageProducer"); + } + //primitives.drawCircle(graphics, point, (int) (Math.floor(v.getWidthMeters() * model.getViewport().getPixelsInMeter())), Color.YELLOW, true); } if (v.equals(model.getSelectedMapObject())) { int radius = (int) (model.getViewport().getPixelsInMeter() * ((Vehicle) model.getSelectedMapObject()).getDistanceToKeepToNextObject()); - primitives.drawCircle(graphics, + try { + cars.drawSmallCar(x, y, radius, graphics); + } catch (IOException e) { + log.log_Fatal(e.getMessage(), "SimulationImageProducer"); + } + /*primitives.drawCircle(graphics, point, radius, - v.getColor()); + v.getColor());*/ primitives.drawText(graphics, point, v.getNameAndRoad(), v.getColor()); primitives.drawAngleVector(graphics, point, v.getBearing(), radius, 1, v.getColor(), true, false); } diff --git a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulatorGui.java b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulatorGui.java index 7f289f6..04041b6 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulatorGui.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulatorGui.java @@ -76,5 +76,4 @@ private void startSimulatorWindow(OsmParseResult result) { LOG.log_Exception(e); } } - } diff --git a/gui/src/main/resources/sprites/8460_st0640_117.jpg b/gui/src/main/resources/sprites/8460_st0640_117.jpg new file mode 100644 index 0000000..01519ad Binary files /dev/null and b/gui/src/main/resources/sprites/8460_st0640_117.jpg differ diff --git a/gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg b/gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg new file mode 100644 index 0000000..b5412ce Binary files /dev/null and b/gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg differ diff --git a/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java new file mode 100644 index 0000000..190811e --- /dev/null +++ b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java @@ -0,0 +1,35 @@ +package kcl.teamIndexZero.traffic.gui; + +import org.junit.Test; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; + +/** + * Created by lexaux on 21/03/2016. + */ +public class GuiPrimitivesTest { + + @Test + public void testDrawingPerformance() throws IOException { + // record time + GUI_Primitives primitives = new GUI_Primitives(); + + long timestamp = System.currentTimeMillis(); + BufferedImage image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB); + Graphics2D g = (Graphics2D) image.getGraphics(); + int count = 25 * 500; + while (count-- > 0) { + if (count % 2 == 1) { + primitives.drawSmallCar(count, count, Math.random(), g); + } else { + primitives.drawTruck(count, count, Math.random(), g); + } + } + + long diff = System.currentTimeMillis() - timestamp; + System.out.println(diff); + + } +} diff --git a/log/src/main/java/kcl/teamIndexZero/traffic/log/Log_Config.java b/log/src/main/java/kcl/teamIndexZero/traffic/log/Log_Config.java index 9a5e640..678804f 100644 --- a/log/src/main/java/kcl/teamIndexZero/traffic/log/Log_Config.java +++ b/log/src/main/java/kcl/teamIndexZero/traffic/log/Log_Config.java @@ -1,6 +1,6 @@ package kcl.teamIndexZero.traffic.log; -import kcl.teamIndexZero.traffic.log.fileIO.FileInput; +import kcl.teamIndexZero.traffic.log.FileIO.FileInput; import kcl.teamIndexZero.traffic.log.fileIO.FileOutput; import kcl.teamIndexZero.traffic.log.microLogger.MicroLogger; import kcl.teamIndexZero.traffic.log.outputs.Output; diff --git a/log/src/main/java/kcl/teamIndexZero/traffic/log/fileIO/FileInput.java b/log/src/main/java/kcl/teamIndexZero/traffic/log/fileIO/FileInput.java index bfe6b37..1fc60d2 100644 --- a/log/src/main/java/kcl/teamIndexZero/traffic/log/fileIO/FileInput.java +++ b/log/src/main/java/kcl/teamIndexZero/traffic/log/fileIO/FileInput.java @@ -1,5 +1,6 @@ -package kcl.teamIndexZero.traffic.log.fileIO; +package kcl.teamIndexZero.traffic.log.FileIO; +import kcl.teamIndexZero.traffic.log.fileIO.FileIO; import kcl.teamIndexZero.traffic.log.microLogger.MicroLogger; import java.io.BufferedReader; diff --git a/log/src/test/java/kcl/teamIndexZero/traffic/log/fileIO/FileInputTest.java b/log/src/test/java/kcl/teamIndexZero/traffic/log/fileIO/FileInputTest.java index b78a69a..be0096b 100644 --- a/log/src/test/java/kcl/teamIndexZero/traffic/log/fileIO/FileInputTest.java +++ b/log/src/test/java/kcl/teamIndexZero/traffic/log/fileIO/FileInputTest.java @@ -1,5 +1,6 @@ package kcl.teamIndexZero.traffic.log.fileIO; +import kcl.teamIndexZero.traffic.log.FileIO.FileInput; import org.junit.After; import org.junit.Test; @@ -24,7 +25,7 @@ public void tearDown() throws Exception { @Test public void testRead() throws Exception { - FileOutput out = new FileOutput("", "testRead.test"); + kcl.teamIndexZero.traffic.log.fileIO.FileOutput out = new kcl.teamIndexZero.traffic.log.fileIO.FileOutput("", "testRead.test"); out.appendString("String 1" + System.lineSeparator()); out.appendString("String 2" + System.lineSeparator()); out.appendString("String 3"); diff --git a/simulator/src/test/java/kcl/teamIndexZero/traffic/simulator/data/features/TrafficGeneratorTest.java b/simulator/src/test/java/kcl/teamIndexZero/traffic/simulator/data/features/TrafficGeneratorTest.java index 86cddc7..9b634c0 100644 --- a/simulator/src/test/java/kcl/teamIndexZero/traffic/simulator/data/features/TrafficGeneratorTest.java +++ b/simulator/src/test/java/kcl/teamIndexZero/traffic/simulator/data/features/TrafficGeneratorTest.java @@ -146,7 +146,7 @@ public void testGetThisGeneratorCreationCounter() throws Exception { when(map.getObjectsOnSurface()).thenReturn(list); tg.linkRoad(r1); SimulationTick tick = mock(SimulationTick.class); - for (int i = 0; i < 50; i++) { + for (int i = 0; i < 100; i++) { tg.tick(tick); assertTrue(tg.getThisGeneratorCreationCounter() >= 0); } diff --git a/uml_diagrams/GUI.png b/uml_diagrams/GUI.png index a925957..65f7375 100644 Binary files a/uml_diagrams/GUI.png and b/uml_diagrams/GUI.png differ diff --git a/uml_diagrams/GUI.puml b/uml_diagrams/GUI.puml index 7306a82..fc72473 100644 --- a/uml_diagrams/GUI.puml +++ b/uml_diagrams/GUI.puml @@ -21,11 +21,30 @@ class GuiController { +pause() } +class SimulationImageProducer { ++tick() +} + +class Primitives { ++drawLine(obj, pos, graphics) ++drawCurve(obj, pos, graphics) ++drawDoubleCrossRoad(obj, pos, graphics) +} + +Simulator --> SimulationImageProducer: calls tick() + + +GuiModel <-- SimulationImageProducer:update model \nwith new\nimages +SimulationImageProducer -> Primitives + + class Simulator { ++start() ++stop() ++pause() } -GuiController --> Simulator: Thread, \ncreate,\ncommand -Simulator --> GuiController: Invoke tick() \nmethod on \nsimulation \nupdates +GuiController --> Simulator: Thread, \ncreate,\ncommand GuiController -> GuiModel: Update model state