From 1a5dab15c931fcfe925e3d54b1426fe762299910 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 24 Feb 2016 09:43:02 +0000 Subject: [PATCH 01/41] GUI for primitive roads --- .../kcl/teamIndexZero/traffic/gui/GUI_Primitives.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java 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..04a0f87 --- /dev/null +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -0,0 +1,8 @@ +package kcl.teamIndexZero.traffic.gui; + +/** + * Created by kumar awijeet on 2/24/2016. thanks for Working!! + */ +public class GUI_Primitives { + +} From 8968089902bead79f599e7128cdda5c1dcd2b56b Mon Sep 17 00:00:00 2001 From: Oleksandr Cherednychenko Date: Sat, 27 Feb 2016 12:14:39 +0000 Subject: [PATCH 02/41] Descriptive diagram for Kumar. --- uml_diagrams/GUI.png | Bin 23675 -> 43435 bytes uml_diagrams/GUI.puml | 24 ++++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/uml_diagrams/GUI.png b/uml_diagrams/GUI.png index a925957869d807d161219f272b2cfe510d8f6256..65f7375cfcbca6a09eaccc8139ec4f30f5797865 100644 GIT binary patch literal 43435 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 literal 23675 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 J8dTBI{{w42fv5lg diff --git a/uml_diagrams/GUI.puml b/uml_diagrams/GUI.puml index 7306a82..5eac89b 100644 --- a/uml_diagrams/GUI.puml +++ b/uml_diagrams/GUI.puml @@ -21,11 +21,31 @@ class GuiController { +pause() } +class SimulationImageProducer { ++tick() +} + +class Primitives { ++drawVehicle(obj, pos, graphics) ++drawObstacle(obj, pos, graphics) ++drawRoad(obj, pos, graphics) ++drawLane(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 From ce6a800896b263cc7f3c5bb360bf9c88c63499ab Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sat, 27 Feb 2016 12:29:48 +0000 Subject: [PATCH 03/41] Small changes to primitives --- .../java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java | 1 + uml_diagrams/GUI.puml | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) 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 index 04a0f87..0d88d0d 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -5,4 +5,5 @@ */ public class GUI_Primitives { + } diff --git a/uml_diagrams/GUI.puml b/uml_diagrams/GUI.puml index 5eac89b..de98aa0 100644 --- a/uml_diagrams/GUI.puml +++ b/uml_diagrams/GUI.puml @@ -26,10 +26,10 @@ class SimulationImageProducer { } class Primitives { -+drawVehicle(obj, pos, graphics) -+drawObstacle(obj, pos, graphics) +drawRoad(obj, pos, graphics) -+drawLane(obj, pos, graphics) ++drawVehicle(obj, pos, graphics) ++drawSigns(obj, pos, graphics) ++drawMisc(obj, pos, graphics) } Simulator --> SimulationImageProducer: calls tick() From 96e3769d674ceb2f87afdb4a5f3d77252bdb6c0f Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sat, 27 Feb 2016 14:59:09 +0000 Subject: [PATCH 04/41] Primitive class can now draw a double cross road, some minor errors exist --- .../traffic/gui/GUI_Primitives.java | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) 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 index 0d88d0d..6472033 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -1,9 +1,60 @@ package kcl.teamIndexZero.traffic.gui; +import java.awt.*; +import java.awt.geom.QuadCurve2D; /** * Created by kumar awijeet on 2/24/2016. thanks for Working!! */ public class GUI_Primitives { - - + public void drawLine(int x1, int y1, int x2, int y2, Graphics g) + { + Graphics2D g2 = (Graphics2D) g; + g.drawLine(x1,y1,x2,y2); + } + public void drawCurve(int x1, int y1, int x2, int y2, int ctrlx, int ctrly, Graphics g) + { + Graphics2D g2 = (Graphics2D) g; + QuadCurve2D q = new QuadCurve2D.Float(); + q.setCurve(x1, y1, ctrlx, ctrly, x2, y2); + g2.draw(q); + } + public void drawDoubleCrossRoad(int length, int width, int x,int y, int length2, int width2, int x1,int y1) + { + /* + The x and y give the coordinates of the start point of the first road, x1 y1 give the start point of the second road. + The start and end points are of the bottom line in case of first road and left line in case of second road. + The length and width are respective of the road they represent. + */ + int x2, x3, y2, y3; + x2 = x+length; + y2 = y+width; + /* + The first road coordinates are (x,y) (x2,y) (x,y2) (x2,y2) + Now we need to find the same for the second line. + */ + x3 = x1+width2; + y3 = y1+length2; + /* + The second road coordinates are (x1,y1) (x1,y3) (x3,y1) (x3,y3) + The next step is to find the coordinates of the intersection, the four center points. + */ + int d, xi,yi; + d = (x-x2)*(y1-y3)-(y-y)*(x1-x1); + xi = ((x1-x1)*(x*y-y*x2)-(x-x2)*(x1*y3-y1*x1))/d; + yi = ((y1-y3)*(x*y-y*x2)-(y-y)*(x1*y3-y1*x1))/d; + /* + Now we have got one intersection point so we can go ahead and draw the complete road. + */ + drawLine(xi,yi,x,y); + drawLine(xi,yi,x1,y3); + xi = xi+width2; + drawLine(xi,yi,x2,y); + drawLine(xi,yi,x3,y3); + yi= yi+width; + drawLine(xi,yi,x2,y2); + drawLine(xi,yi,x3,y1); + xi = xi-width2; + drawLine(xi,yi,x,y2); + drawLine(xi,yi,x1,y1); + } } From 62f860a1574016354ec6155c84b5060bbbd8b6f9 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sat, 27 Feb 2016 17:14:20 +0000 Subject: [PATCH 05/41] Graphics problem - resolved for now --- .../traffic/gui/GUI_Primitives.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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 index 6472033..b3074b9 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -18,7 +18,7 @@ public void drawCurve(int x1, int y1, int x2, int y2, int ctrlx, int ctrly, Grap q.setCurve(x1, y1, ctrlx, ctrly, x2, y2); g2.draw(q); } - public void drawDoubleCrossRoad(int length, int width, int x,int y, int length2, int width2, int x1,int y1) + public void drawDoubleCrossRoad(int length, int width, int x,int y, int length2, int width2, int x1,int y1, Graphics g) { /* The x and y give the coordinates of the start point of the first road, x1 y1 give the start point of the second road. @@ -45,16 +45,16 @@ The second road coordinates are (x1,y1) (x1,y3) (x3,y1) (x3,y3) /* Now we have got one intersection point so we can go ahead and draw the complete road. */ - drawLine(xi,yi,x,y); - drawLine(xi,yi,x1,y3); + drawLine(xi,yi,x,y,g); + drawLine(xi,yi,x1,y3,g); xi = xi+width2; - drawLine(xi,yi,x2,y); - drawLine(xi,yi,x3,y3); + drawLine(xi,yi,x2,y,g); + drawLine(xi,yi,x3,y3,g); yi= yi+width; - drawLine(xi,yi,x2,y2); - drawLine(xi,yi,x3,y1); + drawLine(xi,yi,x2,y2,g); + drawLine(xi,yi,x3,y1,g); xi = xi-width2; - drawLine(xi,yi,x,y2); - drawLine(xi,yi,x1,y1); + drawLine(xi,yi,x,y2,g); + drawLine(xi,yi,x1,y1,g); } } From 2958c5d4a3aaeb9c7229e9c9a774bf35330b9fe7 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sat, 27 Feb 2016 17:48:09 +0000 Subject: [PATCH 06/41] The roads are now capable of being at any angles in the double cross road. --- .../teamIndexZero/traffic/gui/GUI_Primitives.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) 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 index b3074b9..f59658f 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -47,13 +47,22 @@ The second road coordinates are (x1,y1) (x1,y3) (x3,y1) (x3,y3) */ drawLine(xi,yi,x,y,g); drawLine(xi,yi,x1,y3,g); - xi = xi+width2; + d = (x-x2)*(y1-y3)-(y-y)*(x3-x3); + xi = ((x3-x3)*(x*y-y*x2)-(x-x2)*(x3*y3-y1*x3))/d; + yi = ((y1-y3)*(x*y-y*x2)-(y-y)*(x3*y3-y1*x3))/d; + //xi = xi+width2; drawLine(xi,yi,x2,y,g); drawLine(xi,yi,x3,y3,g); - yi= yi+width; + d = (x-x2)*(y1-y3)-(y2-y2)*(x3-x3); + xi = ((x3-x3)*(x*y2-y2*x2)-(x-x2)*(x3*y3-y1*x3))/d; + yi = ((y1-y3)*(x*y2-y2*x2)-(y2-y2)*(x3*y3-y1*x3))/d; + //yi= yi+width; drawLine(xi,yi,x2,y2,g); drawLine(xi,yi,x3,y1,g); - xi = xi-width2; + d = (x-x2)*(y1-y3)-(y2-y2)*(x1-x1); + xi = ((x1-x1)*(x*y2-y2*x2)-(x-x2)*(x1*y3-y1*x1))/d; + yi = ((y1-y3)*(x*y2-y2*x2)-(y2-y2)*(x1*y3-y1*x1))/d; + //xi = xi-width2; drawLine(xi,yi,x,y2,g); drawLine(xi,yi,x1,y1,g); } From dfcdfcf8f6108df01902147dda91e8a97bc352ab Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sat, 27 Feb 2016 17:56:15 +0000 Subject: [PATCH 07/41] Simulation added for double cross road -doesn't work though --- .../kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java | 1 + 1 file changed, 1 insertion(+) 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 27bc1a6..3e84375 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -45,6 +45,7 @@ public SimulationImageProducer(SimulationMap map, BiConsumer { graphics.setColor(object.getColor()); From fdf8e75949ab72cd19ca3449ed0a6b328ecd4a63 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sat, 27 Feb 2016 17:58:58 +0000 Subject: [PATCH 08/41] Normal UML changes --- uml_diagrams/GUI.puml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/uml_diagrams/GUI.puml b/uml_diagrams/GUI.puml index de98aa0..fc72473 100644 --- a/uml_diagrams/GUI.puml +++ b/uml_diagrams/GUI.puml @@ -26,10 +26,9 @@ class SimulationImageProducer { } class Primitives { -+drawRoad(obj, pos, graphics) -+drawVehicle(obj, pos, graphics) -+drawSigns(obj, pos, graphics) -+drawMisc(obj, pos, graphics) ++drawLine(obj, pos, graphics) ++drawCurve(obj, pos, graphics) ++drawDoubleCrossRoad(obj, pos, graphics) } Simulator --> SimulationImageProducer: calls tick() From 85dfbca02ae47f85c8d59ea102ae3fdfb9fe91ea Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 2 Mar 2016 11:49:43 +0000 Subject: [PATCH 09/41] GUI for primitive roads --- .../java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java | 5 +++++ 1 file changed, 5 insertions(+) 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 index f59658f..c99a86b 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -18,6 +18,11 @@ public void drawCurve(int x1, int y1, int x2, int y2, int ctrlx, int ctrly, Grap q.setCurve(x1, y1, ctrlx, ctrly, x2, y2); g2.draw(q); } + public void drawSingleRoad (int x, int y, int x1, int y1, int x2, int y2, int x3, int y3, Graphics g) + { + drawLine(x,y,x1,y1,g); + drawLine(x2,y2,x3,y3,g); + } public void drawDoubleCrossRoad(int length, int width, int x,int y, int length2, int width2, int x1,int y1, Graphics g) { /* From e1ec5f25a6feff90d52fd5c8e12d1fc31a21fa4e Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 2 Mar 2016 14:16:27 +0000 Subject: [PATCH 10/41] GUI for primitive roads --- .../traffic/gui/GUI_Primitives.java | 24 +++++++++++++++++++ .../traffic/gui/SimulationImageProducer.java | 2 +- .../traffic/gui/SimulatorGui.java | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) 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 index c99a86b..68b9c68 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -1,6 +1,8 @@ package kcl.teamIndexZero.traffic.gui; import java.awt.*; import java.awt.geom.QuadCurve2D; +import java.math.*; +import java.lang.*; /** * Created by kumar awijeet on 2/24/2016. thanks for Working!! @@ -23,6 +25,28 @@ public void drawSingleRoad (int x, int y, int x1, int y1, int x2, int y2, int x3 drawLine(x,y,x1,y1,g); drawLine(x2,y2,x3,y3,g); } + public void drawSmallCar (int x3, int y3, double a, Graphics g) + { + /* + Assuming that b is the size of the car and this is splitting median of the design of the car in the ratio 2:1 + The shape of the car is a triangle. + */ + int b; + b = 10; + int c,d; + c = (int) (Math.sin(a)*b); + d = (int) (Math.cos(a)*b); + int x, y, x1, y1, x2, y2, e; + e = b+(b/2); + x = x3 + c; + y = y3 + d; + c = (int) (Math.sin(35)*e); + d = (int) (Math.cos(35)*e); + x1 = x + c; + y1 = y + d; + x2 = x - c; + x2 = x - d; + } public void drawDoubleCrossRoad(int length, int width, int x,int y, int length2, int width2, int x1,int y1, Graphics g) { /* 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 3e84375..26369ef 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -45,7 +45,7 @@ public SimulationImageProducer(SimulationMap map, BiConsumer { graphics.setColor(object.getColor()); 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 ee52ca9..9a43430 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulatorGui.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulatorGui.java @@ -46,7 +46,7 @@ public static void main(String[] args) { public SimulatorGui() { model = new GuiModel(); controller = new GuiController(model, () -> { - SimulationMap map = new SimulationMap(300, 6); + SimulationMap map = new SimulationMap(300, 300); SimulationImageProducer imageProducer = new SimulationImageProducer( map, (image, tick) -> { From cb706a25c079e35113ae4e731aeca358a31d449d Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 2 Mar 2016 14:24:16 +0000 Subject: [PATCH 11/41] GUI Primitives, works for a road and a car --- .../kcl/teamIndexZero/traffic/gui/GUI_Primitives.java | 10 ++++++++-- .../traffic/gui/SimulationImageProducer.java | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) 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 index 68b9c68..ade76ff 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -31,6 +31,7 @@ public void drawSmallCar (int x3, int y3, double a, Graphics g) Assuming that b is the size of the car and this is splitting median of the design of the car in the ratio 2:1 The shape of the car is a triangle. */ + g.setColor(Color.BLACK); int b; b = 10; int c,d; @@ -44,8 +45,13 @@ public void drawSmallCar (int x3, int y3, double a, Graphics g) d = (int) (Math.cos(35)*e); x1 = x + c; y1 = y + d; - x2 = x - c; - x2 = x - d; + c = (int) (Math.sin(5)*e); + d = (int) (Math.cos(5)*e); + x2 = x + c; + y2 = x + d; + drawLine(x,y,x1,y1,g); + drawLine(x1,y1,x2,y2,g); + drawLine(x2,y2,x,y,g); } public void drawDoubleCrossRoad(int length, int width, int x,int y, int length2, int width2, int x1,int y1, Graphics g) { 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 26369ef..438c9fc 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -45,8 +45,8 @@ public SimulationImageProducer(SimulationMap map, BiConsumer { graphics.setColor(object.getColor()); MapPosition pos = object.getPosition(); From e6b276c790fe6f119206aa7cb967bbb9d83476bc Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 2 Mar 2016 14:33:23 +0000 Subject: [PATCH 12/41] GUI Primitives, Minor design changes --- .../kcl/teamIndexZero/traffic/gui/GUI_Primitives.java | 8 ++++---- .../traffic/gui/SimulationImageProducer.java | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) 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 index ade76ff..479f4f4 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -41,12 +41,12 @@ public void drawSmallCar (int x3, int y3, double a, Graphics g) e = b+(b/2); x = x3 + c; y = y3 + d; - c = (int) (Math.sin(35)*e); - d = (int) (Math.cos(35)*e); + c = (int) (Math.sin(40)*e); + d = (int) (Math.cos(40)*e); x1 = x + c; y1 = y + d; - c = (int) (Math.sin(5)*e); - d = (int) (Math.cos(5)*e); + c = (int) (Math.sin(40)*e); + d = (int) (Math.cos(40)*e); x2 = x + c; y2 = x + d; drawLine(x,y,x1,y1,g); 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 438c9fc..7ac3652 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -46,6 +46,8 @@ public void tick(SimulationTick tick) { graphics.setBackground(Color.WHITE); graphics.clearRect(0, 0, image.getWidth(), image.getHeight()); new GUI_Primitives().drawSmallCar(50,50,30,graphics); + //new GUI_Primitives().drawSmallCar(60,60,30,graphics); + //new GUI_Primitives().drawSmallCar(70,70,0,graphics); new GUI_Primitives().drawSingleRoad(50,25,35,35,52,64,78,45,graphics); map.getObjectsOnMap().forEach(object -> { graphics.setColor(object.getColor()); From c48f7b9b1dde13e689adcc0f9e4ff333fd1425c7 Mon Sep 17 00:00:00 2001 From: Oleksandr Cherednychenko Date: Wed, 2 Mar 2016 15:59:39 +0000 Subject: [PATCH 13/41] Removed actual car painting code (no need for it now). Renamed angle to X. Made angle change all the time. --- .../traffic/gui/GUI_Primitives.java | 100 +++++++++--------- .../traffic/gui/SimulationImageProducer.java | 28 ++--- .../traffic/gui/components/MapPanel.java | 4 +- 3 files changed, 66 insertions(+), 66 deletions(-) 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 index 479f4f4..c65ad92 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -1,32 +1,30 @@ package kcl.teamIndexZero.traffic.gui; + import java.awt.*; import java.awt.geom.QuadCurve2D; -import java.math.*; -import java.lang.*; /** * Created by kumar awijeet on 2/24/2016. thanks for Working!! */ public class GUI_Primitives { - public void drawLine(int x1, int y1, int x2, int y2, Graphics g) - { + public void drawLine(int x1, int y1, int x2, int y2, Graphics g) { Graphics2D g2 = (Graphics2D) g; - g.drawLine(x1,y1,x2,y2); + g.drawLine(x1, y1, x2, y2); } - public void drawCurve(int x1, int y1, int x2, int y2, int ctrlx, int ctrly, Graphics g) - { + + public void drawCurve(int x1, int y1, int x2, int y2, int ctrlx, int ctrly, Graphics g) { Graphics2D g2 = (Graphics2D) g; QuadCurve2D q = new QuadCurve2D.Float(); q.setCurve(x1, y1, ctrlx, ctrly, x2, y2); g2.draw(q); } - public void drawSingleRoad (int x, int y, int x1, int y1, int x2, int y2, int x3, int y3, Graphics g) - { - drawLine(x,y,x1,y1,g); - drawLine(x2,y2,x3,y3,g); + + public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3, Graphics g) { + drawLine(x, y, x1, y1, g); + drawLine(x2, y2, x3, y3, g); } - public void drawSmallCar (int x3, int y3, double a, Graphics g) - { + + public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) { /* Assuming that b is the size of the car and this is splitting median of the design of the car in the ratio 2:1 The shape of the car is a triangle. @@ -34,71 +32,71 @@ public void drawSmallCar (int x3, int y3, double a, Graphics g) g.setColor(Color.BLACK); int b; b = 10; - int c,d; - c = (int) (Math.sin(a)*b); - d = (int) (Math.cos(a)*b); + int c, d; + c = (int) (Math.sin(angleToXAxis) * b); + d = (int) (Math.cos(angleToXAxis) * b); int x, y, x1, y1, x2, y2, e; - e = b+(b/2); + e = b + (b / 2); x = x3 + c; y = y3 + d; - c = (int) (Math.sin(40)*e); - d = (int) (Math.cos(40)*e); + c = (int) (Math.sin(40) * e); + d = (int) (Math.cos(40) * e); x1 = x + c; y1 = y + d; - c = (int) (Math.sin(40)*e); - d = (int) (Math.cos(40)*e); + c = (int) (Math.sin(40) * e); + d = (int) (Math.cos(40) * e); x2 = x + c; y2 = x + d; - drawLine(x,y,x1,y1,g); - drawLine(x1,y1,x2,y2,g); - drawLine(x2,y2,x,y,g); + drawLine(x, y, x1, y1, g); + drawLine(x1, y1, x2, y2, g); + drawLine(x2, y2, x, y, g); } - public void drawDoubleCrossRoad(int length, int width, int x,int y, int length2, int width2, int x1,int y1, Graphics g) - { + + public void drawDoubleCrossRoad(int length, int width, int x, int y, int length2, int width2, int x1, int y1, Graphics g) { /* The x and y give the coordinates of the start point of the first road, x1 y1 give the start point of the second road. The start and end points are of the bottom line in case of first road and left line in case of second road. The length and width are respective of the road they represent. */ int x2, x3, y2, y3; - x2 = x+length; - y2 = y+width; + x2 = x + length; + y2 = y + width; /* The first road coordinates are (x,y) (x2,y) (x,y2) (x2,y2) Now we need to find the same for the second line. */ - x3 = x1+width2; - y3 = y1+length2; + x3 = x1 + width2; + y3 = y1 + length2; /* The second road coordinates are (x1,y1) (x1,y3) (x3,y1) (x3,y3) The next step is to find the coordinates of the intersection, the four center points. */ - int d, xi,yi; - d = (x-x2)*(y1-y3)-(y-y)*(x1-x1); - xi = ((x1-x1)*(x*y-y*x2)-(x-x2)*(x1*y3-y1*x1))/d; - yi = ((y1-y3)*(x*y-y*x2)-(y-y)*(x1*y3-y1*x1))/d; + int d, xi, yi; + d = (x - x2) * (y1 - y3) - (y - y) * (x1 - x1); + xi = ((x1 - x1) * (x * y - y * x2) - (x - x2) * (x1 * y3 - y1 * x1)) / d; + yi = ((y1 - y3) * (x * y - y * x2) - (y - y) * (x1 * y3 - y1 * x1)) / d; /* Now we have got one intersection point so we can go ahead and draw the complete road. */ - drawLine(xi,yi,x,y,g); - drawLine(xi,yi,x1,y3,g); - d = (x-x2)*(y1-y3)-(y-y)*(x3-x3); - xi = ((x3-x3)*(x*y-y*x2)-(x-x2)*(x3*y3-y1*x3))/d; - yi = ((y1-y3)*(x*y-y*x2)-(y-y)*(x3*y3-y1*x3))/d; + drawLine(xi, yi, x, y, g); + drawLine(xi, yi, x1, y3, g); + d = (x - x2) * (y1 - y3) - (y - y) * (x3 - x3); + xi = ((x3 - x3) * (x * y - y * x2) - (x - x2) * (x3 * y3 - y1 * x3)) / d; + yi = ((y1 - y3) * (x * y - y * x2) - (y - y) * (x3 * y3 - y1 * x3)) / d; //xi = xi+width2; - drawLine(xi,yi,x2,y,g); - drawLine(xi,yi,x3,y3,g); - d = (x-x2)*(y1-y3)-(y2-y2)*(x3-x3); - xi = ((x3-x3)*(x*y2-y2*x2)-(x-x2)*(x3*y3-y1*x3))/d; - yi = ((y1-y3)*(x*y2-y2*x2)-(y2-y2)*(x3*y3-y1*x3))/d; + drawLine(xi, yi, x2, y, g); + drawLine(xi, yi, x3, y3, g); + d = (x - x2) * (y1 - y3) - (y2 - y2) * (x3 - x3); + xi = ((x3 - x3) * (x * y2 - y2 * x2) - (x - x2) * (x3 * y3 - y1 * x3)) / d; + yi = ((y1 - y3) * (x * y2 - y2 * x2) - (y2 - y2) * (x3 * y3 - y1 * x3)) / d; //yi= yi+width; - drawLine(xi,yi,x2,y2,g); - drawLine(xi,yi,x3,y1,g); - d = (x-x2)*(y1-y3)-(y2-y2)*(x1-x1); - xi = ((x1-x1)*(x*y2-y2*x2)-(x-x2)*(x1*y3-y1*x1))/d; - yi = ((y1-y3)*(x*y2-y2*x2)-(y2-y2)*(x1*y3-y1*x1))/d; + drawLine(xi, yi, x2, y2, g); + drawLine(xi, yi, x3, y1, g); + d = (x - x2) * (y1 - y3) - (y2 - y2) * (x1 - x1); + xi = ((x1 - x1) * (x * y2 - y2 * x2) - (x - x2) * (x1 * y3 - y1 * x1)) / d; + yi = ((y1 - y3) * (x * y2 - y2 * x2) - (y2 - y2) * (x1 * y3 - y1 * x1)) / d; //xi = xi-width2; - drawLine(xi,yi,x,y2,g); - drawLine(xi,yi,x1,y1,g); + drawLine(xi, yi, x, y2, g); + drawLine(xi, yi, x1, y1, g); } } 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 7ac3652..2141a7e 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -3,7 +3,6 @@ import kcl.teamIndexZero.traffic.log.Logger; import kcl.teamIndexZero.traffic.log.Logger_Interface; import kcl.teamIndexZero.traffic.simulator.ISimulationAware; -import kcl.teamIndexZero.traffic.simulator.data.MapPosition; import kcl.teamIndexZero.traffic.simulator.data.SimulationMap; import kcl.teamIndexZero.traffic.simulator.data.SimulationTick; @@ -38,27 +37,30 @@ public SimulationImageProducer(SimulationMap map, BiConsumer { - graphics.setColor(object.getColor()); - MapPosition pos = object.getPosition(); - graphics.fillRect( - pos.x, - pos.y, - pos.width, - pos.height - ); - }); + new GUI_Primitives().drawSingleRoad(50, 25, 35, 35, 52, 64, 78, 45, graphics); +// map.getObjectsOnMap().forEach(object -> { +// graphics.setColor(object.getColor()); +// MapPosition pos = object.getPosition(); +// graphics.fillRect( +// pos.x, +// pos.y, +// pos.width, +// pos.height +// ); +// }); imageConsumer.accept(image, tick); } diff --git a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/components/MapPanel.java b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/components/MapPanel.java index 5087375..e60babf 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/components/MapPanel.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/components/MapPanel.java @@ -43,8 +43,8 @@ public void paint(Graphics g) { model.getLastImage(), 100, 20, - model.getLastImage().getWidth() * 2, - model.getLastImage().getHeight() * 2, + model.getLastImage().getWidth(), + model.getLastImage().getHeight(), null); } } From 07aa8fc8e5b85d0f201e8f6a436350f2b1765506 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 2 Mar 2016 16:19:09 +0000 Subject: [PATCH 14/41] Normal UML changes --- .../teamIndexZero/traffic/gui/GUI_Primitives.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) 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 index c65ad92..24b9f3c 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -39,17 +39,18 @@ public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) { e = b + (b / 2); x = x3 + c; y = y3 + d; - c = (int) (Math.sin(40) * e); - d = (int) (Math.cos(40) * e); + c = (int) (Math.sin(30) * e); + d = (int) (Math.cos(30) * e); x1 = x + c; y1 = y + d; - c = (int) (Math.sin(40) * e); - d = (int) (Math.cos(40) * e); + c = (int) (Math.sin(30) * e); + d = (int) (Math.cos(30) * e); x2 = x + c; y2 = x + d; - drawLine(x, y, x1, y1, g); - drawLine(x1, y1, x2, y2, g); - drawLine(x2, y2, x, y, g); + g.drawPolygon(new int[] {x, x1, x2}, new int[] {y, y1, y2}, 3); + //drawLine(x, y, x1, y1, g); + //drawLine(x1, y1, x2, y2, g); + //drawLine(x2, y2, x, y, g); } public void drawDoubleCrossRoad(int length, int width, int x, int y, int length2, int width2, int x1, int y1, Graphics g) { From 0e173f6c4465a5ed85e25ab83bd6c669beedecbb Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 2 Mar 2016 19:21:09 +0000 Subject: [PATCH 15/41] GUI Primitives - rotation --- .../traffic/gui/GUI_Primitives.java | 44 ++++++++----------- .../traffic/gui/SimulationImageProducer.java | 6 +-- 2 files changed, 21 insertions(+), 29 deletions(-) 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 index 24b9f3c..a51085c 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -1,6 +1,7 @@ package kcl.teamIndexZero.traffic.gui; import java.awt.*; +import java.awt.geom.AffineTransform; import java.awt.geom.QuadCurve2D; /** @@ -24,33 +25,26 @@ public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, drawLine(x2, y2, x3, y3, g); } - public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) { - /* - Assuming that b is the size of the car and this is splitting median of the design of the car in the ratio 2:1 - The shape of the car is a triangle. - */ + public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) + { + //g.drawPolygon(new int[] {0, 50, 25}, new int[] {0, 0, 50}, 3); g.setColor(Color.BLACK); - int b; + int b, c, d, x, y, x1, y1, x2, y2, e,f,i,j,k,l; b = 10; - int c, d; - c = (int) (Math.sin(angleToXAxis) * b); - d = (int) (Math.cos(angleToXAxis) * b); - int x, y, x1, y1, x2, y2, e; - e = b + (b / 2); - x = x3 + c; - y = y3 + d; - c = (int) (Math.sin(30) * e); - d = (int) (Math.cos(30) * e); - x1 = x + c; - y1 = y + d; - c = (int) (Math.sin(30) * e); - d = (int) (Math.cos(30) * e); - x2 = x + c; - y2 = x + d; - g.drawPolygon(new int[] {x, x1, x2}, new int[] {y, y1, y2}, 3); - //drawLine(x, y, x1, y1, g); - //drawLine(x1, y1, x2, y2, g); - //drawLine(x2, y2, x, y, g); + x = b; + y= y3+b; + x1 = x3; + y1 = y3; + x2 = b+x3; + y2 = b; + Graphics2D h = (Graphics2D) g; + AffineTransform at = new AffineTransform(); + //at.rotate(angleToXAxis,(x+x1+x2)/3,(y+y1+y2)/3); + //this is rotation with reference to middle of the car, the one below is rotation with reference to + //the front of the car. + at.rotate(angleToXAxis,x1,y1); + h.setTransform(at); + g.drawPolygon(new int[] {x , x1, x2}, new int[] {y , y1 , y2}, 3); } public void drawDoubleCrossRoad(int length, int width, int x, int y, int length2, int width2, int x1, int y1, Graphics g) { 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 2141a7e..2dfc17d 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -47,10 +47,8 @@ public void tick(SimulationTick tick) { alpha += 0.1; graphics.setBackground(Color.WHITE); graphics.clearRect(0, 0, image.getWidth(), image.getHeight()); - new GUI_Primitives().drawSmallCar(50, 50, alpha, graphics); - //new GUI_Primitives().drawSmallCar(60,60,30,graphics); - //new GUI_Primitives().drawSmallCar(70,70,0,graphics); - new GUI_Primitives().drawSingleRoad(50, 25, 35, 35, 52, 64, 78, 45, graphics); + new GUI_Primitives().drawSmallCar(70,70,alpha,graphics); + //new GUI_Primitives().drawSingleRoad(50, 25, 35, 35, 52, 64, 78, 45, graphics); // map.getObjectsOnMap().forEach(object -> { // graphics.setColor(object.getColor()); // MapPosition pos = object.getPosition(); From b00e90fd6983517538ecd6f451a061acce60aa8c Mon Sep 17 00:00:00 2001 From: Oleksandr Cherednychenko Date: Wed, 2 Mar 2016 20:38:10 +0000 Subject: [PATCH 16/41] Returned the actual road drwaing code to see affine transform changes. --- .../kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 2dfc17d..a542f9b 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -48,7 +48,8 @@ public void tick(SimulationTick tick) { graphics.setBackground(Color.WHITE); graphics.clearRect(0, 0, image.getWidth(), image.getHeight()); new GUI_Primitives().drawSmallCar(70,70,alpha,graphics); - //new GUI_Primitives().drawSingleRoad(50, 25, 35, 35, 52, 64, 78, 45, graphics); +// new GUI_Primitives().drawSmallCar(70,70,alpha,graphics); + new GUI_Primitives().drawSingleRoad(10, 10, 200, 10, 10, 50, 200, 50, graphics); // map.getObjectsOnMap().forEach(object -> { // graphics.setColor(object.getColor()); // MapPosition pos = object.getPosition(); From 770cb766518c1d90160fa2184ef05215c45cf2e7 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 2 Mar 2016 21:56:49 +0000 Subject: [PATCH 17/41] GUI Primitives - rotation --- .../traffic/gui/GUI_Primitives.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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 index a51085c..d20c028 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -29,22 +29,26 @@ public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) { //g.drawPolygon(new int[] {0, 50, 25}, new int[] {0, 0, 50}, 3); g.setColor(Color.BLACK); - int b, c, d, x, y, x1, y1, x2, y2, e,f,i,j,k,l; - b = 10; + int b, x, y, x1, y1, x2, y2; + b = 0; x = b; - y= y3+b; + y= b+x3; x1 = x3; - y1 = y3; + y1 = x3; x2 = b+x3; y2 = b; + AffineTransform c; Graphics2D h = (Graphics2D) g; + c = h.getTransform(); AffineTransform at = new AffineTransform(); - //at.rotate(angleToXAxis,(x+x1+x2)/3,(y+y1+y2)/3); + at.rotate(angleToXAxis,(x+x1+x2)/3,(y+y1+y2)/3); //this is rotation with reference to middle of the car, the one below is rotation with reference to //the front of the car. - at.rotate(angleToXAxis,x1,y1); + //at.rotate(angleToXAxis,x1,y1); h.setTransform(at); + //at.translate(x3,y3); g.drawPolygon(new int[] {x , x1, x2}, new int[] {y , y1 , y2}, 3); + h.setTransform(c); } public void drawDoubleCrossRoad(int length, int width, int x, int y, int length2, int width2, int x1, int y1, Graphics g) { From 06a7ad3cb85ce8f62f119899c7ba3c177acbc7ca Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Thu, 3 Mar 2016 00:46:53 +0000 Subject: [PATCH 18/41] Changed the car drawing with an image. Much better now, easy to control etc... --- .../traffic/gui/GUI_Primitives.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) 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 index d20c028..6f471ca 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -1,5 +1,6 @@ package kcl.teamIndexZero.traffic.gui; +import javax.swing.*; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.QuadCurve2D; @@ -27,27 +28,17 @@ public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) { - //g.drawPolygon(new int[] {0, 50, 25}, new int[] {0, 0, 50}, 3); - g.setColor(Color.BLACK); - int b, x, y, x1, y1, x2, y2; - b = 0; - x = b; - y= b+x3; - x1 = x3; - y1 = x3; - x2 = b+x3; - y2 = b; + g.setColor(Color.black); AffineTransform c; Graphics2D h = (Graphics2D) g; c = h.getTransform(); AffineTransform at = new AffineTransform(); - at.rotate(angleToXAxis,(x+x1+x2)/3,(y+y1+y2)/3); - //this is rotation with reference to middle of the car, the one below is rotation with reference to - //the front of the car. - //at.rotate(angleToXAxis,x1,y1); + at.rotate(angleToXAxis,x3,y3); h.setTransform(at); - //at.translate(x3,y3); - g.drawPolygon(new int[] {x , x1, x2}, new int[] {y , y1 , y2}, 3); + Image img = null; + img = new ImageIcon("C:/Users/kumarawijeet/OneDrive/MSc/Group Project/bmw_z_top_view_clip_art_18132.jpg").getImage(); + // file taken from http://all-free-download.com/free-vector/car-vector-top-view-download.html + h.drawImage(img,x3-18,y3-18,40,40,null); h.setTransform(c); } From 6b09ddc6647f6d6b4ef80566003f7b0fb0454993 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Wed, 16 Mar 2016 16:27:38 +0000 Subject: [PATCH 19/41] Pushing for updating new maps --- .../java/kcl/teamIndexZero/traffic/log/FileIO/FileInput.java | 3 ++- .../main/java/kcl/teamIndexZero/traffic/log/Log_Config.java | 2 +- .../kcl/teamIndexZero/traffic/log/fileIO/FileInputTest.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) 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 16d1cb5..38ad4c0 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/main/java/kcl/teamIndexZero/traffic/log/Log_Config.java b/log/src/main/java/kcl/teamIndexZero/traffic/log/Log_Config.java index a134cb8..6ac18fa 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/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"); From ae0f24cdd889b929393bc9a2f5a7bee536ce5999 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sun, 20 Mar 2016 11:13:11 +0000 Subject: [PATCH 20/41] One car added, hopefully no need to replicate pictures files for smooth running --- .../traffic/gui/GUI_Primitives.java | 17 ++++++- .../traffic/gui/GUI_PrimitivesTest.java | 48 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 gui/src/test/java/kcl/teamIndexZero/traffic/gui/GUI_PrimitivesTest.java 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 index 6f471ca..61dcab1 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -1,9 +1,13 @@ package kcl.teamIndexZero.traffic.gui; +import com.sun.org.apache.xml.internal.resolver.helpers.PublicId; + +import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.QuadCurve2D; +import java.io.*; /** * Created by kumar awijeet on 2/24/2016. thanks for Working!! @@ -36,8 +40,17 @@ public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) at.rotate(angleToXAxis,x3,y3); h.setTransform(at); Image img = null; - img = new ImageIcon("C:/Users/kumarawijeet/OneDrive/MSc/Group Project/bmw_z_top_view_clip_art_18132.jpg").getImage(); - // file taken from http://all-free-download.com/free-vector/car-vector-top-view-download.html + InputStream i = null; + try { + i = new BufferedInputStream(new FileInputStream("gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + try { + img = ImageIO.read(i); + } catch (IOException e) { + e.printStackTrace(); + } h.drawImage(img,x3-18,y3-18,40,40,null); h.setTransform(c); } diff --git a/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GUI_PrimitivesTest.java b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GUI_PrimitivesTest.java new file mode 100644 index 0000000..168d8ba --- /dev/null +++ b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GUI_PrimitivesTest.java @@ -0,0 +1,48 @@ +package kcl.teamIndexZero.traffic.gui; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by kumarawijeet on 3/16/2016. + */ +public class GUI_PrimitivesTest { + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testDrawLine() throws Exception { + + } + + @Test + public void testDrawCurve() throws Exception { + + } + + @Test + public void testDrawSingleRoad() throws Exception { + + } + + @Test + public void testDrawSmallCar() throws Exception { + + } + + @Test + public void testDrawDoubleCrossRoad() throws Exception { + + } +} \ No newline at end of file From dc510e2e62eadbbd98cbe138808436f0e4203e26 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sun, 20 Mar 2016 11:27:21 +0000 Subject: [PATCH 21/41] Small small fixes. --- .../traffic/gui/GUI_Primitives.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) 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 index 61dcab1..db2b754 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -47,6 +47,7 @@ public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) e.printStackTrace(); } try { + assert i != null; img = ImageIO.read(i); } catch (IOException e) { e.printStackTrace(); @@ -55,51 +56,57 @@ public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) h.setTransform(c); } - public void drawDoubleCrossRoad(int length, int width, int x, int y, int length2, int width2, int x1, int y1, Graphics g) { + /*public void drawDoubleCrossRoad(int length, int width, int x, int y, int length2, int width2, int x1, int y1, Graphics g) { /* The x and y give the coordinates of the start point of the first road, x1 y1 give the start point of the second road. The start and end points are of the bottom line in case of first road and left line in case of second road. The length and width are respective of the road they represent. */ - int x2, x3, y2, y3; + /*int x2, x3, y2, y3; x2 = x + length; y2 = y + width; /* The first road coordinates are (x,y) (x2,y) (x,y2) (x2,y2) Now we need to find the same for the second line. */ + /* x3 = x1 + width2; y3 = y1 + length2; + */ /* The second road coordinates are (x1,y1) (x1,y3) (x3,y1) (x3,y3) The next step is to find the coordinates of the intersection, the four center points. */ + /* int d, xi, yi; d = (x - x2) * (y1 - y3) - (y - y) * (x1 - x1); xi = ((x1 - x1) * (x * y - y * x2) - (x - x2) * (x1 * y3 - y1 * x1)) / d; yi = ((y1 - y3) * (x * y - y * x2) - (y - y) * (x1 * y3 - y1 * x1)) / d; + */ /* Now we have got one intersection point so we can go ahead and draw the complete road. */ + /* drawLine(xi, yi, x, y, g); drawLine(xi, yi, x1, y3, g); d = (x - x2) * (y1 - y3) - (y - y) * (x3 - x3); xi = ((x3 - x3) * (x * y - y * x2) - (x - x2) * (x3 * y3 - y1 * x3)) / d; yi = ((y1 - y3) * (x * y - y * x2) - (y - y) * (x3 * y3 - y1 * x3)) / d; - //xi = xi+width2; + xi = xi+width2; drawLine(xi, yi, x2, y, g); drawLine(xi, yi, x3, y3, g); d = (x - x2) * (y1 - y3) - (y2 - y2) * (x3 - x3); xi = ((x3 - x3) * (x * y2 - y2 * x2) - (x - x2) * (x3 * y3 - y1 * x3)) / d; yi = ((y1 - y3) * (x * y2 - y2 * x2) - (y2 - y2) * (x3 * y3 - y1 * x3)) / d; - //yi= yi+width; + yi= yi+width; drawLine(xi, yi, x2, y2, g); drawLine(xi, yi, x3, y1, g); d = (x - x2) * (y1 - y3) - (y2 - y2) * (x1 - x1); xi = ((x1 - x1) * (x * y2 - y2 * x2) - (x - x2) * (x1 * y3 - y1 * x1)) / d; yi = ((y1 - y3) * (x * y2 - y2 * x2) - (y2 - y2) * (x1 * y3 - y1 * x1)) / d; - //xi = xi-width2; + xi = xi-width2; drawLine(xi, yi, x, y2, g); drawLine(xi, yi, x1, y1, g); - } + } + */ } From 26775ec5806d615151362d008cb0925eea004044 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sun, 20 Mar 2016 12:14:27 +0000 Subject: [PATCH 22/41] Truck added. --- .../traffic/gui/GUI_Primitives.java | 28 ++++++++++++++++++- .../traffic/gui/SimulationImageProducer.java | 1 + 2 files changed, 28 insertions(+), 1 deletion(-) 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 index db2b754..7f5f145 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -29,9 +29,35 @@ public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, drawLine(x, y, x1, y1, g); drawLine(x2, y2, x3, y3, g); } - + public void drawTruck(int x3, int y3, double angleToXAxis, Graphics g) + { + //files taken from http://hdimagelib.com/trailer+truck+top+view + g.setColor(Color.black); + AffineTransform c; + Graphics2D h = (Graphics2D) g; + c = h.getTransform(); + AffineTransform at = new AffineTransform(); + at.rotate(angleToXAxis,x3,y3); + h.setTransform(at); + Image img = null; + InputStream i = null; + try { + i = new BufferedInputStream(new FileInputStream("gui/src/main/resources/sprites/8460_st0640_117.jpg")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + try { + assert i != null; + img = ImageIO.read(i); + } catch (IOException e) { + e.printStackTrace(); + } + h.drawImage(img,x3-18,y3-18,40,40,null); + h.setTransform(c); + } public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) { + // file taken from http://all-free-download.com/free-vector/car-vector-top-view-download.html g.setColor(Color.black); AffineTransform c; Graphics2D h = (Graphics2D) g; 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 a542f9b..95b72d2 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -50,6 +50,7 @@ public void tick(SimulationTick tick) { new GUI_Primitives().drawSmallCar(70,70,alpha,graphics); // new GUI_Primitives().drawSmallCar(70,70,alpha,graphics); new GUI_Primitives().drawSingleRoad(10, 10, 200, 10, 10, 50, 200, 50, graphics); + new GUI_Primitives().drawTruck(50,50,alpha,graphics); // map.getObjectsOnMap().forEach(object -> { // graphics.setColor(object.getColor()); // MapPosition pos = object.getPosition(); From 13ef310dd386717f117cd6e5fa3949bbdd69f67e Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 21 Mar 2016 08:03:21 +0000 Subject: [PATCH 23/41] Few minor changes as commented by others in the oull request. The car is added using a new parameter and only using one method call, default case are not added yet, will add them latter. The comented code is deleted and no longer an issue. Deleted the test file as it was doing nothing so why have it there. Due to change in functions of drawing the car, there is a small change in the calling of them too. That's why change in SimulationImageProducer. It now needs to pass a new argument that selects the car, an integer value. Will be concentrating on other issues latter. --- .../traffic/gui/GUI_Primitives.java | 127 +++++------------- .../traffic/gui/SimulationImageProducer.java | 4 +- .../traffic/gui/GUI_PrimitivesTest.java | 48 ------- 3 files changed, 35 insertions(+), 144 deletions(-) delete mode 100644 gui/src/test/java/kcl/teamIndexZero/traffic/gui/GUI_PrimitivesTest.java 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 index 7f5f145..642a1aa 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -29,33 +29,7 @@ public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, drawLine(x, y, x1, y1, g); drawLine(x2, y2, x3, y3, g); } - public void drawTruck(int x3, int y3, double angleToXAxis, Graphics g) - { - //files taken from http://hdimagelib.com/trailer+truck+top+view - g.setColor(Color.black); - AffineTransform c; - Graphics2D h = (Graphics2D) g; - c = h.getTransform(); - AffineTransform at = new AffineTransform(); - at.rotate(angleToXAxis,x3,y3); - h.setTransform(at); - Image img = null; - InputStream i = null; - try { - i = new BufferedInputStream(new FileInputStream("gui/src/main/resources/sprites/8460_st0640_117.jpg")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - try { - assert i != null; - img = ImageIO.read(i); - } catch (IOException e) { - e.printStackTrace(); - } - h.drawImage(img,x3-18,y3-18,40,40,null); - h.setTransform(c); - } - public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) + public void drawCar(int x3, int y3, double angleToXAxis, int choice, Graphics g) { // file taken from http://all-free-download.com/free-vector/car-vector-top-view-download.html g.setColor(Color.black); @@ -67,72 +41,39 @@ public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) h.setTransform(at); Image img = null; InputStream i = null; - try { - i = new BufferedInputStream(new FileInputStream("gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - try { - assert i != null; - img = ImageIO.read(i); - } catch (IOException e) { - e.printStackTrace(); + switch(choice) + { + case 1: + try { + i = new BufferedInputStream(new FileInputStream("gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + try { + assert i != null; + img = ImageIO.read(i); + } catch (IOException e) { + e.printStackTrace(); + } + h.drawImage(img,x3-18,y3-18,40,40,null); + h.setTransform(c); + break; + case 2: + try { + i = new BufferedInputStream(new FileInputStream("gui/src/main/resources/sprites/8460_st0640_117.jpg")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + try { + assert i != null; + img = ImageIO.read(i); + } catch (IOException e) { + e.printStackTrace(); + } + h.drawImage(img,x3-18,y3-18,40,40,null); + h.setTransform(c); } - h.drawImage(img,x3-18,y3-18,40,40,null); - h.setTransform(c); - } - /*public void drawDoubleCrossRoad(int length, int width, int x, int y, int length2, int width2, int x1, int y1, Graphics g) { - /* - The x and y give the coordinates of the start point of the first road, x1 y1 give the start point of the second road. - The start and end points are of the bottom line in case of first road and left line in case of second road. - The length and width are respective of the road they represent. - */ - /*int x2, x3, y2, y3; - x2 = x + length; - y2 = y + width; - /* - The first road coordinates are (x,y) (x2,y) (x,y2) (x2,y2) - Now we need to find the same for the second line. - */ - /* - x3 = x1 + width2; - y3 = y1 + length2; - */ - /* - The second road coordinates are (x1,y1) (x1,y3) (x3,y1) (x3,y3) - The next step is to find the coordinates of the intersection, the four center points. - */ - /* - int d, xi, yi; - d = (x - x2) * (y1 - y3) - (y - y) * (x1 - x1); - xi = ((x1 - x1) * (x * y - y * x2) - (x - x2) * (x1 * y3 - y1 * x1)) / d; - yi = ((y1 - y3) * (x * y - y * x2) - (y - y) * (x1 * y3 - y1 * x1)) / d; - */ - /* - Now we have got one intersection point so we can go ahead and draw the complete road. - */ - /* - drawLine(xi, yi, x, y, g); - drawLine(xi, yi, x1, y3, g); - d = (x - x2) * (y1 - y3) - (y - y) * (x3 - x3); - xi = ((x3 - x3) * (x * y - y * x2) - (x - x2) * (x3 * y3 - y1 * x3)) / d; - yi = ((y1 - y3) * (x * y - y * x2) - (y - y) * (x3 * y3 - y1 * x3)) / d; - xi = xi+width2; - drawLine(xi, yi, x2, y, g); - drawLine(xi, yi, x3, y3, g); - d = (x - x2) * (y1 - y3) - (y2 - y2) * (x3 - x3); - xi = ((x3 - x3) * (x * y2 - y2 * x2) - (x - x2) * (x3 * y3 - y1 * x3)) / d; - yi = ((y1 - y3) * (x * y2 - y2 * x2) - (y2 - y2) * (x3 * y3 - y1 * x3)) / d; - yi= yi+width; - drawLine(xi, yi, x2, y2, g); - drawLine(xi, yi, x3, y1, g); - d = (x - x2) * (y1 - y3) - (y2 - y2) * (x1 - x1); - xi = ((x1 - x1) * (x * y2 - y2 * x2) - (x - x2) * (x1 * y3 - y1 * x1)) / d; - yi = ((y1 - y3) * (x * y2 - y2 * x2) - (y2 - y2) * (x1 * y3 - y1 * x1)) / d; - xi = xi-width2; - drawLine(xi, yi, x, y2, g); - drawLine(xi, yi, x1, y1, g); - } - */ + + } } 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 95b72d2..1782204 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -47,10 +47,8 @@ public void tick(SimulationTick tick) { alpha += 0.1; graphics.setBackground(Color.WHITE); graphics.clearRect(0, 0, image.getWidth(), image.getHeight()); - new GUI_Primitives().drawSmallCar(70,70,alpha,graphics); -// new GUI_Primitives().drawSmallCar(70,70,alpha,graphics); + new GUI_Primitives().drawCar(70,70,alpha,1,graphics); new GUI_Primitives().drawSingleRoad(10, 10, 200, 10, 10, 50, 200, 50, graphics); - new GUI_Primitives().drawTruck(50,50,alpha,graphics); // map.getObjectsOnMap().forEach(object -> { // graphics.setColor(object.getColor()); // MapPosition pos = object.getPosition(); diff --git a/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GUI_PrimitivesTest.java b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GUI_PrimitivesTest.java deleted file mode 100644 index 168d8ba..0000000 --- a/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GUI_PrimitivesTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package kcl.teamIndexZero.traffic.gui; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by kumarawijeet on 3/16/2016. - */ -public class GUI_PrimitivesTest { - - @Before - public void setUp() throws Exception { - - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void testDrawLine() throws Exception { - - } - - @Test - public void testDrawCurve() throws Exception { - - } - - @Test - public void testDrawSingleRoad() throws Exception { - - } - - @Test - public void testDrawSmallCar() throws Exception { - - } - - @Test - public void testDrawDoubleCrossRoad() throws Exception { - - } -} \ No newline at end of file From 34ce0d8d02c1f3db643ff1569d4bc28e8e0c430a Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 21 Mar 2016 09:20:48 +0000 Subject: [PATCH 24/41] Minor changes only. Removed the color change to black, so now the primitive doesn't decide the color of graphics. The pictures should push but don't know why it's not happening. Any help on this will be great! --- .../java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java | 4 ---- 1 file changed, 4 deletions(-) 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 index 642a1aa..08c6bde 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -1,9 +1,6 @@ package kcl.teamIndexZero.traffic.gui; -import com.sun.org.apache.xml.internal.resolver.helpers.PublicId; - import javax.imageio.ImageIO; -import javax.swing.*; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.QuadCurve2D; @@ -32,7 +29,6 @@ public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, public void drawCar(int x3, int y3, double angleToXAxis, int choice, Graphics g) { // file taken from http://all-free-download.com/free-vector/car-vector-top-view-download.html - g.setColor(Color.black); AffineTransform c; Graphics2D h = (Graphics2D) g; c = h.getTransform(); From 57100e9353a965e44c8d2c7f7b07e4e472dd6918 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 21 Mar 2016 09:31:43 +0000 Subject: [PATCH 25/41] Pictures commit, hope this works. --- .../sprites/bmw_z_top_view_clip_art_18132.jpg | Bin 0 -> 21624 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg 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 0000000000000000000000000000000000000000..b5412cebc9a3ea810ef1af14ed05a9876dd4c5c5 GIT binary patch literal 21624 zcmbTdcT`i+*ESfMs31s}8j+^bM4Hs72nY%Rq*oD;5&`KwL6P1B1Qdiwmm29Eq<85F zy%*^THITx@-#hD_d1uYH);Du=&mXzv+_UdJ=h^#t&OVn@mrH<~nra$q05UQ%z-!VE za7hFxsOYIa(Fg0v-?q0Eb$V}Sf7@F^?7{83ULKAv_O~@O)o*L+sH)%gmU(zjolYbs&4|w$tWnuDJlN7 znsjv#={$gvfr^n=;>i^zU2Ez)Zp;rqBxGIXds^PcqBn}>mwe;?@!EA(wp;8R0)j$! z@7we*Ph!Lc_u%BBK(M zz9grle*Kn~os*lFU+}ZAsG_o}x~8_SzM;LNv#YzOx37O}d}0!bnwp+jURhmR-`M=S zwT(GEIzBl)!=7LKvx^Ks@n2^Bw`KniyBJ7zkyBDqP*VT1i;UcdR45oIsdy!>Fh0?x zwsvE>^YFt}=BEi+7j^H%v2cPnHL6*Be(@kw14A(M#OoI5v*pRA#TgE@e6inx!s;muBH_R8 zmkhQ>thVaHGZC#zRWT;9@Q&c(X`z-rp4njbizTDN4+Cy~UzGA0)4v29pUdW)Gu-Ru z(18E+G+LKhM4QIK_*Kz8+B^q^efS!~pkX{KtXmA^hQ>XQxCB%O@WFPgcgk)JS>YS- zM(5vf4n81Lhasr)0<6szD%f`k;8|coAA?TDhhW>nGOkz=*=}lF8ZgY}5>V?1CQg*5 zUfV$IisP@*%>E{P$!=wJX*3I5PM$| ze`H#Ab8ul>ctgD8F`+fP^#+i5-3O;`N!zsovEwOsKyIFA6){}`+SFPdA=%zoq;Km^ zW`YywyFt;?Zrj0KMEWJ*_C+WCe37Kp$68SB@SeEG8IgDUCur(dHF*7M$@C?_g?{GF zyK^|R^rwp#w6H!^r#eZlOThY?@)_~zMP~r8^;?cK{@ffo4FZZ$4`Xbsfcs8St-VN# zo;?#x#j3JTS3FZ~?dilPXsoFiO;_`F59SiU8}wEw{%^PxlhvOXc-3&%wDKjO3&!&op453LYMs|V5L~K?NMfR>Ri`J@)R-7QTV*F4m*pXGfA_@EJoyd zZ!gXyZC(PN7V=_o7{OVBQGAmoT+7gvc)vUlXd%mHDtl~m(Y_1QV6I1O@+_YIz}7p) z3$0j1<@B6+IksYp#zIazu=CDD#0nx>9cA$45+GBuc=e6EVf-plg>)yh6FLX1W^M%p zisw7Z^Y;Oxs=Hn9sFAe{lcNt`pY;Kt%E^a4?LZ(lenma%ct9b;@=T|-weESykb>Jc6=<%OF6`)jAGlNb*6=C#>}C4%UH!Pp8KLg^ zfaTV(JufR-rzA)Dqd$DLO|^W3k&gwYY_RbmsO3-uo<;UFw1y8B^-c`5QYMUtq=CDExOTtngx- zNJQL$Cc1bKFkdl-{`qLP?fhag0D%?WjLW~VW`fn5%ltI8Py@njuMpe2EoXw(amMgc zwHVZjPaJHiV3F%&NZwHj#{PFk$B-=P<><%0stc*@B_bDUxJ86e0+qm~57td83;1SY z(y>OmiBjyx&v+kST;B`7@kZ%OvHo}cH)UtAES_o0KHz9{e*$5{;3CbsDcCDb;u1j4 zf**Ix6vM`@;C_H3Po|kOZBvLg_?a?nxCP47|^V?|Vy*_a>om?h;@M`FI~Td~ybBV?!F*TsU$xM{WhU zKob$z$%u6gwKXrd?E-0hk6?3QPi#Z%%<7mA5Lx4S5T*QZ?0Pzo6_S$f?fQBN-DGF>;cOC(n7y2uYN{(LU^5#*Tm`OXF8_7rjyHS~&Yz)=%rG zJBS^8ADZ1FmM1rs6f>D7&(!jB>uz?`ptYJq&e1=o^MkypbtS%slb*awAn&7CUU3|) zpR&0+AzL19ePJ*hwIC0FS{`si>Q_?&%uoIjFmO9aX?V*@dEWF%&J&q}pT8b<=c_$* z=i~O+U)(J9!#2HpP~O@lR3Rp@@n|tJQ)JQ$#~B;Y)54piJ<9t^XgXxqqUD1;?P?uA zs_hcM4uTYV@p@$Yl2168Y6!|nQ?9Hm*_Z9tU0fWqfKM~9lRg-q&ciOBve_+5wkmhg zsvUdWvm^h;``q=)G20TBx4g7yz@Wcr?;2v@N8@^5ih`cGefBtUS1LYM=318b(sw&w z-AqSH5jz7cyr8w^eWs0;d!mYi>FI?Cd%u0bM8EIrxyjLzKs~VOXh?fn6Q<;2yK%O4 z0{_ypT>tf75(j!fE+^91?aArL_vgH-#|l)}Z9FOQJFsg=$W1d!QU#dpGhU=@%!&_UUtF+SE6O2*Nzlj$cI_ z{`AD$?JMoY(<7Rm8jZP#zER?DwBn^7g#*Sp1K@6v`%iJ^nM+sG&LkH6Y|MG=SC5V;!c>eY{eevKX z{H+i5k*O zs&@^DSOH#8=yBU?MSQpt^6oc`W#Z`hB6jCC;r_wQZTr3=%a(S>CAzaF63~aUfMSAYzfx@xwjVE7fliT)x zYMHq*ZVz1oBslYUB8BhbLk*K&HGNs%-}E3(l)y@jTGz-g0d|&`fZ>cD!i6h3SKfJP z2lD8m8`hrXnCns@agn6a+}Z?__x{W%ozWijm*1+0Bk~JEM}0yslG|T_KC2))vYc3r zA!4%ku0~AyrT1_0vFuy|u3rM|hiq0p-8nt<9<4I`Gmyh$`}GnqF1^a9Wc=O#Z3Aw2 zO49OM?UtoLdEI7cW8~`Uc4KRDV4PQ6r|#MNV?TJn-nvVH>Z5{2WuIS_4U={ZCbNAW zyu@25!DiXz*53#Q-*n4z2u|SF*qEo|!g`nq8C9^3ySsAoggLaUmBsU2pKG4kwo`c6 zuSPxah|KuKt38nxkwEbzg5(S2yVdA}prXmV2-xokz7xc-8~dqkQgpa@UxwxvI_j19 z-*66J^-j|kM9J^MT%`^YuDOJXyDTrR{~0ls5V@Cz`Pbf$Xvi=$eRW;%NrkC4fo&Vkl-eWU3Qi&ej_+dOATw zBPPPC(IP!U?Hmjj#wrA=XBVJg0o(%3XgYCui^yWNqby!QZ_RXgwl_eyP@ZdDBtVW= ztZ48usRa8Eo_r_2!00l*mALSwQckV$oRL7j9LI~~-IA9W2VgGRpu^k7VC!nYFCx}Kx*(KL-wg#=(&FHGk6hBE}ygBH%t5U;AyJ?#jVHi7TT++!KvXqKxM1?o1#u0DWq#GfFzwT)s}nntaR zqRrsnXjp$Hydz&zCrpY)6$n&~x?|*V6=?+iI;_U>4Y~N~Dp9f1MPkswYqIc)-mjpu z5!X_8;$5_OM?~q|z_MIbpWBh*D}`rD9l|!i1G3|?Z7zGu%*=L>=rv!1IgmhSqA=IxY`Gv8@1}8x|Xdg;?r=eQJci)(poa-I!wRV`8=>JJv)}#B7z>D zBzl8bP|{nkx?U9_u9=6W-Oh$9m7JDPj`T4o25%dkPnbwI6ouNTJV#02Am4MTnw{Qt zVI!J8Ue`E%w5=4+a%}Y*F-v2FrfYRnTAxU>=)Vc77I81?7&8v1ZK(r>2KF_iN^h)I z?DE)AbD&YJ21jC&Ut~a8t<$Tg@nb}(zay%`9j;|pKc(}&>vAWdf(bj(raC|ka@cYD z4(sQ-1ib#&=t3yMep;!tn$WZ&bLCoYtZ||b{7a%5i<;6Oj|)}waQA8t54XmqYKVSq zr_two%U0}jEkzxlA?F8d*Y(|)@-)r+#ZXgc_D@Uib{nvic~wD~b)(iLt`DQU3`VO8 z_tUA8-$!rH7pq9O2dXzeJeP^`)vXUNR00h*3r@Up{lVkqQ`q-jOeiC;&mxj;zHb|{ zOpm==(8I1Muxw^Uxn;y-m{(%AKhL@G;`LSGy}HlJ>8L2&$|`=TV*z9QY1I-5JiUu_n| znD-Hb2h|s@XQ56-4D0pF7eS%>rH?*#j|EIe0@Pg@65^N0%0dIlf*>Kqmc|b1O-7X= z@)*3%5BpcU{r6A{vPi^hnRfKFi6^V~)tV79;@WEpRN>lL$$er-PBPLTS?CHrx&#FK zX+yGQL&HNo=lp8Z;;Qd<8_oz+hoimc29ZO62VP)*Si06V>GGJrcq7`J)!2 z1y=*_-Em>oRdu+X9d#G*e=mqPSQ_+u-vuVl19N;s`2TlXNe&BZkyC+P7Q3s|-1^Q$gO0%G zBO=GK4;IWyK2cxqw+g2BKc0?3b`~4t!+Te}1h~I#nAQeEyN76FZ_HWEeNzWdaI803pjTBVh@8H2=?+z0=%w=d z7hmS4>+6%5UhBLkQ=?o>s6H8Y^n}6LC6wJ4Z6U_^V|q-Dc^hW*ET=H31BL zRLb9kkq)lE5jlj39@_>1+!*0<<0ZKLtLgvs#2`>7jJiZqu1%4qED3QhsiIE`0Y zo`pmp4P;TJd`mGgCC{fGNh6(LXjMeiDYC^bH6~CX=q^{MZGHTqAfJ^du>;7iXo8tt zRwCvVJBQwZ_zA7^;5FOl54{upSFpS;Pv2@6jv=bpvT;Afv(Bd*V8gefV321mTV*8=NfO z0P9PNf35*L5KLPP2$OxO!cSJ8K6t}_qmBcV8@+6tMTh>RKI~v*=jytn3}9EZHK_A4 zX#4=&O(mCOelUMajxvDB;#YTHsjisNa_a6Tj>!qc6et0VsGe#vpo8D*)cMOHKJy)2 zLi2pT=+SHMU@%{S<^`l3R$&x|XK->ZlOE=onxd#vM__e{!<;-T&v0-wYuo+}=%;N7 z`m5WO+ch$J8G^gwv!$hbU!}xy$h~xwt*fYB%e5D>w-w*RPfTA9fj@N#Cupuu3Q49I=YEB zzZHzxr0T{h+kKemdJmc>vR#B=jkd(2nq-&7BXp{pYeJk$Eoxu%-faKOG+$sIiH|y@xnS5{S|b@@yn;TLr%K9mOcCvtDJ<1w*6^;q5fM7 z4>7XgVpiY@OE(cA+Z0sqvxp!%s5KU)3XHKNN*sP&F97VLrR>O7{rQ5d+nT##_u50rfD6)ak z(tAX{@jGDJ(g~+F0WUIvj+;K>f%NN^atN+%l2XuY8G6s$r#|u7)SB9w4`mrB!=J4K z$YcKZOs#vbuR1A}a?Rg`XEo*`YFXjc(%0ExuACwn7~Lfx&#T=%PvDVDq|*h@`pWC8 zZyr2BL^j#y-vD-*mVUiuywB-y39$VhKN5vwoH@g(JPD0<@$E?g9}nj5>8YvIgx+uh0svI9p+`qHn&hBmJcB66MXzRL^!p8WDKm)<-EDt!@l z#OIjmu6kdCxr|otSzB^N+Xu>k>v+D1!-jh3o9zLow5{q3xcv)GFiT1iqveTmGYVXX z)A3LX>TJN+sDr#Z^VKemi zC|$p(H?;0ojgwOv{)Mo|CatKVQ$Ki>>eQgZrtz(QSKEoXMr||JHuuEbJJ&XmNgBlu z9)V~1R;m|6h;&YzVqcvuc0abWKYXI^V#hbWMhW{J3bi*HBT28Ym_M}`Nv)ALNnSOv zwz7BmcsvU{fVed^xnt$(BUR{mJ60fM;KyDGVe$EkXde z=3Qgk`joqORQM|%7^t#~fC2Q~^%9b6`S^Y_xE6GPhlbUZYBAz%JR3*I*V{rrL+JDwg;N*c!If_bH+TR**Qgke^*BucnYo0Jn5`fCnn=_hjzT zyL~3y=r4lsSbIluzMV{9bn(Kb+mM@lHFD*#bZwc1bBgNlQ&qRrGle`IIe}1Ud02s+ z$50Yqb2E;=Ap^?~v!9+bFTjmH9Sp(PQDA;5i%yBf;skwFv~>H%OAwq&KEqyI;m2L7 ztG7>~S1{kBlzplm6rTC5nnQ0VSg`FqaS>7GG~wuwPqLj)&i0RkAxX?ZWG zg$>C$_Q#a~m>goS%$GO=Rg1 zPpTc~7RSejPot)vZ8O8FEu@MR7)M97r#`CuEjTye)G=M)+s--Hci(o`a=lX;I#zj) z!X04_YkoD8BhaMTL3x+@utb6+#op5$@iq5EkYrmISX8Yg^@yTu_7q<|CvNg&>l?8^e2}d4${q z&7>}_C)(}dN)mg>+!4^*cpBfQD;tm-A}^#W`h+sPaNT5)=jyK?xcx4Ky_pwNdeQ0M z-mC9CekgefuwZNkpO*frL-(}da62^N)nDhH0MjXw-$@=mRDw+UMyfTvAMvhd9sdTu z7YG}#YQ8eoqy5Xl(5?O%HC=Mcsr(SF;c#ODK- zfZgh~i~2u#Zp4$IOdc_b%D1ZWce5L>_ya%g4_@deuo7tx14820V49fL_|tS(se#Y( zk$gg1A3@&`I%uwS%jbvknJud%f!SQVXCP=swItYsd-yMjTAvgjLz#4(vc%1Nm{TO9My z#;i8|FjFCA7GF+b&&2C9#29Qkyyrdkto>oueX+glr=tk4=odxX0J1L^S%^R4)aD)j zM-FTiBHsRyG+brxZ`T30*M_Z=s++%FTt5R%tM_n(e}MA&8nUzG#6hM5m0+$yl)|;& zZt+!KlaN5c#vWRyUc+583d%pMw!Lnop=W&Di2hxVkTt6q37FtdSCK^n4BWg zp!4@fg;)FbJ45y_WKAzPZp!5jM=OHe*0*IH;f=zGZOFIkS6(onTOCY(5>t{Fs9y98 z6t-xGE4sZjhZ8bvNamJ zpPlkBhv{daB@sAY%L(FbwPnhfu&p>^vb>oJ(eAnZFI%iR_jkM<$EH7`c2|VZOt1=j%N&iy)fu~#FPL)!! zz&t>rEX_cQNv+0L>i46PAh2a(*Gf&;2#ICc_t%;L_~}Y|u=@5%#}xb@z;PA<4p#=W zxnRSyBy?{$F5P3aeFynq#RzLttx`xT!UByM%Bu|Os_iM(jRcIzgPv0#N}ozhmQ@`! zzN$2Sec<7GFM)}$8~i(9>BAyRd!TcWLMMlFX0+l1tHRIbite`)9s@#q6+IFmjr2Sk zg^VZaJ&ToAv7&f3gydW=Z`>)b6TeL`SHm7K5&*r^5{k{TqwaF0u=IrnbU4`w^S`2d z+VH(h-EGGTL>zBO310%zb}aA7{23dtm@wh@tO>PAyu}-JxL4?1cyS&+_E%}+sM8w-1r z<)h&V_h{+g``&4Kr7t%jbP4cp`GBooeX_d9IAs;>;ZokYbVW|I`j#z@ctjG2a6i8< zY7sGr^7eXp$03uc;gM1`zwD?ziXZ5AUnjUdf*;G_VHYQnm@&}>_T<*aha3~=V&{qB zCR=EBF&+{P`-A|WY0456Ny3YvA>z?_PWa8hbya4goz2XDW1eLX$}wr`S2fJ^%tN@( zG3Wue>fZO>IE_ny6MGC?FG#pccvAU>98xNt>2LVAHx;RRH78=_6%XmpYI9(-66Uvh z7n1DMJx;}!PiD+^{I#Zn%CF@Fb>QlOV=dW;cx9&T7e9SvJN#1@Ox~4lkmi-|q+Jvf z8TpA@h>eDX_3t^;ne9{9@D*g1V9qL##j^j2qnC*&3OH}^1DdeXBz&4Mk@^x#wo+j$ z(cGysn?+sdn8b(CncRXgHL2SC__~So;v(xHLNBBwK0%nbY-+4Ji`B54t$k6?6Z2qN&oR^`WBjO4T>qYYH#2g`uW&W(7>>d z->u6mZKMCpY(nVc;WfULZIhef-A~-r&Ap|!YHDcM!jFFyT`_a}y{);?9J%2Y1h4eo zwf%wch-e<~oLLMVxde<%+XxZRsf@7Q!u@QoGl+L%$5lgx(rP3$WQ05*;9 z5|EghObQ07x+YF}1S%VAtI{rBSTQK|Bv8mJP>K24o~Lfhv7F1^>>GHHerT1bbRR?x zdJM9Or<=vHErCM!st@QbjUl{t-_uK#)!tV;AFNZ*o-3rL;PylO;Kgtk2lLi6yZudZ zCvmqp)aq#{X4dj`(U@Xs9?*7D1oZN9#kDfS>5Cfd%4Q7tN<>! z3(J7MFbZEcEGg;_Xv~Z%%u57;`C1z5K=tE7I{r!>{E%~7(j3|%Qjcq$yJ{LptJKwl2xSk2ObW1ao1oIFm z9Up9KCpgJ`p7%3))rkS$@}jb}u0~-g)ivuUJ`9WLDw^II`UQuMc3QYD)J%jOo zzc3PT_T`-vP0$8BBHTmyACdUl&>Oe)bKbUnZOGF0lm6@^d4#Q&A1O-U*$7P1n>Tld z-1j>KOKIBHQsOx*pctnxe3VCiW$K|U*C8~Hl(hg%?m*cWl z6&{r--jj{UqPTV%>dQ(Nl0v08^5S*e<1VjE4njO0!l9~E`%w|{v-`2#(d&wu1^TD# z`(T#s2Kx?REC(x`J1!Od%9s^HpE`uBTH`+xIwL^V7X;%q5Y61zm4VX2?#6k#Dit_j8PJ{mH;Z=Q>3$`dx7iL&--A8F_tP8@a5>3Cy;P$gUDUc;?rYoKC z1xb$ugO!?JdbuqD6+i8K4~xZNT#q?DG9Fwlbi;Uf$u-^TsB*{ybpBmbteN+FV&dIBxP8N#a}W`VEM;49c`2vu0q(^U z`>|ml(;hOTsW)5td;FJxn~6=PpnDDl8k{P8d>_kliz%j}oMA6Tbyq`~bzhSI%X#|m zqI2!9q@F-k{HWILJJ|@;yk3Hb*#g^0)w%R6%Ve!s+FPqC=08vEGlSv1`kGGnSLGh( zHPB8J+VdUXDkEVn$CYI6`MR;k4o!%KJ$pO)`UW-tVZOOx<3|XIaKEiENHU_~iZOi| z+xG{ujlc??mb}A5Ryp~C1%AbWyKH-iLzY5U!pGOkHc#(Owk~rMezn??!HkdE`nf$>dUM}HP=x6$gzLC>b54>vH zBADKftV;jkEA~ccXZ!*+IGJP53K@K7VQz~Itn|=OBtYUZ;xVh^Z&`ma3AF80QWB`K zX}fuxxB4=Yvk%@wvMUTCX9)f=$#74b>^a5`U-b|YQ(z>BROs-uO_0SD(f1}`g zcqY20C8QQ%^N6ROeWNN#D|h}=!p5Rg3eKSM8&|}7#u~t_?G3Edr-gZ3>{)`Q2E!)5 z#17nPLs2d#r9RU3DcgaJ+9L{~bE7=R_mcBw`H~;mgSm&X*NtbYR+=-Us?|P&z1><_ zhEJh+OD6PWcq3PO!kMdk$cfW=&S@o&MVsqB_A~uZE+QY~$c$snSaST(2Ikm$2Th*? zZd%C_QEoQFrx;qT^U6y=EYvJb`Q1x+B0di5$h7Y|<&RUHB&Gg<=wBeNiP=Y)eWmLD z!S8Fp`1U%5jPB!G+zm!!hVsDhGCmU#y;8we5w{dKWAQ^#H*1l7s8M_ZB6 zAFwj2rjf39R`-M-kiwku;Kj5hC`rS~nlYO)Z*Fp?jAnXR_3+`%_iiH-GfH6uv7woj zwce2&NvXkU0X6?53n`0dExeM6_2`ejA>F1;rkT~HGg`cHD`T9Zn$N8d1FHA`+PR0tTS`tFO6Le;m)a7w5M2TzW*pv z$f1G*BZ$r4b&uyz$;WlxtvOZ{GOV_Cbn_fb8ML$YU3sHa^`UJBsl6 z=;J@=YNlUOd<%@w-Of_E!P@ONaUAuZfJ0APr(5ZpTniJ@W1r3_ z-I?QQwDf&hqSW>vK1bU9O~%jaMR3#4eP|7Iu)%n=h02$1Dz?Qi_MO?b4J9!bH3oZA zam=y?r1#VxYZAzD{H~UAsx$ljw4Dm^p5zZnCD7=|!p{Twy|MN@vwfP!1ZUv;e!M{ktDNcpVFQ zNn4TZ7EVnGG~H~jWoPbOn?$U+jsJ;QB0S84)=3{u!ZhrBlcU@8N*eOcP89vhOr)4~wT-_GUx!TI zc4m32aLslvs-88*tjx(gkwTcgAeWB7j8gfB!KHVll;L8+vbwxe>wM$3&`ED@=I^#| z8?aImgqhLWk&D3UnBuq|;FU z^wpezx=5Fhcfs9@7Yqp3+JBWIfP`$koJ`7vV51AIE9b43(UZp9y)Z=-|MtDAZ-&Y! zq$^ruSaZ927O_W9*XCUy%G1}a)Idsg#_aKRC18u&XDmw@I9){(-%!6X+5mp&MLa`W z<~G!ZDTXV=1Y}w7%^pj=xeMKv+t1!2TQ)f2z`uQi+AC=i+{o{(1L>)x@Cu?)>~gm~j5&X~UANX)Mjm0|j}T%EFo zn^oTSaJTI`;L*uz;Tm*V1|8fc$m_n{*Q@%g`LJGm(OKlXQr^*mT9X`EIhFM*oaJ@) zQ4=+z#M$L@UUi0EoGq<7dzUXufuBi+g!+J0jRnpaOO8C04Eu#T#svpmO-1Zj0&$kv zU(5I@*5&iQ=U^!Ckg3*pcmEWi?YqhRAZ|DMSAPmC!d4)iBrTyBQ4=UVUTvTdI@yxy z&53f0ha+2jWWoi!HWEs>N6*;sOoA|lQ_n`L^L5000Z}Ei_0;KNj?~48*Rqx&R*ZoR z7|Ke^ZSO;s6}i=G_ArrqwY$h31%u!}8kx4$as|gcakzaiQOQjdo{!n zz)!{J)m8n!mDf=;y#uMd$QPWKAN7C35ByPPV}iD5E{puB!J1P{{lbr3V?y8&ueQP@ z{F<*nd!S^lmcZn3V)J*AU6ealVsO$~vA@2-r|F4RzOk?Oa~wvxn37XAd9@|qZ`LB= zwu8v`lH7wf=1FraRh{Ct*#dAav`b!QG z4qD0~;n=5;-}YR7MkKk3M{|){Ve)C>$T}%uck$Yjl>^4!REEgVjMkZiTehxrS>PpY z^*WYg^{#<@tP%P^55s68I`QjW+@rZ=pGGQ59PLJv%BdvMW=zqjP_iN{N!wN@04_lf z3`W=y^2EfOT+yipW1dqShx;15UZD~xG|vO9$Pc2gyuO$v$NDzAJa{^C z?`~N_hWba|BeCa-VF_#}CBT_DS8?zd@9<)sPYz zyX9l!g08N?;7)%6=MbsT;6MhPRiIEE=BzDN`>ykV(}hAbmW}Ik({t)c8t84Kjd!LB zwF^VgeJ5{Z!ytRggDzCk;z$(MV`Xud+tH@f+``wWQ>U{Qv~{h(N$1w2kNy3`e0Q>5 zz|U^^w2L_MRa2Jvm&L3Z^5v64MYU$2S6qhd#oF>Y%g_IztmBic<8#PVlRBEZ+mcpf zCgp>>XlmYkMdT7lgGqQcOYVea_(_(3DRip*{ZCSc>5<<%H?#wM7a79=#7R$?{S8vq z91VH4b+|%uPg85RM}~o-4sBVNfJ%#?mPq0sh}sPj%A1dM()|a(*Zv{B)6UWep;&WK zW$O?nRh;|}^S2I36|%3cm$m;p`mb_uN`0QW_am$n=oF&4NP2*gwd=p8{#Sh!Wd?D| z|7tdU;9!HRM$MAiVLJA&9Vo?eit?V>zk!6AHf#ZUzR3}N2{0Ug6Yn)0KUBL4mr#BU z;$py}5N-ddZSfxgsn4_QGRDrHI%AS7uxdvgC=t~^-|jg~Hk@nw0YmJG7yt6GZ{Rg+ zOpjCaTBi2H*g%WiAbB)6ZsB?ZmKqZ^+a+@ogy);-koa=@+~6zm6tqV2#HAK5P3!6t zk%!&ZcVwoslj$kFD2?Wp&L!#s#0r=X*nx(QHQ!nspZq2*#o)eSp5Afew9U^+<^>)S zvx$laAMKcAl25K;Si>Q{pIq(8Rfp%TCycVUKJU+Fwp1TUA86IJgpE#U(d;o~Q&qnG zjHx$f<~iTFFoN)_p*qguk3^zr8kOI_a6T=%uqeBFu8yqs`g`i@bQY&ch3{oq*3Vc= z7-fFX!&-F-c&<0C&_a@R+jy+ zW>Q9nqz*g3iOEzgZe(5^c-R%hQnDDV3+MOY$!>AMP?~}47Fo7veL!J>2FzTZhjtB- z3E?=QYTr4HFwczp(Qix7Sk#Ofl#!%~M%{&~R@y)}rzg{_HHjhnBey{p07QK-;w$V; z{0B>3EH}FQa7II_Z{KUDt&mXle7}(9*+&6}P^vgGA(5uqK#${>{+7i;k`M)t2{W_% z^c`+C7pN8A2(|n>ui{Wj0@)%v#f>Tx>ZMKai);B<0~svjIZw*_c>McUoE_~Xf3r!U;n2Nx`-IfHm?wN-Qjp-VL z6|YdcThaNtg2Mx63{zbhNy2>!<|iP0l*?+>MAgpNuk-2YJG}+&iE_aAJmFaE9Nhu}TxyX0W4*}z&b{j%iI0D8R4Pj2jC?)1Ig%&8Xt`O- zn`kV-@1s^#PoL}R1on_+K4{wCW0PGqhp+ET^8oir#A%O>DTMROXbGeKR|{7TDQR zen0Om$q%X%kswWY92x|4BP3eT8EZFZ`)g9r8hn!6Yt{jusq=gvAv|udTs_R9;=Wtx zY<;wEquqIQd|&~7l39<2zqq3i9cGnsi=39k660W>K^cK(xR(p0?#_S@_Wg*I?x`mU zDY{nHShEh-<;AOJJrCbC)R9Kh7lx1Z!23iBV5Bs9vwKe+2VNTbGPDN z!iyh#?jax5^C6G>0uaMDlJhDDK0cH2{%K4ExPx0wBNhB;Yeg!3Tg}Fgcb=K~(g@_` zia?FO)EX++3w$L&PWVpc(6msF(U!5>zWJ>n=g+-$b}_-fc+ZU6ZD9dkfk8MaXg^dE z-tEmJh;a=?NWrd~khEnd2VPlPwF%YO2zR>OO_vAs(iiqik;e0juJ5{k)N+x9aZ^8O zlRg(`+o)Pw4$cxj@mBgSM(3U*qB6=i2j!Ud@bMnV$g)<6%b113k`Bu@l~0nEEkvtg zuOqLqF(n@fTmt;!p5x_%0HuMX9Kp#L36q7}qpK*-==6J!j@Z^+_iJrTrQUo7%D%_} z=T{FkcYMu{oxSQ$t^k$ZTx8@;(nW7IRa2FfXng*$JxU^X>%lPj3%*rgM`Jv*<3meF zyRa+{Ji73AMv!vO2_o$sUTt(fUAW!4Nu}}(E{6A3j>Qw3p{!*zY$>a))mzmv`qkmOozS{`7mI%R@T%Eu|MC)u`XAy!2(>xHg4ui&}6|&@1&Mz2o%(zIj(=R$paoN>yFU7%A$d zGh6}v<}LxTI`yY6?G(t!mxdm&Gc?`;lFa8MEhO2fijOcf{WF@so#G#onJ_yi{2UsY z(Q{Y|#=cnlP}A2S!^QIY3Cp(o8{Puh1$$3Z*RY16G9Sl^-W==?asxc-PImNThq>Y` zLoOD+1iiM^kDpk+glyk{^kC#qQs1S&s zp4E7}Zz4rW=*a?I?BRI9uwh)`fBwqt{3a~JTFB^J{YS5qM9)Cl=zsLT+!{>&C-uQv z2^^InF}u1n&}8}SIuzLpwvX97?k#iFE_kbOr;0-eoKp3A6f|9`pyl)Ab8th<|Ix;| z$1@fGe|#zAl8J=SDl&2lNiH*`ToO|5x3whILglt>%q5MeMWIyWUb*G6F^!SSL~@Nx zVWZsHl38r?JAHq@-{bN7AeR!Y@7UaAQ#-<@KISbBcX2z-B%)vvc0k8H%WeNd) zAq6f*5oSlW%FO!dq7;z_o&_4_I|WZibHDut&jJ#=*!^YqwhIHpVBD&8XmK$iU7(15 zhuHNcz3oiTy-CAEBrC~VU8vb!FuMD6Q=)Ik1=ZAytRrWzfm6A07I6N{%26J;bPQ|F zYKdr%-_A)A^>Z&_-b?s_YUep@x?>&tW>9uv-iTeFDN8vYPijCoeN%rbLydY2HjljQ zAvNfI?s#Rg7*qX?OSO)(*|^*pt$JZ-MTU2}FR%Z(?lN=m^<}Y~-!93v%76ouEzlRj$>J=Qk7zFJ{hcBR@q)QhNR3ly8xf*}wPa@o)Th;U-!&0e334H_@iR>%X+zK5^ME-M5P zb&ff{i$%KMKK~8mUmixMEe&qkje9GUWBn(`uF^KX{h_(@ofE~FdieKY1Ak7gxxhaU z70`0FB?yokKmmiaJ9o|x_r3`8JAb)XiCwp}ee)vs!>uRGjQ*tf6^V*?Dv)%V~6#MwJ!pz1DgrmoZ$$3{t&|X5!B`)}$NUZoY;*D?+{5x+zZnYbE!xDwPBx&@!0}3 zz$;MlF6^8AHou&VNLk?ZHL(m2zBI6CCeEOGc{XfS`&5I6r|0kN@0|F+lS9*nvge%d zsHDTpI&$>i`#gbHS)XO(taLTxQpLOrec;G6S+!?( zu-ZYJta=V8msR;XW(QXCL*q4byGl#{_da$(5)~GGQ3(k=6)6n+k)dA}YlaiW!pDu9 z^#H5~tz7V6zc^cXh@!wB2# zFenV%vA@x-!rPw2A|$@FATS!095SNpgZyPqY=PqZ;pNfGzRxJi0a1}5pQm1$G~~XB zk>P4i^{SZa;u)|DeDA{iAL;N4&d0cw>~$v*fIP&aN^fSh(K|92Nlxkqq4b&Uv$?vs zN!PWtiMHd&1pNaM>SXwC-n9X9m}0cOJF!}!Q}&!3p)cHM^rA7%ef|0w8#ZpF^XzW# zXE~Dm`xbl9=V`h%7A4H?q84PhMqO;~wW%41yU}utd^HQ-+Km*wZ*EdJt05xc;iU%j zV62=_dbU|*^xHUP3lxL^U&l-hb%Q*ini%|i1L3S;-WUq?+i zg06ezz{ZEbKSE?6kT#TzAWkm<0^#IphZ&^MYdz&KJDON_-0*KE)9P6D+pd@T=M5+F zcnjYxM9~gw63>1;-x;s+gdEI;e}E(lH>Io~v;;JIQyv>NOuX}xZ$ERa<5Habhdh;$VrjN`Iy1`r& zL)qs|m;K^A{MpQcU*#E4OcZ*vHRcF6NccRpoxw#7F5jP=G zKr_e6;#<_MI$Wiwi(#x1Ch90o#GccCp9q6v6zbf6>s(|ThrfD6?xxAaYvLi zs*B>gsg2cVKV1n8WneH8925D5i^Rg$8@~)hqC1Ux;yhAc>|sB5bqdtPI*-e&5o~^y zb!EJ>$-J=zdd^$&rT3P6{}d7~nK{@ILAj9Uc5(LPwA*k7TeL0e&=JoC_q5XmLdTyr zY?~ui>vP?g+}j{rb$ly4sj7a+Naa#byej!>aESB=s*%{S%Gt`_01Z&u8FB;i!BXTb6( z3L(vUt@;+HyW57{CaZLqo zG8MkNK(v$Hi@&--1AwqaBAtuZ%0jd}SuDo>M6t)L9>*@d8I$F6cR!6exVquiUeci> zj{8v7ffr=AANqH}LL`o5qn9fEWE!2&Doem50}pY1IE>1&1wWiy*Q4k|`BXsD(8Ix| zT@z!1CdQ@-=R|i%a<)&s{z6nJ*zE&Q?Y2HtyF>|9o|q5LtKa|rTs4>%mQ4)@3WVw0 zbrEbm7Jggss~8x#;8BNTody2v&^N(Kt7&*I#f!2XnAn4K=9gx{-W}kCE(WzvDT)|) zxYqNoOet!^#iwXISu0Lf4TQ|Pv|aEV<(2^Co*z^~d9pK{*HtD6;TtB9)owRZ$WJ5t z&qodD@1*P^VB&g8aa$lAxK|^XFb&#vs~H2kt36SLTXH~dfehfuQt+9K=@4GwyPi#* zn4yRt*zHUp-#|LJ1$z4iP1!^J2_TBUyQ`LWqXkx5AU!Y;7P{6`&@<(&xCz%uolP^r z(B4)kVqd((znp^%A{4AOjTpE_)$UV7`UiWS&s$e07 z+$8U3Si`kCV-uQ*zT`1xLH60#l{47PswSnY4fyQ0tiPMql=m%-yBlHL!f<*d@2`(l zU>gPso_+TRoK|TX&yfFm8TS<{%NFZ(=<5|6A|JljJze$_(kRzs2zB8ym|$sciD%y$ z>0#IyhO7gzb;>-vb6T?c@#mB0BLm@hxrL_PEaO&KVC(Qm7RUJZcXB}5#q*DKZHgVE zb|dt#0W4aIU?0zNP}kg_@nS-3-m53w=Y`g{QK@Nlbz~0t8<;2FDB5y?n?>8_;sw1I zHnBvN?m0p%!oPU`Im#e`Y<;^I%8g!_zExEuiKr(A3+4VHmAVb4sb63B` z#=YDrCj=fR<}N_4Lj_ELvSYipcnW}WE^!xEI7WV_;T8x+)ENBRSo zP+m8AV?NRbSO-HX4BS0i__S9NKV%sgAXW+>_{W-H_5^r`pB$dwVu)MJuPxsKO=fL@ z6x3ChATocna0uNlAp9y3$jFZ&LV+P%0@jy=k6R!KaeT^0XWJ4g9SSUxyszJCL+Jhsn7JjqG_>WoOaC}Jv!_5^#osQy646Sr+^qLH-k6#1-=h|T2KG(ol!nT9{n>xKW?=; zHz93PJ@!L`7h8E&!CZU`l=b*vmoI@#c*rCrSp~}|jKnEl(tyOileaK=JR?lqhLG%K z^b%Hu4i8|lQ~Wo&y?@F+H9>ec$ZGZss*+vqikB~B&bO*4p1^B5J?=}W*E7fZ@2JVx z{uV0Ni9#rc?b0x&6ZsbEepM+Mkr0;fVd~kxBDna8y&<#}3YghV*qAH+ZVXI*ixJ{E z`BA~xbMR$3H~<;>-V%I4$hmT5S2z~;0jGunON}mjU!@HB+%iuhz2$ijrcu3XRQi~E zgJeVSlU?r@M+}}jO$$9(<-!AVAB@1~o0QRcg6wm^`|5D>`b4!;2j5!&i;+WDJI{x` zb&0vM&9|@Z=P_as+|5bH8VLZX`>+8_Sa)c7?;f2kkaoFcqUE2zmQc2OJ^5<--FBwVuaFM_YVE)tq;IVcoOn6)-;V`*oGl>-aV<8u zD@rSL4CCR$l|<%4N(f`*dYNj380XE4{a4Hgr*4VQq!OZd&0J(L&x(6^s!@H#l|>@v z&o{V!4}Iq|YMX0t^u(8=Cp%8SH1cENcX^sjCEQ+a;Mw7&ZF}j7Ws&;#6%Lr*Z{aPt n{j&nNsqp`9|7{U)m8A23Oa%=7A2a_iRBH`O+;d)ZYxKVWL+#H1 literal 0 HcmV?d00001 From 105b0c989eef3e9f487539f2657540368240ac2f Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 21 Mar 2016 09:32:18 +0000 Subject: [PATCH 26/41] Second picture commit --- .../main/resources/sprites/8460_st0640_117.jpg | Bin 0 -> 71073 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 gui/src/main/resources/sprites/8460_st0640_117.jpg 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 0000000000000000000000000000000000000000..01519ad98287bf53e363b5335143b261d6f95edb GIT binary patch literal 71073 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 z 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 literal 0 HcmV?d00001 From 4fe82d6ff4b40a0ef11dd4209a6eeea6a91b553a Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 21 Mar 2016 09:49:05 +0000 Subject: [PATCH 27/41] Removed my function call from the SimulationImageProducer, now the file is as I got it from the master. Alex hope this solves your problem of maps, if not let me know what more I can do to not destroy the map. --- .../traffic/gui/SimulationImageProducer.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) 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 1782204..eea6a43 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -18,10 +18,10 @@ public class SimulationImageProducer implements ISimulationAware { protected static Logger_Interface LOG = Logger.getLoggerInstance(SimulationImageProducer.class.getSimpleName()); - private SimulationMap map; - private BiConsumer imageConsumer; private final BufferedImage image; private final Graphics2D graphics; + private SimulationMap map; + private BiConsumer imageConsumer; /** * Constructor @@ -37,18 +37,14 @@ public SimulationImageProducer(SimulationMap map, BiConsumer { // graphics.setColor(object.getColor()); // MapPosition pos = object.getPosition(); From 28ca852cf185512f26f0d02532a469db0efae714 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 21 Mar 2016 09:54:37 +0000 Subject: [PATCH 28/41] Changed the map to initial stage, hope by adding to main it won't destroy the main maps. --- .../traffic/gui/SimulatorGui.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 9a43430..cf458ab 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulatorGui.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulatorGui.java @@ -31,22 +31,13 @@ public class SimulatorGui { private final GuiModel model; private final MapPanel mapPanel; - /** - * Entry point. - * - * @param args CLI parameters - */ - public static void main(String[] args) { - new SimulatorGui(); - } - /** * Default constructor. */ public SimulatorGui() { model = new GuiModel(); controller = new GuiController(model, () -> { - SimulationMap map = new SimulationMap(300, 300); + SimulationMap map = new SimulationMap(300, 6); SimulationImageProducer imageProducer = new SimulationImageProducer( map, (image, tick) -> { @@ -93,4 +84,13 @@ public SimulatorGui() { model.reset(); } + /** + * Entry point. + * + * @param args CLI parameters + */ + public static void main(String[] args) { + new SimulatorGui(); + } + } From 2891e940c6729fb450378598e727e7a378064d96 Mon Sep 17 00:00:00 2001 From: Oleksandr Cherednychenko Date: Mon, 21 Mar 2016 14:30:16 +0000 Subject: [PATCH 29/41] A bit of cleaned up code. --- .../traffic/gui/GUI_Primitives.java | 73 ++++++++----------- .../traffic/gui/GuiPrimitivesTest.java | 34 +++++++++ 2 files changed, 64 insertions(+), 43 deletions(-) create mode 100644 gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java 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 index 08c6bde..64405a1 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -4,12 +4,16 @@ import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.QuadCurve2D; -import java.io.*; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; /** * Created by kumar awijeet on 2/24/2016. thanks for Working!! */ public class GUI_Primitives { + // TODO add log instance here. public void drawLine(int x1, int y1, int x2, int y2, Graphics g) { Graphics2D g2 = (Graphics2D) g; g.drawLine(x1, y1, x2, y2); @@ -26,50 +30,33 @@ public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, drawLine(x, y, x1, y1, g); drawLine(x2, y2, x3, y3, g); } - public void drawCar(int x3, int y3, double angleToXAxis, int choice, Graphics g) - { + + public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) { + 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, Graphics g) { + 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, Graphics g) { // file taken from http://all-free-download.com/free-vector/car-vector-top-view-download.html - AffineTransform c; - Graphics2D h = (Graphics2D) g; - c = h.getTransform(); - AffineTransform at = new AffineTransform(); - at.rotate(angleToXAxis,x3,y3); - h.setTransform(at); - Image img = null; - InputStream i = null; - switch(choice) - { - case 1: - try { - i = new BufferedInputStream(new FileInputStream("gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - try { - assert i != null; - img = ImageIO.read(i); - } catch (IOException e) { - e.printStackTrace(); - } - h.drawImage(img,x3-18,y3-18,40,40,null); - h.setTransform(c); - break; - case 2: - try { - i = new BufferedInputStream(new FileInputStream("gui/src/main/resources/sprites/8460_st0640_117.jpg")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - try { - assert i != null; - img = ImageIO.read(i); - } catch (IOException e) { - e.printStackTrace(); - } - h.drawImage(img,x3-18,y3-18,40,40,null); - h.setTransform(c); - } + Graphics2D graphics = (Graphics2D) g; + AffineTransform originalTransform = graphics.getTransform(); + try { + AffineTransform newTransformation = new AffineTransform(); + newTransformation.rotate(angleToXAxis, x3, y3); + graphics.setTransform(newTransformation); + InputStream imageStream = new BufferedInputStream(new FileInputStream(filename)); + Image image = ImageIO.read(imageStream); + graphics.drawImage(image, x3 - 18, y3 - 18, 40, 40, null); + } catch (IOException e) { + // TODO add logger. + e.printStackTrace(); + } finally { + graphics.setTransform(originalTransform); + } } } 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..0d04561 --- /dev/null +++ b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java @@ -0,0 +1,34 @@ +package kcl.teamIndexZero.traffic.gui; + +import org.junit.Test; + +import java.awt.*; +import java.awt.image.BufferedImage; + +/** + * Created by lexaux on 21/03/2016. + */ +public class GuiPrimitivesTest { + + @Test + public void testDrawingPerformance() { + // record time + GUI_Primitives primitives = new GUI_Primitives(); + + long timestamp = System.currentTimeMillis(); + BufferedImage image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB); + Graphics g = 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); + + } +} From 6e248acff1812f5dd57df1daddcb75d39645f86c Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Fri, 25 Mar 2016 18:25:29 +0000 Subject: [PATCH 30/41] The cars are now produced faster, for a 500cars with 25 fps the time taken is some 150 ms. Have used basic if and else statements to reduce the read time, along with some extra variables. GUIPrimitivesTest is the test used to check the above results. TODO add logs for various other exceptions, will go for it tomorrow. --- .../traffic/gui/GUI_Primitives.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) 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 index 64405a1..a1697c1 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -1,11 +1,12 @@ 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.awt.geom.QuadCurve2D; import java.io.BufferedInputStream; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -13,6 +14,10 @@ * 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; // TODO add log instance here. public void drawLine(int x1, int y1, int x2, int y2, Graphics g) { Graphics2D g2 = (Graphics2D) g; @@ -40,21 +45,39 @@ public void drawTruck(int x3, int y3, double angleToXAxis, Graphics g) { } private void drawCar(int x3, int y3, double angleToXAxis, String filename, Graphics g) { - // file taken from http://all-free-download.com/free-vector/car-vector-top-view-download.html + /* + 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 = (Graphics2D) g; AffineTransform originalTransform = graphics.getTransform(); - try { AffineTransform newTransformation = new AffineTransform(); newTransformation.rotate(angleToXAxis, x3, y3); graphics.setTransform(newTransformation); - - InputStream imageStream = new BufferedInputStream(new FileInputStream(filename)); - Image image = ImageIO.read(imageStream); - graphics.drawImage(image, x3 - 18, y3 - 18, 40, 40, null); + //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 (IOException e) { // TODO add logger. e.printStackTrace(); + log.log_Fatal("File not found", "GUI_Primnitives"); } finally { graphics.setTransform(originalTransform); } From 23c3d1197ded70ad6a3f8537290e6253de63711c Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Fri, 25 Mar 2016 18:39:30 +0000 Subject: [PATCH 31/41] The cars are now produced faster, for a 500cars with 25 fps the time taken is some 150 ms. Have used basic if and else statements to reduce the read time, along with some extra variables. GUIPrimitivesTest is the test used to check the above results. TODO add logs for various other exceptions, will go for it tomorrow. --- .../traffic/simulator/data/features/TrafficGeneratorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); } From ea44ac5de38fd99ab1a323faff40af77e4347cf7 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sat, 26 Mar 2016 18:13:02 +0000 Subject: [PATCH 32/41] Few logging changes. Also a few changes in final block to improve functionality. --- .../traffic/gui/GUI_Primitives.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) 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 index a1697c1..3ad84a5 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -18,7 +18,6 @@ public class GUI_Primitives { InputStream imageStream; int j = 0, k = 0; Image image, image1; - // TODO add log instance here. public void drawLine(int x1, int y1, int x2, int y2, Graphics g) { Graphics2D g2 = (Graphics2D) g; g.drawLine(x1, y1, x2, y2); @@ -36,15 +35,15 @@ public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, drawLine(x2, y2, x3, y3, g); } - public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) { + public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics 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, Graphics g) { + public void drawTruck(int x3, int y3, double angleToXAxis, Graphics 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, Graphics g) { + private void drawCar(int x3, int y3, double angleToXAxis, String filename, Graphics g) throws IOException { /* Files taken from http://all-free-download.com/free-vector/car-vector-top-view-download.html @@ -74,12 +73,20 @@ private void drawCar(int x3, int y3, double angleToXAxis, String filename, Graph graphics.drawImage(image, x3 - 18, y3 - 18, 40, 40, null); } } - } catch (IOException e) { - // TODO add logger. + } catch (Exception e) { e.printStackTrace(); - log.log_Fatal("File not found", "GUI_Primnitives"); + if (e instanceof IOException) { + log.log_Fatal("File not found", "GUI_Primnitives"); + } + if (e instanceof IllegalArgumentException) { + log.log_Error("Check function, parameter passing error", "GUI_Primitives"); + } else { + log.log_Exception(e); + System.out.println("Unknown error"); + } } finally { graphics.setTransform(originalTransform); + imageStream.close(); } } } From 11e323fc00340aa94379460cdc02498f8fe3d405 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sat, 26 Mar 2016 18:13:49 +0000 Subject: [PATCH 33/41] Few logging changes. Also a few changes in final block to improve functionality. --- .../java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java index 0d04561..9c2a5d0 100644 --- a/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java +++ b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java @@ -4,6 +4,7 @@ import java.awt.*; import java.awt.image.BufferedImage; +import java.io.IOException; /** * Created by lexaux on 21/03/2016. @@ -11,7 +12,7 @@ public class GuiPrimitivesTest { @Test - public void testDrawingPerformance() { + public void testDrawingPerformance() throws IOException { // record time GUI_Primitives primitives = new GUI_Primitives(); From d61c658170802869ab791ba9e8af7471b624692f Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sun, 27 Mar 2016 11:04:14 +0100 Subject: [PATCH 34/41] The IOException now sends the message directly to the logger. The print statement is removed. Catch block is still single, with the use of instanceof for distinguishing the exceptions. The closure of image stream is still done as previously. --- .../java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 index 3ad84a5..df16f1a 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -76,13 +76,12 @@ private void drawCar(int x3, int y3, double angleToXAxis, String filename, Graph } catch (Exception e) { e.printStackTrace(); if (e instanceof IOException) { - log.log_Fatal("File not found", "GUI_Primnitives"); + 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); - System.out.println("Unknown error"); } } finally { graphics.setTransform(originalTransform); From 552f73844d82223243ec29b241ae301bc12958f7 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sun, 27 Mar 2016 19:38:40 +0100 Subject: [PATCH 35/41] Slight modifications. --- .../java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 index df16f1a..409696e 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -85,7 +85,9 @@ private void drawCar(int x3, int y3, double angleToXAxis, String filename, Graph } } finally { graphics.setTransform(originalTransform); - imageStream.close(); + if (imageStream != null) { + imageStream.close(); + } } } } From 5d6ef57cd929e79cc6ad46bfc1e02709d644ee91 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sun, 27 Mar 2016 19:40:04 +0100 Subject: [PATCH 36/41] Cleaning up of unused code --- .../traffic/gui/GUI_Primitives.java | 17 ----------------- 1 file changed, 17 deletions(-) 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 index 409696e..9710544 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -5,7 +5,6 @@ import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.AffineTransform; -import java.awt.geom.QuadCurve2D; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; @@ -18,22 +17,6 @@ public class GUI_Primitives { InputStream imageStream; int j = 0, k = 0; Image image, image1; - public void drawLine(int x1, int y1, int x2, int y2, Graphics g) { - Graphics2D g2 = (Graphics2D) g; - g.drawLine(x1, y1, x2, y2); - } - - public void drawCurve(int x1, int y1, int x2, int y2, int ctrlx, int ctrly, Graphics g) { - Graphics2D g2 = (Graphics2D) g; - QuadCurve2D q = new QuadCurve2D.Float(); - q.setCurve(x1, y1, ctrlx, ctrly, x2, y2); - g2.draw(q); - } - - public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3, Graphics g) { - drawLine(x, y, x1, y1, g); - drawLine(x2, y2, x3, y3, g); - } public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) throws IOException { drawCar(x3, y3, angleToXAxis, "gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg", g); From 42b8d589d68823fc998ef088c7542e9c70af6522 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Sun, 27 Mar 2016 19:40:04 +0100 Subject: [PATCH 37/41] Trying to add my function call to SimulationImageProducer. The graphics parameter can't be passed somehow, and am unsure about the placement of the function call The variable GeoPoint is, I think correctly being extracted for x and y coordinates. --- .../traffic/gui/GUI_Primitives.java | 17 ----------------- .../traffic/gui/SimulationImageProducer.java | 9 +++++++-- 2 files changed, 7 insertions(+), 19 deletions(-) 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 index 409696e..9710544 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -5,7 +5,6 @@ import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.AffineTransform; -import java.awt.geom.QuadCurve2D; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; @@ -18,22 +17,6 @@ public class GUI_Primitives { InputStream imageStream; int j = 0, k = 0; Image image, image1; - public void drawLine(int x1, int y1, int x2, int y2, Graphics g) { - Graphics2D g2 = (Graphics2D) g; - g.drawLine(x1, y1, x2, y2); - } - - public void drawCurve(int x1, int y1, int x2, int y2, int ctrlx, int ctrly, Graphics g) { - Graphics2D g2 = (Graphics2D) g; - QuadCurve2D q = new QuadCurve2D.Float(); - q.setCurve(x1, y1, ctrlx, ctrly, x2, y2); - g2.draw(q); - } - - public void drawSingleRoad(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3, Graphics g) { - drawLine(x, y, x1, y1, g); - drawLine(x2, y2, x3, y3, g); - } public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) throws IOException { drawCar(x3, y3, angleToXAxis, "gui/src/main/resources/sprites/bmw_z_top_view_clip_art_18132.jpg", g); 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..e94af8e 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -193,9 +193,14 @@ public void drawAllDynamicObjects() { if (point == null) { return; } - + GUI_Primitives cars = new GUI_Primitives(); if (model.getViewport().getPixelsInMeter() < 1) { - primitives.drawCircle(graphics, point, 2, v.getColor(), true); + //cars.drawSmallCar(2,5,90,graphics); + int x, y; + x = (int) point.xMeters; + y = (int) point.yMeters; + cars.drawSmallCar(x, y, 0, graphics); + //primitives.drawCircle(graphics, point, 2, v.getColor(), true); } else { double bearing = v.getBearing(); primitives.drawSegment(graphics, From 5215075f55d56c5efcd57ae0f2dc2fb726821be3 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 28 Mar 2016 19:26:47 +0100 Subject: [PATCH 38/41] Have been able to finally add my calling functions. The result is not visible on map though, don't know why. Every call has to be under try and catch for some reason unknown to me. The end result on the map is the circle of the cars, being removed, but my cars not being there. --- .../traffic/gui/SimulationImageProducer.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) 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 e94af8e..687f798 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; @@ -190,16 +191,17 @@ 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; + BufferedImage image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB); + Graphics g = image.getGraphics(); if (point == null) { return; } GUI_Primitives cars = new GUI_Primitives(); if (model.getViewport().getPixelsInMeter() < 1) { - //cars.drawSmallCar(2,5,90,graphics); - int x, y; - x = (int) point.xMeters; - y = (int) point.yMeters; - cars.drawSmallCar(x, y, 0, graphics); + cars.drawSmallCar(x, y, 2, g); //primitives.drawCircle(graphics, point, 2, v.getColor(), true); } else { double bearing = v.getBearing(); @@ -214,16 +216,22 @@ public void drawAllDynamicObjects() { v.getColor(), getStrokeByWidthMeters(v.getWidthMeters()) ); - primitives.drawCircle(graphics, point, (int) (Math.floor(v.getWidthMeters() * model.getViewport().getPixelsInMeter())), Color.YELLOW, true); + cars.drawSmallCar(x, y, bearing, g); + //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, g); + } catch (IOException e) { + e.printStackTrace(); + } + /*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); } From a416480bbb48f9403d02a21941cb7a4fa543e8cb Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 28 Mar 2016 19:28:33 +0100 Subject: [PATCH 39/41] Have been able to finally add my calling functions. The result is not visible on map though, don't know why. Every call has to be under try and catch for some reason unknown to me. The end result on the map is the circle of the cars, being removed, but my cars not being there. --- .../teamIndexZero/traffic/gui/SimulationImageProducer.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) 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 687f798..3374220 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/SimulationImageProducer.java @@ -13,7 +13,6 @@ 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; @@ -223,11 +222,7 @@ public void drawAllDynamicObjects() { if (v.equals(model.getSelectedMapObject())) { int radius = (int) (model.getViewport().getPixelsInMeter() * ((Vehicle) model.getSelectedMapObject()).getDistanceToKeepToNextObject()); - try { - cars.drawSmallCar(x, y, radius, g); - } catch (IOException e) { - e.printStackTrace(); - } + cars.drawSmallCar(x, y, radius, g); /*primitives.drawCircle(graphics, point, radius, From 1ae338c5eeb66a0cdd5b72b843f6f0e5583e786d Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 28 Mar 2016 19:42:32 +0100 Subject: [PATCH 40/41] No output problem remains. Added try and catch to remove errors. Added log for try and catch in SimulationImageProducer Changed the graphics to graphics2d --- .../traffic/gui/GUI_Primitives.java | 8 +++---- .../traffic/gui/SimulationImageProducer.java | 24 ++++++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) 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 index 9710544..e12e0e3 100644 --- a/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java +++ b/gui/src/main/java/kcl/teamIndexZero/traffic/gui/GUI_Primitives.java @@ -18,21 +18,21 @@ public class GUI_Primitives { int j = 0, k = 0; Image image, image1; - public void drawSmallCar(int x3, int y3, double angleToXAxis, Graphics g) throws IOException { + 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, Graphics g) throws IOException { + 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, Graphics g) throws IOException { + 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 = (Graphics2D) g; + Graphics2D graphics = g; AffineTransform originalTransform = graphics.getTransform(); try { AffineTransform newTransformation = new AffineTransform(); 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 3374220..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; @@ -193,14 +194,17 @@ public void drawAllDynamicObjects() { int x, y; x = (int) point.xMeters; y = (int) point.yMeters; - BufferedImage image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB); - Graphics g = image.getGraphics(); if (point == null) { return; } GUI_Primitives cars = new GUI_Primitives(); if (model.getViewport().getPixelsInMeter() < 1) { - cars.drawSmallCar(x, y, 2, g); + 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(); @@ -215,14 +219,22 @@ public void drawAllDynamicObjects() { v.getColor(), getStrokeByWidthMeters(v.getWidthMeters()) ); - cars.drawSmallCar(x, y, bearing, g); + 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()); - cars.drawSmallCar(x, y, radius, g); + try { + cars.drawSmallCar(x, y, radius, graphics); + } catch (IOException e) { + log.log_Fatal(e.getMessage(), "SimulationImageProducer"); + } /*primitives.drawCircle(graphics, point, radius, From ec0842676746c4f6800673891f8aa7bd119e8204 Mon Sep 17 00:00:00 2001 From: kumar awijeet Date: Mon, 28 Mar 2016 20:13:09 +0100 Subject: [PATCH 41/41] Minor changes, nothing new. --- .../java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java index 9c2a5d0..190811e 100644 --- a/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java +++ b/gui/src/test/java/kcl/teamIndexZero/traffic/gui/GuiPrimitivesTest.java @@ -18,7 +18,7 @@ public void testDrawingPerformance() throws IOException { long timestamp = System.currentTimeMillis(); BufferedImage image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB); - Graphics g = image.getGraphics(); + Graphics2D g = (Graphics2D) image.getGraphics(); int count = 25 * 500; while (count-- > 0) { if (count % 2 == 1) {