Skip to content

Commit 0dc89c1

Browse files
committed
Working A* with cyhon nodes (i wanted to do the whole pathfinding in Cython (python but compiled to c) however i ran into memory issues i wasn't able to fix in time but oh well)
1 parent 933023f commit 0dc89c1

13 files changed

Lines changed: 25840 additions & 79 deletions

File tree

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,8 @@ venv
33
logs/
44
dist/
55
build/
6+
docs/Concept Art/lina2.png
7+
docs/Concept Art/lina.png
8+
docs/Concept Art/lina.kra
9+
docs/Concept Art/DanielHavingFunWithEyes.kra
10+
docs/Concept Art/CassandraHavingFunWithBrushes.kra

Blobtory/Scripts/planet_former/AStar.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1-
from copy import deepcopy
1+
from copy import deepcopy, copy
22
from typing import Dict, Set, List, Tuple
3-
from Blobtory.Scripts.planet_former.NodeRef import NodeRef, NodeKey
3+
from Blobtory.Scripts.planet_former.Nodes import NodeRef, NodeKey, Node
44
from queue import PriorityQueue
55
from multipledispatch import dispatch
6+
import numpy as np
67

78

8-
def GetDist(pFrom: Tuple[float, float, float, float],
9-
pTo: Tuple[float, float, float, float]):
9+
def GetDist(pFrom: Node,
10+
pTo: Node):
1011
return (abs(pFrom[0] - pTo[0]) +
1112
abs(pFrom[1] - pTo[1]) +
1213
abs(pFrom[2] - pTo[2]))
1314

1415

1516
def ReconstructPath(cameFrom: Dict[NodeRef, NodeKey], current: NodeKey):
16-
totalPath: List[Tuple[float, float, float, float]] = [current.point]
17+
totalPath: List[Node] = [current]
1718
while current in cameFrom.keys():
1819
current = cameFrom[current]
19-
totalPath.insert(0, current.point)
20+
totalPath.insert(0, current)
2021

2122
return totalPath
2223

@@ -30,18 +31,18 @@ def __init__(self, nodeDict: Dict):
3031
self.keyList = list(self.nodeDict.keys())
3132

3233
def GetKeyNodeFromRef(self, p: NodeRef) -> NodeKey:
33-
return self.keyList[self.keyList.index(p.point)]
34+
return self.keyList[self.keyList.index(p)]
3435

35-
def GetKeyNodeFromPoint(self, p: Tuple[float, float, float, float]) -> NodeKey:
36+
def GetKeyNodeFromPoint(self, p: Node) -> NodeKey:
3637
return self.keyList[self.keyList.index(p)]
3738

3839
def GetH(self, p: NodeKey) -> float:
3940
return 1/p.weight
4041

4142
def GetPathFromTo(self,
42-
pFrom: Tuple[float, float, float, float],
43-
pTo: Tuple[float, float, float, float]
44-
) -> List[Tuple[float, float, float, float]]:
43+
pFrom: Node,
44+
pTo: Node
45+
) -> List[Node]:
4546
startNode = self.GetKeyNodeFromPoint(pFrom)
4647
openSet = PriorityQueue()
4748
openSet.put((0, startNode))
@@ -50,7 +51,7 @@ def GetPathFromTo(self,
5051
gScore = {nodeKey: float("inf") for nodeKey in self.nodeDict.keys()}
5152
gScore[pFrom] = 0
5253

53-
fScore = deepcopy(gScore)
54+
fScore = copy(gScore)
5455
fScore[pFrom] = self.GetH(startNode)
5556

5657
openSetTable = {startNode}
@@ -65,7 +66,7 @@ def GetPathFromTo(self,
6566

6667
neighbourPoints: Set[NodeRef] = self.nodeDict[current]
6768
for neighbourPoint in neighbourPoints:
68-
tentativeGScore = gScore[current] + GetDist(current.point, neighbourPoint.point)
69+
tentativeGScore = gScore[current] + GetDist(current, neighbourPoint)
6970

7071
if tentativeGScore < gScore[neighbourPoint]:
7172
cameFrom[neighbourPoint] = current
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#error Do not use this file, it is the result of a failed Cython compilation.
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
from copy import deepcopy
2+
from typing import Dict, Set, List, Tuple
3+
from queue import PriorityQueue
4+
from Blobtory.Scripts.planet_former.Nodes cimport NodeRef, NodeKey
5+
cdef extern class Node:
6+
cdef extern float* point
7+
cdef extern char* hashKey
8+
9+
cdef extern class NodeRef(Node):
10+
cdef extern float relativeDist
11+
12+
cdef extern class NodeKey(Node):
13+
cdef extern float weight
14+
15+
from libcpp.map cimport map
16+
from libcpp.string cimport string
17+
from libcpp.vector cimport vector
18+
19+
def GetDist(pFrom: Tuple[float, float, float, float],
20+
pTo: Tuple[float, float, float, float]):
21+
return (abs(pFrom[0] - pTo[0]) +
22+
abs(pFrom[1] - pTo[1]) +
23+
abs(pFrom[2] - pTo[2]))
24+
25+
26+
def ReconstructPath(cameFrom: Dict[NodeRef, NodeKey], current: NodeKey):
27+
cdef list totalPath = [current.point]
28+
while current in cameFrom.keys():
29+
current = cameFrom[current]
30+
totalPath.insert(0, current.point)
31+
32+
return totalPath
33+
34+
35+
36+
class AStar:
37+
def __init__(self, nodeDict: Dict):
38+
self.nodeDict = nodeDict
39+
self.keyList = list(self.nodeDict.keys())
40+
41+
def GetKeyNodeFromRef(self, p: NodeRef) -> NodeKey:
42+
return self.keyList[self.keyList.index(p.point)]
43+
44+
def GetKeyNodeFromPoint(self, p: Tuple[float, float, float, float]) -> NodeKey:
45+
return self.keyList[self.keyList.index(p)]
46+
47+
def GetH(self, p: NodeKey) -> float:
48+
return 1/p.weight
49+
50+
def GetPathFromTo(self,
51+
pFrom: Tuple[float, float, float, float],
52+
pTo: Tuple[float, float, float, float]
53+
) -> List[Tuple[float, float, float, float]]:
54+
startNode = self.GetKeyNodeFromPoint(pFrom)
55+
openSet = PriorityQueue()
56+
openSet.put((0, startNode))
57+
cdef map[NodeRef, NodeKey] cameFrom = {}
58+
59+
gScore = {nodeKey: float("inf") for nodeKey in self.nodeDict.keys()}
60+
gScore[pFrom] = 0
61+
62+
fScore = deepcopy(gScore)
63+
fScore[pFrom] = self.GetH(startNode)
64+
65+
openSetTable = {startNode}
66+
67+
while not openSet.empty():
68+
setVal = openSet.get()
69+
current = setVal[1]
70+
openSetTable.remove(current)
71+
72+
if current == pTo:
73+
return ReconstructPath(cameFrom, current)
74+
75+
neighbourPoints = self.nodeDict[current]
76+
for neighbourPoint in neighbourPoints:
77+
tentativeGScore = gScore[current] + GetDist(current.point, neighbourPoint.point)
78+
79+
if tentativeGScore < gScore[neighbourPoint]:
80+
cameFrom[neighbourPoint] = current
81+
gScore[neighbourPoint] = tentativeGScore
82+
fScore[neighbourPoint] = gScore[neighbourPoint] + self.GetH(self.GetKeyNodeFromRef(neighbourPoint))
83+
if neighbourPoint not in openSetTable:
84+
openSet.put((fScore[neighbourPoint], neighbourPoint))
85+
openSetTable.add(neighbourPoint)
86+
87+
return []

Blobtory/Scripts/planet_former/MarchingCubes.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ def GenerateMesh(self):
121121
self.winCreator.base.render.find("**/node").removeNode()
122122

123123
self.geomPath = self.winCreator.base.render.attach_new_node(node)
124-
self.geomPath.setPos(
125-
-self.size.getX()*0.5*self.cubeformer.spacing,
126-
-self.size.getY()*0.5*self.cubeformer.spacing,
127-
-self.size.getZ()*0.5*self.cubeformer.spacing)
124+
# self.geomPath.setPos(
125+
# -self.size.getX()*0.5*self.cubeformer.spacing,
126+
# -self.size.getY()*0.5*self.cubeformer.spacing,
127+
# -self.size.getZ()*0.5*self.cubeformer.spacing)
128128

129129
self.winCreator.pipelineSwitcher.AddModelWithShaderGeneralName(self.geomPath, "assets/shaders/planets/planet")
130130
self.geomPath.set_shader_input('vertexBufferEdge', self.edgeVertexBuffer)

Blobtory/Scripts/planet_former/NodeRef.py

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)