-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathedge.py
59 lines (49 loc) · 2.81 KB
/
edge.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
## The EDGE class is just a utility class for the GraphViz and GraphMaker classes. It simply represents an edge in
# a graph being constructed, capturing the endpoints of the edge as well as its label. Its biggest active
# contribution is that it is able to compute the edge label based on some distortion percentage (between 0-1) that is
# passed into the constructor as the "label".
__author__ = "Eck Doerry"
__copyright__ = "Copyright 2018, Northern Arizona University, Flagstaff AZ"
import numpy as np
import scipy.spatial as graph
import matplotlib.pyplot as plt
class Edge:
# Makes a new edge. You pass in two points (x,y tuples) plus a label. Label is used flexibly to determine
# how the edge is labeled. If label=0, then edge is just labeled with exact straightline distance between
# the points. If label is a value between 0-1, this is viewed as a percentage to distort the distance by.
# If label > 1, then is taken as an actual value that you want placed on that edge.
def __init__(self, p1,p2, label=0):
self.p1=p1
self.p2=p2
self.x1=p1[0]
self.y1=p1[1]
self.x2=p2[0]
self.y2=p2[1]
self.dist= int(graph.distance.euclidean(p1,p2)) # holds straight cartesian dist between points!
self.midx = abs(p1[0] - p2[0]) / 2 + min(p1[0], p2[0])
self.midy = abs(p1[1] - p2[1]) / 2 + min(p1[1], p2[1])
self.endlabel1=""
self.endlabel2=""
self.label=0 # holds the actual edge value of the edge. Calc'd by distorting the distance
# if a distortion was passed in, randomly distort edge length appropriately.
if label==0: self.label=self.dist # default. Edge label is its length
elif label<1: # label was a distortion percentage. randomly calc length based on it.
adjust=self.dist*label
distortion= np.random.random()*adjust # randomly take some percentage of the adjustment range
self.label = int(self.dist + distortion) # adds on distortion. Roads are ALWAYS longer than SLD
else: self.label=label # label was an actual number you want on the edge
def get(self):
return ([self.x1,self.y1],[self.x2,self.y2],self.label,[self.midx,self.midy])
def midpt(self):
return([self.midx,self.midy])
# Returns true if the edge connects the two labels. Have to check both directions!
def connects(self,label1,label2):
if (label1 == self.endlabel1 and label2 == self.endlabel2) or (label1 == self.endlabel2 and label2 == self.endlabel1):
return True
return False
def setLabels(self,l1,l2): # just stored the node labels at the ends of the edge. For convenience mostly.
self.endlabel1=l1
self.endlabel2=l2
# Unit test main fn
# x= Edge((23,56),(34,45))
# print("created an edge: "+ str(x.get()))