diff --git a/surf/geometry.py b/surf/geometry.py index f7f74be..ccf34d8 100755 --- a/surf/geometry.py +++ b/surf/geometry.py @@ -15,77 +15,14 @@ to store the vertex, edge and face data. These include: We have chosen to use a winged-edge style mesh for our purpopses. - v4 v5 - *-----e8-----* - | | - | | - e|4 f4 e|5 - | | - v4 v|0 v|1 v5 - *-----e4-----*-----e0-----*-----e5-----* - | | | | - | | | | - e11| f3 e|3 f0 e|1 f1 e|9 - | | | | - | | | | - *-----e7-----*-----e2-----*-----e6-----* - v7 v|3 v|2 v6 - | | - e|7 f2 e|6 - | | - v|7 v|6 - *-----e10----* - | | - | | - e|11 f5 e|9 - | | - | | - *-----e8-----* - v4 v5 - v0 - <0,1,0> - v1 - <1,1,0> - v2 - <1,0,0> - v3 - <0,0,0> - v4 - <0,1,1> - v5 - <1,1,1> - v6 - <1,0,1> - v7 - <0,0,1> - - face list - f0 - e0, e1, e2, e3 - f1 - e1, e5, e9, e6 - f2 - e2, e6, e10, e7 - f3 - e4, e3, e7, e11 - f4 - e8, e5, e0, e4 - f5 - e10, e9, e8, e11 - - winged edges ordered by face, then by vertex reference - edge list - e0 - v0, v1; f0, f4; e3, e1, e4, e5 - e1 - v1, v2; f0, f1; e0, e2, e5, e6 - e2 - v3, v2; f0, f2; e3, e7, e1, e6 - e3 - v0, v3; f3, f0; e4, e7, e0, e2 - e4 - v4, v0; f3, f4; e11, e3, e0 e8 - e5 - v5, v1; f4, f1; e8, e0, e9, e1 - e6 - v2, v6; f1, f2; e1, e9, e2, e10 - e7 - v7, v3; f3, f2; e11, e3, e10, e2 - e8 - v4, v5, f4, f5; e4, e5, e11, e9 - e9 - v5, v6; f1, f5; e5, e6, e8, e10 - e10 - v7, v6; f2, f5; e7, e6, e11, e9 - e11 - v4, v7; f3, f5; e4, e7, e8, 10 - - vertex list - v0 - e0, e3, e4 - v1 - e0, e5, e1 - v2 - e1, e6, e2 - v3 - e2, e7, e3 - v4 - e4, e11, e8 - v5 - e5, e9, e8 - v6 - e2, e9, e10 - v7 - e7, e10, e11 - ''' +def cross(a, b): + i = a.y * b.z - a.z * b.y + j = a.z * b.x - a.x * b.z + k = a.x * b.y - a.y * b.x + return Vertex(i, j, k) + class Vertex(object): ''' @@ -112,11 +49,17 @@ class Vertex(object): return Vertex(self.x + other.x, self.y + other.y, self.z + other.z) def __radd__(self, other): - return self.__add__(other) + return other + self + # return self.__add__(other) def __mul__(self, other): - # for now just assume type(other) = int or float - return Vertex(self.x * other, self.y * other, self.z * other) + if isinstance(other, Vertex): + return cross(self, other) + elif isinstance(other, (float, int)): + return Vertex(self.x * other, self.y * other, self.z * other) + else: + raise TypeError("{0} has an unexpected type: {1}".format( + other, type(other))) def __rmul__(self, other): return self.__mul__(other) @@ -126,6 +69,9 @@ class Vertex(object): other = float(other) return Vertex(self.x / other, self.y / other, self.z / other) + def __neg__(self): + return Vertex(-self.x, -self.y, -self.z) + class Edge(object): ''' diff --git a/surf/util.py b/surf/util.py index 4ea6f70..cfbb84a 100644 --- a/surf/util.py +++ b/surf/util.py @@ -2,6 +2,80 @@ from surf.geometry import Vertex, Edge, Face, Polygon def cube(): + """ + This function returns a populated Polygon object. The object is a cube with + a vertex at the origin, and another at (1, 1, 1). + + v4 v5 + *-----e8-----* + | | + | | + e|4 f4 e|5 + | | + v4 v|0 v|1 v5 + *-----e4-----*-----e0-----*-----e5-----* + | | | | + | | | | + e11| f3 e|3 f0 e|1 f1 e|9 + | | | | + | | | | + *-----e7-----*-----e2-----*-----e6-----* + v7 v|3 v|2 v6 + | | + e|7 f2 e|6 + | | + v|7 v|6 + *-----e10----* + | | + | | + e|11 f5 e|9 + | | + | | + *-----e8-----* + v4 v5 + v0 - <0,1,0> + v1 - <1,1,0> + v2 - <1,0,0> + v3 - <0,0,0> + v4 - <0,1,1> + v5 - <1,1,1> + v6 - <1,0,1> + v7 - <0,0,1> + + face list + f0 - e0, e1, e2, e3 + f1 - e1, e5, e9, e6 + f2 - e2, e6, e10, e7 + f3 - e4, e3, e7, e11 + f4 - e8, e5, e0, e4 + f5 - e10, e9, e8, e11 + + winged edges ordered by face, then by vertex reference + edge list + e0 - v0, v1; f0, f4; e3, e1, e4, e5 + e1 - v1, v2; f0, f1; e0, e2, e5, e6 + e2 - v3, v2; f0, f2; e3, e7, e1, e6 + e3 - v0, v3; f3, f0; e4, e7, e0, e2 + e4 - v4, v0; f3, f4; e11, e3, e0 e8 + e5 - v5, v1; f4, f1; e8, e0, e9, e1 + e6 - v2, v6; f1, f2; e1, e9, e2, e10 + e7 - v7, v3; f3, f2; e11, e3, e10, e2 + e8 - v4, v5, f4, f5; e4, e5, e11, e9 + e9 - v5, v6; f1, f5; e5, e6, e8, e10 + e10 - v7, v6; f2, f5; e7, e6, e11, e9 + e11 - v4, v7; f3, f5; e4, e7, e8, 10 + + vertex list + v0 - e0, e3, e4 + v1 - e0, e5, e1 + v2 - e1, e6, e2 + v3 - e2, e7, e3 + v4 - e4, e11, e8 + v5 - e5, e9, e8 + v6 - e2, e9, e10 + v7 - e7, e10, e11 + """ + v = [] v.append(Vertex(0.0, 1.0, 0.0)) v.append(Vertex(1.0, 1.0, 0.0)) diff --git a/test/vertex.py b/test/vertex.py index ec831f3..a75cabd 100644 --- a/test/vertex.py +++ b/test/vertex.py @@ -1,6 +1,6 @@ import unittest -from surf.geometry import Vertex +from surf.geometry import Vertex, cross class TestVertexOperations(unittest.TestCase): @@ -30,6 +30,36 @@ class TestVertexOperations(unittest.TestCase): v2 = self.v1 / 2.0 self.assertEqual(v1, v2) + def test_multiply(self): + self.assertEqual(type(self.v1 * 2), Vertex) + self.assertEqual(type(self.v1 * self.v1), Vertex) + self.assertEqual(self.v1 * 2, Vertex(-2, -2, -2)) + self.assertEqual(self.v1 * self.v1, Vertex(0, 0, 0)) + self.assertEqual(self.v1 * self.v2, Vertex(0, 0, 0)) + self.assertEqual(self.v3 * self.v4, Vertex(58, -35, -50)) + + + def test_cross(self): + i = Vertex(1, 0, 0) + j = Vertex(0, 1, 0) + k = Vertex(0, 0, 1) + + self.assertEqual(i * j, k) + self.assertEqual(j * k, i) + self.assertEqual(k * i, j) + + self.assertEqual(j * i, -k) + self.assertEqual(k * j, -i) + self.assertEqual(i * k, -j) + + self.assertEqual(i * i, self.origin) + self.assertEqual(j * j, self.origin) + self.assertEqual(k * k, self.origin) + + def test_negative(self): + self.assertEqual(-self.v1, self.v2) + self.assertEqual(-self.v2, self.v1) + if __name__ == '__main__': unittest.main(verbosity=3)