From 2ed1eea32c8e365c2156df125b8a67de21f1061f Mon Sep 17 00:00:00 2001
From: NET-D3v3l0p3r <3r0rxx@gmail.com>
Date: Thu, 29 Apr 2021 18:03:15 +0200
Subject: [PATCH] AlhamdulIllah

---
 examples/debug.png                            | Bin 884 -> 2829 bytes
 examples/maze1.png                            | Bin 0 -> 4708 bytes
 examples/maze2.png                            | Bin 0 -> 14273 bytes
 src/Program.java                              |   3 +-
 src/approach3/parallel/SharedRessources.java  |  12 ++
 .../parallel/WallBasedPathfinder.java         | 114 ++++++++++++++++++
 src/approach3/parallel/operations/Flood.java  |  29 ++---
 src/approach3/parallel/operations/Trace.java  |  48 ++++++--
 src/approach3/window/MainWindowApproach3.java |  65 ++++++++++
 9 files changed, 240 insertions(+), 31 deletions(-)
 create mode 100644 examples/maze1.png
 create mode 100644 examples/maze2.png

diff --git a/examples/debug.png b/examples/debug.png
index bbb918962ed113c30f201511e1c0da6f8bebec8c..03822747f1d56b2a3a9c8f28ed799ac84338a301 100644
GIT binary patch
delta 2796
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

literal 884
zcmeAS@N?(olHy`uVBq!ia0y~yVA#&Uz_6TyiGhLP&aJ3m1_lPk;vjb?hIQv;UNSH+
zu%tWsIx;Y9?C1WI$jZRLz**oCS<Jw|cNl~jkLRyQVPIh9^mK6ysfc@f$&l-S14GM!
z-~X2jb4-hFXP$fO(qt9SqQ&Yz4UV`7*|yE_Sae)K*z=1-l2WIfvyaNf<c?02Djvg$
uF8zvXlU^8(DjE%fA({#%sr<ZbslRU@&zbjjB|Qub3=E#GelF{r5}E*XNJD%8

diff --git a/examples/maze1.png b/examples/maze1.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d0e89eac8cdd7837acf4492417be38bcd7897e0
GIT binary patch
literal 4708
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
Yi{+s|gT0s-7#J8lUHx3vIVCg!0IsIn-2eap

literal 0
HcmV?d00001

diff --git a/examples/maze2.png b/examples/maze2.png
new file mode 100644
index 0000000000000000000000000000000000000000..1aaec2636c11260c9a9edfce809568154ef6b57d
GIT binary patch
literal 14273
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

literal 0
HcmV?d00001

diff --git a/src/Program.java b/src/Program.java
index a182e27..b1c8ef9 100644
--- a/src/Program.java
+++ b/src/Program.java
@@ -1,13 +1,14 @@
 // - 1 -
 
 import approach2.window.MainWindowApproach2;
+import approach3.window.MainWindowApproach3;
 
 public class Program {
 
 
     public static void main(String[] args) throws Exception {
 
-        MainWindowApproach2 window = new MainWindowApproach2("Pathfinder v1", 1080, 1080);
+        MainWindowApproach3 window = new MainWindowApproach3("Pathfinder v1", 1080, 1080);
         window.run();
 
     }
diff --git a/src/approach3/parallel/SharedRessources.java b/src/approach3/parallel/SharedRessources.java
index 198eef2..94e1a48 100644
--- a/src/approach3/parallel/SharedRessources.java
+++ b/src/approach3/parallel/SharedRessources.java
@@ -96,6 +96,10 @@ public class SharedRessources {
         }
     }
 
+    public Int3 getData(int x, int y) {
+        return data[x + y * width];
+    }
+
     public boolean isWall(int x, int y) {
         return walls[x + y * width];
     }
@@ -104,4 +108,12 @@ public class SharedRessources {
         walls[x + y * width] = true;
     }
 
+    public int getWidth() {
+        return this.width;
+    }
+
+    public int getHeight() {
+        return this.height;
+    }
+
 }
diff --git a/src/approach3/parallel/WallBasedPathfinder.java b/src/approach3/parallel/WallBasedPathfinder.java
index a0270c4..887ab24 100644
--- a/src/approach3/parallel/WallBasedPathfinder.java
+++ b/src/approach3/parallel/WallBasedPathfinder.java
@@ -1,7 +1,121 @@
 package approach3.parallel;
 
+import approach3.parallel.operations.Trace;
+import structs.Int3;
+import structs.Vec3;
+
+import java.awt.*;
+import java.util.ArrayList;
+
 public class WallBasedPathfinder {
 
 
+    public void find() {
+
+        int beginX = SharedRessources.getInstance().getStart().x;
+        int beginY = SharedRessources.getInstance().getStart().y;
+
+        int endX = SharedRessources.getInstance().getEnd().x;
+        int endY = SharedRessources.getInstance().getEnd().y;
+
+
+        SharedRessources
+                .getInstance()
+                .getExecutor()
+                .execute(new Trace(endX, endY, beginX, beginY, 0));
+
+
+    }
+
+
+    ArrayList<Point> debug = new ArrayList<>();
+
+
+    public ArrayList<Point> calculatePath(int startX, int startY, int destX, int destY) {
+
+        int x = startX;
+        int y = startY;
+
+        while (x != destX || y != destY) {
+
+            debug.add(new Point(x, y));
+
+            Int3 currentDir
+                    =
+                    SharedRessources.getInstance().getData(x, y);
+
+            int dx = (int) currentDir.getX();
+            int dy = (int) currentDir.getY();
+
+            if (dx == 0 && dy == 0)
+                break;
+
+            x += dx;
+            y += dy;
+
+
+        }
+
+        System.out.println("Done.");
+
+        return debug;
+    }
+
+
+    public void draw(Graphics g) {
+
+
+        for (int j = 0; j < SharedRessources.getInstance().getHeight(); j++) {
+            for (int i = 0; i < SharedRessources.getInstance().getWidth(); i++) {
+                if (SharedRessources.getInstance().isWall(i, j)) {
+                    g.setColor(Color.blue);
+                    g.fillRect(i * 5, j * 5, 5, 5);
+                } else {
+                    int dx = (int) SharedRessources.getInstance().getData(i, j).getX() * 5;
+                    int dy = (int) SharedRessources.getInstance().getData(i, j).getY() * 5;
+
+                    if (dx != 0 || dy != 0) {
+                        int green = SharedRessources.getInstance().getStep(i, j);
+                        if (green >= 255)
+                            green = 255;
+                        Color color
+                                = new Color(0, 255, 0);
+
+                        g.setColor(color);
+
+                        g.fillRect(i * 5, j * 5, 5, 5);
+
+                        g.setColor(Color.red);
+                        g.drawLine(i * 5, j * 5, i * 5 + dx, j * 5 + dy);
+
+
+                    } else {
+                        g.setColor(Color.black);
+                        g.fillRect(i * 5, j * 5, 5, 5);
+                    }
+                }
+            }
+        }
+
+        if (SharedRessources.getInstance().getEnd() == null || SharedRessources.getInstance().getStart() == null)
+            return;
+
+
+        g.setColor(Color.yellow);
+        g.fillRect(SharedRessources.getInstance().getEnd().x * 5,
+                SharedRessources.getInstance().getEnd().y * 5, 5
+                , 5);
+
+        g.setColor(Color.red);
+        g.fillRect(SharedRessources.getInstance().getStart().x * 5,
+                SharedRessources.getInstance().getStart().y * 5
+                , 5, 5);
+
+
+        g.setColor(Color.red);
+
+        for (int i = 0; i < debug.size(); i++)
+            g.fillRect(debug.get(i).x * 5, debug.get(i).y * 5, 5, 5);
 
+    }
 }
diff --git a/src/approach3/parallel/operations/Flood.java b/src/approach3/parallel/operations/Flood.java
index 952adfe..55563b5 100644
--- a/src/approach3/parallel/operations/Flood.java
+++ b/src/approach3/parallel/operations/Flood.java
@@ -37,20 +37,16 @@ public class Flood implements Runnable {
         while (!openPoints.isEmpty()) {
 
             if (SharedRessources.getInstance().isFound())
-                return;
+                break;
 
             Point cur
                     = openPoints.poll();
 
 
-
             int x = cur.x;
             int y = cur.y;
 
 
-            if(steps >= SharedRessources.getInstance().getStep(x, y))
-                break;
-
             boolean
                     left = SharedRessources.getInstance().isWall(x - 1, y);
             boolean
@@ -64,7 +60,6 @@ public class Flood implements Runnable {
                     SharedRessources.getInstance().isWall(x - 1, y - 1);
             boolean rightUp =
                     SharedRessources.getInstance().isWall(x + 1, y - 1);
-
             boolean leftDown =
                     SharedRessources.getInstance().isWall(x - 1, y + 1);
             boolean rightDown =
@@ -128,23 +123,21 @@ public class Flood implements Runnable {
             }
 
 
-            SharedRessources
-                    .getInstance()
-                    .getExecutor()
-                    .execute(new Trace(
-                            x,
-                            y,
-                            SharedRessources.getInstance().getStart().x,
-                            SharedRessources.getInstance().getStart().y,
-                            steps));
+            if (steps % 18 == 0)
+                SharedRessources
+                        .getInstance()
+                        .getExecutor()
+                        .execute(new Trace(
+                                x,
+                                y,
+                                SharedRessources.getInstance().getStart().x,
+                                SharedRessources.getInstance().getStart().y,
+                                steps));
 
             steps++;
 
         }
 
 
-        System.out.println("Done flooding.");
-
-
     }
 }
diff --git a/src/approach3/parallel/operations/Trace.java b/src/approach3/parallel/operations/Trace.java
index c1b93fc..3246e37 100644
--- a/src/approach3/parallel/operations/Trace.java
+++ b/src/approach3/parallel/operations/Trace.java
@@ -40,6 +40,7 @@ public class Trace implements Runnable {
             if (SharedRessources.getInstance().isFound())
                 return;
 
+
             oldX = x0;
             oldY = y0;
 
@@ -60,46 +61,69 @@ public class Trace implements Runnable {
                 y0 += sy;
             }
 
-            step++;
-
             int currentStep
                     = SharedRessources.getInstance().getStep(x0, y0);
 
+            if (step < currentStep) {
+                int dirX = x0 - oldX;
+                int dirY = y0 - oldY;
+
+                SharedRessources.getInstance()
+                        .setData(x0, y0, -dirX, -dirY, step);
+
+            }
+
             if (SharedRessources.getInstance().isWall(x0, y0)) {
 
-                if (step < SharedRessources.getInstance().getStep(oldX - 1, oldY))
+                if (step < SharedRessources.getInstance().getStep(oldX - 1, oldY)) {
                     SharedRessources
                             .getInstance()
                             .getExecutor()
                             .execute(new Flood(oldX - 1, oldY, step));
 
-                if (step < SharedRessources.getInstance().getStep(oldX + 1, oldY))
+                    SharedRessources.getInstance()
+                            .setData(oldX - 1, oldY, 1, 0, step);
+                }
+
+
+                if (step < SharedRessources.getInstance().getStep(oldX + 1, oldY)) {
                     SharedRessources
                             .getInstance()
                             .getExecutor()
                             .execute(new Flood(oldX + 1, oldY, step));
 
-                if (step < SharedRessources.getInstance().getStep(oldX, oldY - 1))
+                    SharedRessources.getInstance()
+                            .setData(oldX + 1, oldY, -1, 0, step);
+                }
+
+                if (step < SharedRessources.getInstance().getStep(oldX, oldY - 1)) {
                     SharedRessources
                             .getInstance()
                             .getExecutor()
                             .execute(new Flood(oldX, oldY - 1, step));
 
-                if (step < SharedRessources.getInstance().getStep(oldX, oldY + 1))
+                    SharedRessources.getInstance()
+                            .setData(oldX, oldY - 1, 0, 1, step);
+
+                }
+
+                if (step < SharedRessources.getInstance().getStep(oldX, oldY + 1)) {
                     SharedRessources
                             .getInstance()
                             .getExecutor()
                             .execute(new Flood(oldX, oldY + 1, step));
 
-                break;
-            } else if (step < currentStep) {
-                int dirX = x0 - oldX;
-                int dirY = y0 - oldY;
+                    SharedRessources.getInstance()
+                            .setData(oldX, oldY + 1, 0, -1, step);
 
-                SharedRessources.getInstance()
-                        .setData(x0, y0, dirX, dirY, step);
+                }
 
+                break;
             }
+
+
+            step++;
+
         }
 
     }
diff --git a/src/approach3/window/MainWindowApproach3.java b/src/approach3/window/MainWindowApproach3.java
index e70b608..ab3226b 100644
--- a/src/approach3/window/MainWindowApproach3.java
+++ b/src/approach3/window/MainWindowApproach3.java
@@ -1,26 +1,91 @@
 package approach3.window;
 
+import approach3.misc.MapLoader;
+import approach3.parallel.SharedRessources;
+import approach3.parallel.WallBasedPathfinder;
 import framework.Game;
 
+import javax.imageio.ImageIO;
 import java.awt.*;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
 
 public class MainWindowApproach3 extends Game {
     public MainWindowApproach3(String title, int w, int h) {
         super(title, w, h);
     }
 
+
+    private WallBasedPathfinder pathfinder;
+
     @Override
     public void loadGame() {
 
+        SharedRessources.setMaxCores(4);
+        try {
+            MapLoader.getDefault().load(ImageIO.read(new File("examples/maze1.png")));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        pathfinder = new WallBasedPathfinder();
+
     }
 
+
+    private boolean pressed;
+
     @Override
     public void updateGame() {
 
+        if (isMouseKeyDown(MouseEvent.BUTTON1))
+            SharedRessources.getInstance().setStart(this.getMouseX() / 5, this.getMouseY() / 5);
+
+        if (isMouseKeyDown(MouseEvent.BUTTON3))
+            SharedRessources.getInstance().setEnd(this.getMouseX() / 5, this.getMouseY() / 5);
+
+        if (isKeyDown(KeyEvent.VK_ENTER) && !pressed) {
+            pressed = true;
+            pathfinder.find();
+
+
+            while (!SharedRessources.getInstance().isFound());
+
+            int beginX = SharedRessources.getInstance().getStart().x;
+            int beginY = SharedRessources.getInstance().getStart().y;
+
+            int endX = SharedRessources.getInstance().getEnd().x;
+            int endY = SharedRessources.getInstance().getEnd().y;
+
+
+            SharedRessources.getInstance()
+                    .getExecutor()
+                    .execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            pts = pathfinder.calculatePath(beginX, beginY, endX, endY);
+                        }
+                    });
+
+        }
+
+        if (isKeyUp(KeyEvent.VK_ENTER))
+            pressed = false;
+
+
     }
 
+    ArrayList<Point> pts;
+
     @Override
     public void renderGame(Graphics g) {
+        if (pathfinder == null)
+            return;
 
+        pathfinder.draw(g);
     }
 }
-- 
GitLab