diff --git a/surf/subd/cc.py b/surf/subd/cc.py index 48fae4e..5bba3ef 100644 --- a/surf/subd/cc.py +++ b/surf/subd/cc.py @@ -1,26 +1,22 @@ -from surf.geometry import Vertex, Edge, Face, Polygon -from copy import deepcopy -import pprint +from surf.geometry import Vertex, Edge, Polygon -def mid_point(edge): - vertex_objs = [edge.vertices[v_id] for v_id in edge.vertices] - return sum(vertex_objs, Vertex()) / len(self.vertices) def sub_edges(self): temp_p = Polygon() temp_p.edges = [Edge(), Edge()] - # temp_p.vertices = + # temp_p.vertices = sub_edges[0].vertices = [self.vertices[0], self.edge_vertex] sub_edges[1].vertices = [self.edge_vertex, self.vertices[1]] return self.__sub_edges + def centroid(face, poly): ''' ''' # gather all face vertex coords face_vertices = face.vertices - + xs = [vertex.x for vertex in face_vertices] ys = [vertex.y for vertex in face_vertices] zs = [vertex.z for vertex in face_vertices] @@ -29,17 +25,17 @@ def centroid(face, poly): x = sum(xs) / len(xs) y = sum(ys) / len(ys) z = sum(zs) / len(zs) - + return Vertex(poly, x, y, z) - + + def edge_divide(edge, poly): ''' Set each edge vertices to be the average of the two neighboring face vertices and its two original end vertices. ''' - edge_ids = poly.edge_ids_with_parent(edge.id) - + if edge_ids: return edge_ids else: @@ -52,49 +48,52 @@ def edge_divide(edge, poly): xs.append(centroid_v.x) ys.append(centroid_v.y) zs.append(centroid_v.z) - + for vertex in edge.vertices: xs.append(vertex.x) ys.append(vertex.y) zs.append(vertex.z) - + x = sum(xs) / len(xs) y = sum(ys) / len(ys) z = sum(zs) / len(zs) - + e0 = Edge(poly) e1 = Edge(poly) edge_vertex = Vertex(poly, x, y, z) - + edge_vertex.edge_ids = [e0.id, e1.id] - + e0.vertex_ids = [edge.vertices[0].id, edge_vertex.id] e1.vertex_ids = [edge_vertex.id, edge.vertices[1].id] - + e0.edge_ids = edge.winged_edges_at_vertex(0) e0.edge_ids.append(e1.id) - + e1.edge_ids = edge.winged_edges_at_vertex(1) e1.edge_ids.append(e0.id) - + e0.parent_id = edge.id e1.parent_id = edge.id - + # add all these to the new polygon poly.edge_ids.append(e0.id) poly.edge_ids.append(e1.id) poly.vertices.append(edge_vertex.id) - + return e0.id, e1.id, edge_vertex.id + def sub_faces(self): setup_sub_divisions() return sub_faces() + def interior_edges(self): setup_sub_divisions() return self.__interior_edges + def setup_sub_divisions(polygon, face): ''' v0 ev0 v1 @@ -107,19 +106,16 @@ def setup_sub_divisions(polygon, face): *------e2-----* v3 ev2 v2 ''' - + # create empty sub_faces that will be filled with edge references # below # these need to at least exist so the interior edges have # something to reference - - - - sub_faces = [Face(polygon) for edge in face.edge_ids] - + # sub_faces = [Face(polygon) for edge in face.edge_ids] + # set up empty edge objects to be filled below - interior_edges = [Edge(polygon) for edge in face.edge_ids] + # interior_edges = [Edge(polygon) for edge in face.edge_ids] # # each interior edge connects the exterior edge vertex (mid-point) # # to the faceVertex (centroid) @@ -176,18 +172,20 @@ def setup_sub_divisions(polygon, face): # self.__sub_faces[index]) pass + def subdivide_face(poly, face): # ''' # ''' - + # # find face centroid # fc = face.centroid - + # # find edge vertices # for edge in face.edges: # x, y, z = edge_mid_vertex(edge) pass + def refine(poly): ''' For each face, add a face vertex @@ -203,56 +201,52 @@ def refine(poly): edges touching P, where each edge midvertex is the average of its two endvertex vertices. Move each original vertex to the vertex ''' - + # create a new storage container for the items new_poly = Polygon() - + # for now just test with the first face start_face = poly.faces[0] - + # go through the face vertices and add them to the new polygon for vertex in start_face.vertices: # truly, this needs to be a 'copy' of the vertex, I'll fix that later new_poly.vertices.append(vertex) - + # find the face centroid # and add the face centroid to the new polygon start_centroid = centroid(start_face, new_poly) new_poly.vertices.append(start_centroid) - - # for each edge on the face, + + # for each edge on the face, for edge in start_face.edges: # divide that edge into two new edges with an edge vertex # set their parent object as the original edge new_e0_id, new_e1_id, edge_v_id = edge_divide(edge, new_poly) - + # create a new edge connecting the centroid to the edge_vertex centroid_to_edge = Edge(new_poly) new_poly.edges.append(centroid_to_edge) - + # set the new edge's vertex references centroid_to_edge.vertex_ids = [edge_v_id, start_centroid.id] - + # set the new edge's winged_edge references - centroid_to_edge.edge_ids = poly.edges ==> get edge by id not yet implemented... edge_v_id.edges - + # centroid_to_edge.edge_ids = poly.edges ==> get edge by id not yet implemented... edge_v_id.edges + # set the edge vertex edge references edge_v_id.edges.append(centroid_to_edge.id) - + # set the centroid's edge reference start_centroid.edge_ids.append(centroid_to_edge.id) - + # now walk through the edges connected to the centroid start_centroid.edges[0] # need to get an adjacent edge, based on the the shared vertex of the # original polygon... centroid to edge_vertex to shared point... - - - + # start_face.neighbors - - - + # f = sum(list( # set(face_vertices)), Vertex()) / len(list(set(face_vertices))) # r = sum(list(