From 0a2b1c28af8a4765f0f7c881a54f1ca698969f29 Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Sat, 19 Jun 2021 13:01:26 +0200 Subject: [PATCH] Basic A* --- src/main/java/Main/AStar.java | 92 +++++++++++++++ src/main/java/Main/ControlPanel.java | 54 +-------- src/main/java/Main/Map.java | 109 ++++++++++++++---- src/main/java/Main/Node.java | 36 +++++- src/main/java/Main/PathfinderUtils.java | 22 +++- target/PathVisualizer-1.0-SNAPSHOT.jar | Bin 8902 -> 10529 bytes target/classes/Main/AStar.class | Bin 0 -> 2881 bytes target/classes/Main/ControlPanel$1.class | Bin 1953 -> 0 bytes target/classes/Main/ControlPanel.class | Bin 1777 -> 1423 bytes target/classes/Main/Map.class | Bin 4987 -> 6897 bytes target/classes/Main/Node.class | Bin 660 -> 1431 bytes target/classes/Main/PathfinderUtils.class | Bin 975 -> 1431 bytes .../compile/default-compile/createdFiles.lst | 2 +- .../compile/default-compile/inputFiles.lst | 1 + target/surefire-reports/Main.AppTest.txt | 2 +- target/surefire-reports/TEST-Main.AppTest.xml | 6 +- 16 files changed, 245 insertions(+), 79 deletions(-) create mode 100644 src/main/java/Main/AStar.java create mode 100644 target/classes/Main/AStar.class delete mode 100644 target/classes/Main/ControlPanel$1.class diff --git a/src/main/java/Main/AStar.java b/src/main/java/Main/AStar.java new file mode 100644 index 0000000..6a60a95 --- /dev/null +++ b/src/main/java/Main/AStar.java @@ -0,0 +1,92 @@ +package Main; + +public class AStar{ + private Map map; + + public AStar(Map map) { + this.map = map; + } + + public void start() { + searchPath(PathfinderUtils.startNode); + } + + public void searchPath(Node parent) { + for (int i = 0; i < 4; i++) { + int x = (int) Math.round(parent.getX() + (-map.size* Math.cos((Math.PI / 2) * i))); + int y = (int) Math.round(parent.getY() + (-map.size* Math.sin((Math.PI / 2) * i))); + + calculateOpenNode(x, y, parent); + } + + parent = getNextBestNode(); + + PathfinderUtils.closedNodes.add(parent); + PathfinderUtils.openNodes.remove(parent); + + if (parent.getX() == PathfinderUtils.endNode.getX() && parent.getY() == PathfinderUtils.endNode.getY()) { + ControlPanel.toggleRunBtn.setText("End"); + map.isFinished = true; + map.repaint(); + return; + } + + if (!map.isFinished) { + searchPath(parent); + } + else + System.exit(0); + } + + public void calculateOpenNode(int nextX, int nextY, Node parent) { + if (nextX >= Map.width || nextY >= Map.height || nextX < 0 || nextY < 0) + return; + if (PathfinderUtils.locateBarrier(nextX, nextY) != -1) + return; + if (nextX == PathfinderUtils.startNode.getX() && nextY == PathfinderUtils.startNode.getY()) + return; + + Node openNode = new Node(nextX, nextY); + openNode.setParentNode(parent); + + // Tests if a copy of the node has already been added + for (Node node : PathfinderUtils.closedNodes) { + if(openNode.getX() == node.getX() && openNode.getY() == node.getY()) + return; + } + + // Tests if a copy of the node has already been added + for (Node node : PathfinderUtils.openNodes) { + if(openNode.getX() == node.getX() && openNode.getY() == node.getY()) + return; + } + + int gx = openNode.getX() - parent.getX(); + int gy = openNode.getY() - parent.getY(); + int g = parent.getG(); + + if (gx != 0 && gy != 0) { + g += (int) (Math.sqrt(2 * (Math.pow(map.size, 2)))); + } else { + g += map.size; + } + openNode.setG(g); + + // Calculating H Cost + int hx = Math.abs(PathfinderUtils.endNode.getX() - openNode.getX()); + int hy = Math.abs(PathfinderUtils.endNode.getY() - openNode.getY()); + int h = hx + hy; + openNode.setH(h); + + // Calculating F Cost + int f = g + h; + openNode.setF(f); + + PathfinderUtils.openNodes.add(openNode); + } + + public Node getNextBestNode() { + PathfinderUtils.sort(); + return PathfinderUtils.openNodes.get(0); + } +} diff --git a/src/main/java/Main/ControlPanel.java b/src/main/java/Main/ControlPanel.java index 6c57821..e5186ef 100644 --- a/src/main/java/Main/ControlPanel.java +++ b/src/main/java/Main/ControlPanel.java @@ -2,22 +2,15 @@ package Main; import java.awt.Color; import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JComboBox; -import javax.swing.JOptionPane; public class ControlPanel { - private Map map; - - private JButton toggleRunBtn; - private JComboBox algo; + static JButton toggleRunBtn; + static JComboBox algo; public ControlPanel(Map map) { - this.map = map; - algo = new JComboBox<>(new String[] { "Select an algorithm", "A*", "Dijkstra", "Breadth-first search"}); algo.setVisible(true); @@ -25,48 +18,7 @@ public class ControlPanel { toggleRunBtn.setVisible(true); toggleRunBtn.setMargin(new Insets(0, 0, 0, 0)); toggleRunBtn.setBackground(Color.white); - toggleRunBtn.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - - if (toggleRunBtn.getText().equals("Run")) { - switch (algo.getItemAt(algo.getSelectedIndex())) { - - case ("A*"): - System.out.println("A* selected"); - // AStar.start(); - break; - - case ("Dijkstra"): - System.out.println("Dijkstra selected"); - // AStar.start(); - break; - - case ("Greedy best-first search"): - System.out.println("Greedy best-first search selected"); - // AStar.start(); - break; - - case ("Breadth-first search"): - System.out.println("Breadth-first search selected"); - // AStar.start(); - break; - - default: - JOptionPane.showMessageDialog(null, - "You must select an algorithm before starting the pathfinder", "Algorithm not selected", - JOptionPane.ERROR_MESSAGE); - return; - } - - toggleRunBtn.setText("Stop"); - } - - else { - toggleRunBtn.setText("Run"); - } - } - }); + toggleRunBtn.addActionListener(map); map.add(algo); map.add(toggleRunBtn); diff --git a/src/main/java/Main/Map.java b/src/main/java/Main/Map.java index 36f8ff2..167847a 100644 --- a/src/main/java/Main/Map.java +++ b/src/main/java/Main/Map.java @@ -9,25 +9,33 @@ */ package Main; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - import java.awt.Color; import java.awt.Graphics; -import java.awt.event.MouseListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionListener; +import java.awt.Dimension; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; -class Map extends JPanel implements MouseListener, MouseMotionListener, KeyListener { +class Map extends JPanel implements ActionListener, MouseListener, MouseMotionListener, KeyListener { private JFrame window; - private int size = 30; private char key = (char) 0; private ControlPanel menu = new ControlPanel(this); + static int width; + static int height; + boolean isFinished = false; + + int size = 30; + public Map() { this.setBackground(new Color(40, 40, 40)); @@ -40,10 +48,14 @@ class Map extends JPanel implements MouseListener, MouseMotionListener, KeyListe window = new JFrame(); window.setContentPane(this); window.setTitle("Pathfinding Algorithm Visualizer"); + window.getContentPane().setPreferredSize(new Dimension(1920, 1080)); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.pack(); window.setVisible(true); + width = this.getWidth(); + height = this.getHeight(); + this.revalidate(); this.repaint(); } @@ -78,6 +90,18 @@ class Map extends JPanel implements MouseListener, MouseMotionListener, KeyListe } menu.renderMenu(); + + // Draws open nodes + g.setColor(Color.white); + for (Node node : PathfinderUtils.openNodes) { + g.fillRect(node.getX() + 1, node.getY() + 1, size - 1, size - 1); + } + + // Draws closed nodes + g.setColor(Color.orange); + for (Node node : PathfinderUtils.closedNodes) { + g.fillRect(node.getX() + 1, node.getY() + 1, size - 1, size - 1); + } } // Drawing on the grid @@ -92,7 +116,8 @@ class Map extends JPanel implements MouseListener, MouseMotionListener, KeyListe // Checks if start node and end node are the same if (PathfinderUtils.endNode != null) { if (PathfinderUtils.endNode.getX() == posX && PathfinderUtils.endNode.getY() == posY) { - JOptionPane.showMessageDialog(null, "End node and start node can't be the same node", "Same node error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, "End node and start node can't be the same node", + "Same node error", JOptionPane.ERROR_MESSAGE); return; } } @@ -115,7 +140,8 @@ class Map extends JPanel implements MouseListener, MouseMotionListener, KeyListe // Checks if end node and start node are the same if (PathfinderUtils.startNode != null) { if (PathfinderUtils.startNode.getX() == posX && PathfinderUtils.startNode.getY() == posY) { - JOptionPane.showMessageDialog(null, "End node and start node can't be the same node!", "SAME NODE ERROR", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, "End node and start node can't be the same node!", + "SAME NODE ERROR", JOptionPane.ERROR_MESSAGE); return; } } @@ -137,7 +163,6 @@ class Map extends JPanel implements MouseListener, MouseMotionListener, KeyListe // TODO controlla se si sta creando una barriera su start o end - PathfinderUtils.barriers.add(barrierNode); repaint(); @@ -164,7 +189,7 @@ class Map extends JPanel implements MouseListener, MouseMotionListener, KeyListe } else { - int nodeID = PathfinderUtils.locate(posX, posY); + int nodeID = PathfinderUtils.locateBarrier(posX, posY); if (nodeID != -1) { PathfinderUtils.remove(nodeID); @@ -195,21 +220,65 @@ class Map extends JPanel implements MouseListener, MouseMotionListener, KeyListe } @Override - public void keyTyped(KeyEvent e) {} + public void actionPerformed(ActionEvent e) { + if (ControlPanel.toggleRunBtn.getText().equals("Run")) { + switch (ControlPanel.algo.getItemAt(ControlPanel.algo.getSelectedIndex())) { + + case ("A*"): + System.out.println("A* selected"); + new AStar(this).start(); + break; + + case ("Dijkstra"): + System.out.println("Dijkstra selected"); + // AStar.start(); + break; + + case ("Greedy best-first search"): + System.out.println("Greedy best-first search selected"); + // AStar.start(); + break; + + case ("Breadth-first search"): + System.out.println("Breadth-first search selected"); + // AStar.start(); + break; + + default: + JOptionPane.showMessageDialog(null, "You must select an algorithm before starting the pathfinder", + "Algorithm not selected", JOptionPane.ERROR_MESSAGE); + return; + } + + ControlPanel.toggleRunBtn.setText("Stop"); + } + + else { + ControlPanel.toggleRunBtn.setText("Run"); + } + } @Override - public void mouseClicked(MouseEvent e) {} + public void keyTyped(KeyEvent e) { + } @Override - public void mouseReleased(MouseEvent e) {} + public void mouseClicked(MouseEvent e) { + } @Override - public void mouseEntered(MouseEvent e) {} + public void mouseReleased(MouseEvent e) { + } @Override - public void mouseExited(MouseEvent e) {} + public void mouseEntered(MouseEvent e) { + } @Override - public void mouseMoved(MouseEvent e) {} + public void mouseExited(MouseEvent e) { + } + @Override + public void mouseMoved(MouseEvent e) { + } } diff --git a/src/main/java/Main/Node.java b/src/main/java/Main/Node.java index 479a5fb..1df44d5 100644 --- a/src/main/java/Main/Node.java +++ b/src/main/java/Main/Node.java @@ -1,7 +1,8 @@ package Main; public class Node { - private int x, y; + private int x, y, f = 0, g = 0, h = 0; + private Node parentNode; public Node(int x, int y) { this.x = x; @@ -23,4 +24,37 @@ public class Node { public void setX(int x) { this.x = x; } + + public Node getParentNode() { + return parentNode; + } + + public void setParentNode(Node parentNode) { + this.parentNode = parentNode; + } + + + public int getF() { + return f; + } + + public void setF(int f) { + this.f = f; + } + + public int getG() { + return g; + } + + public void setG(int g) { + this.g = g; + } + + public int getH() { + return h; + } + + public void setH(int h) { + this.h = h; + } } diff --git a/src/main/java/Main/PathfinderUtils.java b/src/main/java/Main/PathfinderUtils.java index 5604538..528a005 100644 --- a/src/main/java/Main/PathfinderUtils.java +++ b/src/main/java/Main/PathfinderUtils.java @@ -5,18 +5,36 @@ import java.util.List; public class PathfinderUtils { static List barriers = new ArrayList<>(); + static List openNodes = new ArrayList<>(); + static List closedNodes = new ArrayList<>(); static Node startNode, endNode; - static int locate(int x, int y) { + // Returns index of barrier if the coordinates are of a barrier node + static int locateBarrier(int x, int y) { for (int i = 0; i < barriers.size(); i++) { - if(barriers.get(i).getX() == x && barriers.get(i).getY() == y) + if (barriers.get(i).getX() == x && barriers.get(i).getY() == y) return i; } return -1; } + // Removes barrier node static void remove(int id) { barriers.remove(id); } + + static void sort() { + Node tmp; + + for (int i = 0; i < openNodes.size(); i++) { + for (int j = 0; j < openNodes.size(); j++) { + if (openNodes.get(i).getF() < openNodes.get(j).getF()) { + tmp = openNodes.get(j); + openNodes.set(j, openNodes.get(i)); + openNodes.set(i, tmp); + } + } + } + } } diff --git a/target/PathVisualizer-1.0-SNAPSHOT.jar b/target/PathVisualizer-1.0-SNAPSHOT.jar index f6745016c95ba1301b57088bc64760982bdb25f1..39668b14f55524d269800ce1d9d903ab3692a8ff 100644 GIT binary patch delta 8217 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 Gr~DrWkUXgX diff --git a/target/classes/Main/AStar.class b/target/classes/Main/AStar.class new file mode 100644 index 0000000000000000000000000000000000000000..e722d34d013d6539e90fc14e7062d48e62519e27 GIT binary patch literal 2881 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 diff --git a/target/classes/Main/ControlPanel.class b/target/classes/Main/ControlPanel.class index 340d99e184cc669282b6ffa42af863d8e5b86be6..920e67e59aa47f53584766312ba2b8e1fef391d6 100644 GIT binary patch literal 1423 zcmZva>rxv>5QV=%f|Zs<=)%o0cCZ~20RcI2ZbXC_$#E=4*cdrr;oKH!vRW*5$?nMb zwIWxEs!+}YO>K>L}%VMM2zdJHBB0a=7dt?)xSG zby1M4xsGS6P9OzK|Ib>B;6mH>oI*_nuICiji-M6g*K^gnU@TwVv|X>TX&)6Ab_DUV z-;{#!s_V(eox^<@JhS)PQjo3s4ZFQ#2d+M!fpOJxLqV>eqwISs@Y`FqC)-6q?9e_E zm>2m4W+1($3^t|L5ybMkpjq=fK|?-pb&=JfmmSG5iWLmP{N#C`YRWvBvMFi{Gm-BhjRU)&&6bD^|@MoSl~TD;4g#U_sh zxl3jHixI@OJD#RKvAD){!FVLXK30W_7fKcC*p|gpwhd|)&-l(_hh2;3)D8A5Uhuue z5BzBHlQuuICCEf;80`O2cTe^YWJ3w2@-GH9+DD_snW0oWZshAO~K;8t+Ic3 zY;RLXdBc0%F}$u7xw5A&4K zde%B&>`ad6sqyTb%7 literal 1777 zcmZvcYj+b>6o#Ljq|L=CO%qzKYQZ8&3WNe)gJ=_^4W@tug8{rulS48kong(K0AKtn ze@9)At|d!-@W&lzyAIGPv9b(Nn*mxn(esdn&)cY z8{D#8HAs>WvK#gjyF9SnUis$whU#b`zG*)eGK~N3xMVKnQ5msyoiJI3{8RE=XOpz1fg<>m>aL{6c$s}{a>@K-GdXgO8VcZAecXX8i49iuEFS#a61xi=#&ZD014c)GgA7hH5O+{9P{GO3sSjw=%bz|WxQ}t+6#)rNV zIa;&0!A)Vt?sk_u+VR|m6KLfsUpP6&r=BQRmv={mDZZweZaA*GG2C2N{vA7PdamJh>_N-+9rJ(tFroWSAmsP)BxHQ$ zc9p-T+@Tqz2NvJ)y^!iDeb?#ge)ufv=ITca+gzo4O0O!X*VpE>W6?ETHyy5;vInLk z9U*0RIw}Yj&WEP<6nxv$-cP{}Zb>+^ZyUl|yvFUkNn@qy4gHR~=9uxH8SmXWGgE?9 zcU|Sz26hmrfD;IDAWqD@cOYhlJY3Uc5Z(&+772tY4j@be|BxgGJTGmLEiJwzUwXxC zJNXBP+VR|xW;>BP)@)DY-fp%hbMH2{IPsE&(hC+6Bi=8)qSVfv+2Y(wmP#*JN{qN@ z)>m9=$K&z%79WoI#GL%bXCrFS-AcQ(MSVnL(Igsi>#o@>na!`E$QEz`3&@cmPnucI zFvlehv&<3d9OXX8P#j0I!cVO7Gj;9)bCDgsrH%PL56dA4_sDIVe!v6*lnj41lg&gr z?nlcHBi4ROO!tTZgbiK^{qi54E|!J> diff --git a/target/classes/Main/Map.class b/target/classes/Main/Map.class index f08455046d96f4cffd047e12075a8a0ad5cc47d8..28b921daf45d913656448e9b0545604e806d7037 100644 GIT binary patch literal 6897 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 literal 4987 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 R;-i5f4h;bDPcIMu`X4w>wc!8& diff --git a/target/classes/Main/Node.class b/target/classes/Main/Node.class index 8ff1fb222e009e5806cc7c7529a3a2e888feaac2..930f2951c3a36fe849966c6cd6a37e211530f7d2 100644 GIT binary patch literal 1431 zcmZ|OT~E_c7{KxW)3qBLD=$NkcL5c*qD;YfA%+_hWXVJm4Z+KTwUo?ZMlt%GywJqO z#0x)wAIg~Lv_Yud&2x6%p7T4;PJjRT`3uJb>^lcyvx1ak_x2c^iq4*@~M)9`b)LX5_zFE>-LEWN%OFYzj7bR378$uO0yx*!z|L=T?Ng*aKrWG-YOAL9J0Qv#X6VRisS|22gy zawDfArLUQaEaXC#SpKgfYkf*t$TAKq10eb=6ta?A5i47f)m+HU{EApvh=;@40EoU@ zh1|-86ta-@T*&QwNFfW^z+rO$L_ZvbtmZ=OEaXux#x<}oz> E0y;&ADgXcg literal 660 zcmZ{hPfG$p7{-6^I=k!YmS$%Eqi*IQ4;_mxK_HkN3aR62gKe0CZBgH;OHc$I`T%{X zh?y0OusQ6^`_4Si^P8Q|ulEmNmyH}QO96^y^I7p(^;r|-L6C+ZkAk-!58~uNaI1~R zc3V(~!%Hm`n(;ul?ru7IbQX2`S|~M#-KgJ=MzN{KO_f~5w?e*o9L0lrYj~;m1l7~Y zg^;OkHw1NS3sp_sdpbE!o99CAba*%F>Z92B2S&Yf9oY}j6o#KOqP27C6p>YDll$1hi$E7U|ICTqBXhRnuO`IW_;Mmc4 zTv68j1MFE;l~6a`U?i%5gxJD=;Ro~sitZibxB)Njz3=gP&pGdV=8wOB{uNl}noX87 z7Q?)qW|_0g>P<2@BQuM#dOSW>W@WW~mbc$Fj;#^0;>h3S+I81&7H_n+yi!Hww)VZILTw>kZ?xLpRu5V2 z&<#Qbg!BMQNP113BqYjy(+?|xSy;Fw#IES<;hNv{ZgloGz2H-Kv*8INwN~A2+;Rh7 z;a)Hn?)YtCEUNv98}5ARH@CdtX6QHCC1I%1s=J|gIg%>G3)SjERS;hgb$>0$U14ZF zbn9PTclUdB6M?tay5kA4LRC#=_*+7(-3mg%4EOd0*%eaddZRbIz252sb#K*Iqvnnb zvZU;Fm|)W36-JU=a=6SDhYz?aSbaAgR#o&vbriVjaEuX$j})x3CX61g=~585ch#;O z#uyQDy2z2fLRK>xZgac%@#d~q4~5KO5ye-s{BJyMe^oHIy-+w-s4hfHAE1_m*tQpb z7G1ZaYgI7YiZWlQ{+IDTMVMunED$H9%s?0g405ED-k0#$5&SCSK#Jq~jw8xbggj70 z5LI{aG4g{hc>+l2V1g;Yi4vG*Mwgl8WRLtE1}0E3SMptq15DuoXSx{q17Zfh5&wzA z#C^tJ4kah=6VE@oXUM}BzZ;JLQ+FLB4rItM%vrLWBSV={J;e+r1{XNR9ER%2Ys{g3 z6;3mUFb~+6&oN~AsWz&>LT}RZ7+OWTi!pIP%3$MAtgQ=_5+p%Bi9t@GY&|bY$&)GJ+(#O-xGQG;#)Ov z$pWGHOWC%gkt}lGvokVIdUt=k?Y<%S8ot delta 456 zcmYk2OD_Xq6o#K~rtM5;rj%aXs(L}|I%pLo6&p56Vkbm0p^HkRNtMLTUue4M?+^8Q~gn5Gn3qOkzT-jMN zShfg~H&`(!bdIW>=X)d2Xr6oRT6a%ucYDI!jS_PR(PvO}Sf%8!#=0O__3BsdLGz;K zupzr;2^l$xTza>jd(*Br+?`g-yW6i{x4S8=T_TN*1L&C25Hhnl02~omki?GtB(9tL}P7)2M zFhLR-6;dP-qyY>43r!S0@ne!9tNcx0;#B%uN*To>_HQ4XN#$fR^}9QeRZOs72_8RT RJ)%7Tg1?gt1k>sfxgTYbFZuug diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 6b22cb6..b1dccf0 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,5 +1,5 @@ -Main/ControlPanel$1.class Main/Node.class +Main/AStar.class Main/ControlPanel.class Main/Map.class Main/App.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index b97cf8a..cdd74a9 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,5 +1,6 @@ /home/leo/Docs/Proj/PathVisualizer/src/main/java/Main/ControlPanel.java /home/leo/Docs/Proj/PathVisualizer/src/main/java/Main/Map.java /home/leo/Docs/Proj/PathVisualizer/src/main/java/Main/Node.java +/home/leo/Docs/Proj/PathVisualizer/src/main/java/Main/AStar.java /home/leo/Docs/Proj/PathVisualizer/src/main/java/Main/App.java /home/leo/Docs/Proj/PathVisualizer/src/main/java/Main/PathfinderUtils.java diff --git a/target/surefire-reports/Main.AppTest.txt b/target/surefire-reports/Main.AppTest.txt index b957bda..bdab1da 100644 --- a/target/surefire-reports/Main.AppTest.txt +++ b/target/surefire-reports/Main.AppTest.txt @@ -1,4 +1,4 @@ ------------------------------------------------------------------------------- Test set: Main.AppTest ------------------------------------------------------------------------------- -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 s - in Main.AppTest +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.02 s - in Main.AppTest diff --git a/target/surefire-reports/TEST-Main.AppTest.xml b/target/surefire-reports/TEST-Main.AppTest.xml index 9f3f13d..396d6b0 100644 --- a/target/surefire-reports/TEST-Main.AppTest.xml +++ b/target/surefire-reports/TEST-Main.AppTest.xml @@ -1,5 +1,5 @@ - + @@ -16,7 +16,7 @@ - + @@ -32,7 +32,7 @@ - + -- 2.52.0