65 assert is_real(scalar) |
65 assert is_real(scalar) |
66 return type(self)(self.x // scalar, self.y // scalar, self.z // scalar) |
66 return type(self)(self.x // scalar, self.y // scalar, self.z // scalar) |
67 def __matmul__(self, transformation_matrix): |
67 def __matmul__(self, transformation_matrix): |
68 return transform(self, transformation_matrix) |
68 return transform(self, transformation_matrix) |
69 def __eq__(self, other): |
69 def __eq__(self, other): |
70 return self.is_close(other, threshold = 1e-10) |
70 return self.is_close(other, threshold = 1.0e-10) |
71 def __ne__(self, other): |
71 def __ne__(self, other): |
72 return not self.__eq__(other) |
72 return not self.__eq__(other) |
73 def __lt__(self, other): |
73 def __lt__(self, other): |
74 return self.coordinates < other.coordinates |
74 return self.coordinates < other.coordinates |
75 def __hash__(self): |
75 def __hash__(self): |
76 return hash(self.coordinates) |
76 return hash(self.coordinates) |
77 def is_close(self, other, *, threshold): |
77 def is_close(self, other, *, threshold = 1.0e-05): |
78 return all( |
78 return self.distance_to(other) < threshold |
79 abs(a - b) < threshold |
79 #return all( |
80 for a, b in zip(self.coordinates, other.coordinates) |
80 # abs(a - b) < threshold |
81 ) |
81 # for a, b in zip(self.coordinates, other.coordinates) |
82 |
82 #) |
83 class VertexOp: |
|
84 def __init__(self, callable): |
|
85 self.callable = callable |
|
86 def __rmul__(self, coordinate): |
|
87 return self.callable(coordinate) |
|
88 |
83 |
89 class LineSegment: |
84 class LineSegment: |
90 def __init__(self, v1, v2): |
85 def __init__(self, v1, v2): |
91 self.v1, self.v2 = v1, v2 |
86 self.v1, self.v2 = v1, v2 |
92 def __repr__(self): |
87 def __repr__(self): |