def triangulateTriangleSet(self, triangleset): # all the triangles must come before any trianglenexts triangles = triangleset.get_triangle() for triangle in triangles: triangle_vertices = triangle.get_vertex() vertices = [] for i in xrange(3): vertices.append( xmlscene.vertex(x=triangle_vertices[i].x, y=triangle_vertices[i].y, z=triangle_vertices[i].z) ) self.addTriangle(xmlscene.triangle(vertex=vertices), triangleset) # trianglenext implies its vertices from the previous triangle or trianglenext v0 = triangles[len(triangles) - 1].vertex[0] v1 = triangles[len(triangles) - 1].vertex[1] v2 = triangles[len(triangles) - 1].vertex[2] next_triangles = triangleset.trianglenext for i in xrange(len(next_triangles)): if i % 2 == 0: v0 = v1 v1 = next_triangles[i].get_vertex() else: v0 = v2 v2 = next_triangles[i].get_vertex() vertices = [ xmlscene.vertex(x=v0.x, y=v0.y, z=v0.z), xmlscene.vertex(x=v1.x, y=v1.y, z=v1.z), xmlscene.vertex(x=v2.x, y=v2.y, z=v2.z), ] self.addTriangle(xmlscene.triangle(vertex=vertices), triangleset)
def triangulateBase(self, base, base_parent): # base has the same specification as rectangle in triangulateRectangle self.addTriangle( xmlscene.triangle(vertex=[base[1], base[0], xmlscene.vertex(x=0.0, z=0.0, y=base[1].y)]), base_parent ) self.addTriangle( xmlscene.triangle(vertex=[base[3], base[2], xmlscene.vertex(x=0.0, z=0.0, y=base[3].y)]), base_parent )
def test_triangle_centre(self): v0 = xmlscene.vertex(x=0.0, y=0.0, z=0.0) v1 = xmlscene.vertex(x=1.0, y=2.0, z=10.0) v2 = xmlscene.vertex(x=2.0, y=-1.0, z=5.0) triangle = xmlscene.triangle(vertex=[v0, v1, v2]) c = triangleCentre(triangle) self.assert_(c[0] == 1.0) self.assert_(c[1] == 1.0/3.0) self.assert_(c[2] == 5.0)
def test_vertices_equal(self): v0 = xmlscene.vertex(x=1.0, y=2.0, z=3.0) v1 = xmlscene.vertex(x=1.0, y=2.0, z=3.0) v2 = xmlscene.vertex(x=1.0, y=2.0, z=-3.0) self.assert_(verticesEqual(v0, v0)) self.assert_(verticesEqual(v0, v1)) self.assert_(verticesEqual(v1, v0)) self.assert_(not verticesEqual(v0, v2)) self.assert_(not verticesEqual(v2, v1))
def test_divide_triangle(self): v0 = xmlscene.vertex(x=0.0, y=0.0, z=0.0) v1 = xmlscene.vertex(x=1.0, y=2.0, z=10.0) v2 = xmlscene.vertex(x=2.0, y=-1.0, z=5.0) triangle = xmlscene.triangle(vertex=[v0, v1, v2]) triangles = divideTriangle(triangle) self.assert_(len(triangles) == 4) c01 = centreOfVertices(v0, v1) c12 = centreOfVertices(v1, v2) c20 = centreOfVertices(v2, v0) self.assert_(verticesEqual(triangles[0].vertex[0], v0)) self.assert_(verticesEqual(triangles[0].vertex[1], c01)) self.assert_(verticesEqual(triangles[0].vertex[2], c20)) self.assert_(verticesEqual(triangles[1].vertex[0], v1)) self.assert_(verticesEqual(triangles[1].vertex[1], c12)) self.assert_(verticesEqual(triangles[1].vertex[2], c01)) self.assert_(verticesEqual(triangles[2].vertex[0], v2)) self.assert_(verticesEqual(triangles[2].vertex[1], c20)) self.assert_(verticesEqual(triangles[2].vertex[2], c12)) self.assert_(verticesEqual(triangles[3].vertex[0], c12)) self.assert_(verticesEqual(triangles[3].vertex[1], c20)) self.assert_(verticesEqual(triangles[3].vertex[2], c01))
def triangulateTeapot(self, teapot): # A Utah Teapot. Bottom of this teapot # is at 0,0,0. for i in xrange(len(utah_teapot.teapot_mesh_indices)): vertices = [] for j in xrange(3): vertex = xmlscene.vertex( x=utah_teapot.teapot_mesh_vertices[utah_teapot.teapot_mesh_indices[i][2 - j]][0], y=utah_teapot.teapot_mesh_vertices[utah_teapot.teapot_mesh_indices[i][2 - j]][2], z=utah_teapot.teapot_mesh_vertices[utah_teapot.teapot_mesh_indices[i][2 - j]][1], ) vertices.append(vertex) self.addTriangle(xmlscene.triangle(vertex=vertices), teapot)
def addTriangle(self, triangle, triangle_parent): self.setTriangleProperties(triangle, triangle_parent) # apply the transformation matrix to each vertex of the triangle vertices = [] for i in range(len(triangle.get_vertex())): vertex = triangle.get_vertex()[i] # NOTE: do not modify vertex directly, but create a new vertex # so that vertices created from references do not update # with the transformed vertex row_vector = numpy.matrix([[vertex.x], [vertex.y], [vertex.z], [1.0]]) transformed_vector = self.transformation_matrix * row_vector h_inv = 1.0 / transformed_vector.item(3, 0) tv_x = transformed_vector.item(0, 0) * h_inv tv_y = transformed_vector.item(1, 0) * h_inv tv_z = transformed_vector.item(2, 0) * h_inv vertices.append(xmlscene.vertex(x=tv_x, y=tv_y, z=tv_z)) triangle.set_vertex(vertices) self.triangles.append(triangle)
def test_vector_list_for_vertex(self): v = xmlscene.vertex(x=78.9, y=9485.209, z=-10.0234) self.assert_(vectorListForVertex(v) == [78.9, 9485.209, -10.0234])
def test_triangle_area(self): v0 = xmlscene.vertex(x=0.0, y=2.0, z=0.0) v1 = xmlscene.vertex(x=0.0, y=2.0, z=3.0) v2 = xmlscene.vertex(x=4.0, y=2.0, z=3.0) triangle = xmlscene.triangle(vertex=[v0, v1, v2]) self.assert_(triangleArea(triangle) == 6.0)
def centreOfVertices(v0, v1): centre = map(lambda p, q: average([p, q]), vectorListForVertex(v0), vectorListForVertex(v1)) return xmlscene.vertex(x=centre[0], y=centre[1], z=centre[2])
def triangulateCuboid(self, cuboid): # Each rectangle of the cuboid is divided into 2 triangles # TODO: original rrv's cuboids are 1x1x1 with center at 0,0,0 => extend? # left self.triangulateRectangle( [ xmlscene.vertex(x=-0.5, y=-0.5, z=-0.5), xmlscene.vertex(x=-0.5, y=-0.5, z=+0.5), xmlscene.vertex(x=-0.5, y=+0.5, z=+0.5), xmlscene.vertex(x=-0.5, y=+0.5, z=-0.5), ], cuboid, ) # right self.triangulateRectangle( [ xmlscene.vertex(x=+0.5, y=-0.5, z=-0.5), xmlscene.vertex(x=+0.5, y=+0.5, z=-0.5), xmlscene.vertex(x=+0.5, y=+0.5, z=+0.5), xmlscene.vertex(x=+0.5, y=-0.5, z=+0.5), ], cuboid, ) # down self.triangulateRectangle( [ xmlscene.vertex(x=-0.5, y=-0.5, z=-0.5), xmlscene.vertex(x=+0.5, y=-0.5, z=-0.5), xmlscene.vertex(x=+0.5, y=-0.5, z=+0.5), xmlscene.vertex(x=-0.5, y=-0.5, z=+0.5), ], cuboid, ) # up self.triangulateRectangle( [ xmlscene.vertex(x=-0.5, y=+0.5, z=-0.5), xmlscene.vertex(x=-0.5, y=+0.5, z=+0.5), xmlscene.vertex(x=+0.5, y=+0.5, z=+0.5), xmlscene.vertex(x=+0.5, y=+0.5, z=-0.5), ], cuboid, ) # rear self.triangulateRectangle( [ xmlscene.vertex(x=-0.5, y=-0.5, z=-0.5), xmlscene.vertex(x=-0.5, y=+0.5, z=-0.5), xmlscene.vertex(x=+0.5, y=+0.5, z=-0.5), xmlscene.vertex(x=+0.5, y=-0.5, z=-0.5), ], cuboid, ) # front self.triangulateRectangle( [ xmlscene.vertex(x=-0.5, y=-0.5, z=+0.5), xmlscene.vertex(x=+0.5, y=-0.5, z=+0.5), xmlscene.vertex(x=+0.5, y=+0.5, z=+0.5), xmlscene.vertex(x=-0.5, y=+0.5, z=+0.5), ], cuboid, )
def test_vertex_centre(self): v0 = xmlscene.vertex(x=1.0, y=2.0, z=3.0) v1 = xmlscene.vertex(x=3.0, y=2.0, z=1.0) self.assert_(centreOfVertices(v0, v1).x == 2.0) self.assert_(centreOfVertices(v0, v1).y == 2.0) self.assert_(centreOfVertices(v0, v1).z == 2.0)
def triangleCentre(triangle): v = map(vectorListForVertex, vertexListForTriangle(triangle)) centre = map(lambda p, q, r: average([p, q, r]), v[0], v[1], v[2]) return xmlscene.vertex(x=centre[0], y=centre[1], z=centre[2])
def test_distance_between_vertices(self): v0 = xmlscene.vertex(x=1.0, y=2.0, z=3.0) v1 = xmlscene.vertex(x=2.3, y=1.0, z=1.0) self.assert_(distanceBetweenVertices(v0, v1) == magnitude([-1.3, 1.0, 2.0]))
def test_zero_vertex(self): self.assert_(verticesEqual(zeroVertex(), xmlscene.vertex(x=0.0, y=0.0, z=0.0)))
def test_vertex_list_for_triangle(self): v0 = xmlscene.vertex(x=0.0, y=1.0, z=2.0) v1 = xmlscene.vertex(x=8.4, y=-10.598, z=0.0) v2 = xmlscene.vertex(x=3.1415, y=0.0, z=-1000) triangle = xmlscene.triangle(vertex=[v0, v1, v2]) self.assert_(vertexListForTriangle(triangle) == [v0, v1, v2])
def copyVertex(v): return xmlscene.vertex(x=v.x, y=v.y, z=v.z)
def zeroVertex(): return xmlscene.vertex(x=0.0, y=0.0, z=0.0)
def test_vector_from_vertices(self): v0 = xmlscene.vertex(x=1.0, y=2.0, z=3.0) v1 = xmlscene.vertex(x=0.0, y=0.5, z=4.0) self.assert_(vectorFromVertices(v0, v1) == [1.0, 1.5, -1.0])