-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgeometry.py
105 lines (78 loc) · 3.01 KB
/
geometry.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import numpy as np
class point(object):
def __init__(self, parameters):
self.params = list(parameters)
assert all([isinstance(p,float) for p in self.params])
self.np_params = np.array(self.params)
assert self.np_params.shape == (2,)
def __eq__(self, other):
if isinstance(other, point):
if other.params == self.params:
return True
return False
def __ne__(self, other):
return not self.__eq__(other)
def __repr__(self):
return "point(" + repr(self.params) + ")"
def __str__(self):
return "point(" + str(self.params) + ")"
def __hash__(self):
return hash(repr(self))
class segment(object):
def __init__(self, points):
self.points = list(points)
assert all([isinstance(p,point) for p in self.points])
assert len(self.points) == 2
self.params = [p.params for p in self.points]
self.np_params = np.array(self.params)
def reverse(self):
return segment(reversed(self.points))
def transport(self):
return self.np_params[1] - self.np_params[0], self.np_params[0]
def length(self):
return ((self.np_params*np.array([[1],[-1]])).sum(0)**2).sum()
def __eq__(self, other):
if isinstance(other,segment):
return self.points == other.points
return False
def __ne__(self, other):
return not self.__eq__(other)
def __repr__(self):
return "segment(" + repr(self.params) + ")"
def __str__(self):
return "segment" + str(self.params) + ")"
class triangle(object):
def __init__(self, vertices):
self.points = list(vertices)
assert all([isinstance(p,point) for p in self.points])
assert len(self.points) == 3
self.params = [p.params for p in self.points]
self.np_params = np.array(self.params)
def isinside(self, p0):
a = self.np_params - p0.np_params
b = [np.sign(np.linalg.det(a[[0,1],:])), np.sign(np.linalg.det(a[[1,2],:])), np.sign(np.linalg.det(a[[2,0],:]))]
return all([x == 1 for x in b]) or any([x == 0 for x in b])
def transport(self, p0):
i = self.points.index(p0)
rows = [True]*3
rows[i] = False
T = self.np_params[rows]
if np.linalg.det(T) < 0:
T = T[[1,0]]
return T.transpose(), p0.np_params
def vertices(self):
return list(self.points).copy()
def rotate_vertices(self, rot = [0,1,2]):
return triangle([point(p.params) for p in self.np_params[rot,:]])
def size(self):
return 0.5*np.abs(np.linalg.det(np.c_[self.np_params,np.ones(3)]))
def __eq__(self, other):
if not isinstance(other, triangle):
return False
return all([p in self.points for p in other.points])
def __ne__(self, other):
return not self.__eq__(other)
def __repr__(self):
return "triangle" + repr(self.points) + ")"
def __str__(self):
return "triangle" + str(self.points) + ")"