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 divideTriangle(triangle): # returns 4 triangles that represent the divided triangle centre = shiftListLeft(map(centreOfVertices, vertexListForTriangle(triangle), shiftListLeft(vertexListForTriangle(triangle), 1)), 1) triangles = map(lambda t_v, c_2, c_1: xmlscene.triangle(vertex=[t_v, c_2, c_1]), triangle.vertex, shiftListLeft(centre, 2), shiftListLeft(centre, 1)) triangles.append(xmlscene.triangle(vertex=[centre[0], centre[1], centre[2]])) return triangles
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 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 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 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 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 triangulateRectangle(self, rectangle, rectangle_parent): # rectangle = [4 xmlscene.vertex objects] # the vertices must be given in either ccw or cw order, # and we split the rectangle's diagonal in the given order self.addTriangle(xmlscene.triangle(vertex=[rectangle[0], rectangle[1], rectangle[2]]), rectangle_parent) self.addTriangle(xmlscene.triangle(vertex=[rectangle[0], rectangle[2], rectangle[3]]), rectangle_parent)