Add the RouteFinding Part 0 assignment files.

This commit is contained in:
Charles Descamps 2025-02-14 16:21:01 -07:00
parent d6d0b03547
commit f23ca49f82
6 changed files with 797 additions and 0 deletions

66
RouteFinding/node.py Normal file
View file

@ -0,0 +1,66 @@
'''Node.py: This class implements simple node object and associated methods.
Nodes are created by passing in an x,y cartesian location for the node. Node labels are created
by just assigning letters to nodes in ascending ASCII order; current index is kept as class variable
to ensure that each new node has a unique label.
The most interesting internal method here is makeLabel, which generates unique labels. We want easy to read
alpha labels...so it basically counts up in Base26, generating the corresponding ASCII labels. Tricky!
'''
__author__ = "Eck Doerry"
__copyright__ = "Copyright 2018, Northern Arizona University, Flagstaff AZ"
import scipy.spatial as graph
import numpy as np
class Node:
# CLASS VAR: curIndex is used to make sure that all nodes have a unique label. Incremented every time a new
# node is generated.
curIndex=1
# CLASS METHOD. Allows for reseting the index counter for generating new nodes. Used only for debugging!
def reset(cls):
cls.curIndex=1
# Create a new node at point x-y. Optionally pass in a label for the node. If no explicit label is passed
# in (which is usually the case), it auto-generates the next label in a sequences starting with A-Z, then
# going to AA, AB, AC, etc.
def __init__(self,newX,newY, newLabel= '*'):
self.x=newX
self.y=newY
if newLabel=='*':
self.label=self.makeLabel()
else:
self.label=newLabel
# Makes an upper case label starting at 'A'. If >26 nodes, goes to 'AB', 'AC', etc.
# Works by basically counting in Base26: converts the index into strings in Base26!
def makeLabel(self):
index=self.curIndex
out = []
while index>25:
out.append(index % 26)
index = int(index / 26)
out.append(index-1)
out.reverse()
Node.curIndex +=1
return "".join([chr(65+x) for x in out])
# Distance: returns the cartesian distance between this node some other node that is passed in.
def distance(self,aNode):
return graph.distance.euclidean([self.x,self.y],[aNode.x,aNode.y])
def get(self):
return ([self.x,self.y],self.label)
# Unit tests
# x=Node(4,5)
# y=Node(1,2)
# print(x.get())
# print(y.get())