From 6c3e3bdbd678362e33e8332c5bf619a403aaee8e Mon Sep 17 00:00:00 2001 From: X-wenhao Date: Wed, 6 Jun 2018 21:18:45 +0800 Subject: [PATCH 01/53] create CatmullClarkSubdivision.py and draw.py --- .../CatmullClarkSubdivision.py | 30 +++++++++++++++++++ relaxrender/SubdivisionSurface/__init__.py | 0 relaxrender/SubdivisionSurface/draw.py | 0 3 files changed, 30 insertions(+) create mode 100644 relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py create mode 100644 relaxrender/SubdivisionSurface/__init__.py create mode 100644 relaxrender/SubdivisionSurface/draw.py diff --git a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py new file mode 100644 index 0000000..8c60eb5 --- /dev/null +++ b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py @@ -0,0 +1,30 @@ +''' + TODO: finish Catmull Clark Subdivision + data struct: + point: relaxrender.points.Point3D + line : relaxrender.points.Vector + face : [line,line,...] +''' + +from relaxrender.points import Point3D,Vector +import numpy as np + +__all__==['CatmullClarkSubdivision'] + +''' + subdivide a model according to its points and faces + return points and faces after subdivision + + param: + points: [point,point,...] + faces : [face,face,...] + return: + [points,faces] +''' +def CatmullClarkSubdivision(points,faces): + + pass + + + + diff --git a/relaxrender/SubdivisionSurface/__init__.py b/relaxrender/SubdivisionSurface/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/relaxrender/SubdivisionSurface/draw.py b/relaxrender/SubdivisionSurface/draw.py new file mode 100644 index 0000000..e69de29 From 92ababea4a5e32ec47504d41dbd5d15e04946e91 Mon Sep 17 00:00:00 2001 From: X-wenhao Date: Fri, 8 Jun 2018 20:52:00 +0800 Subject: [PATCH 02/53] add build_index --- .../CatmullClarkSubdivision.py | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py index 8c60eb5..bae890e 100644 --- a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py +++ b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py @@ -1,30 +1,62 @@ ''' TODO: finish Catmull Clark Subdivision - data struct: - point: relaxrender.points.Point3D - line : relaxrender.points.Vector - face : [line,line,...] ''' +from relaxrender.triangle import Triangle,Triangles from relaxrender.points import Point3D,Vector import numpy as np __all__==['CatmullClarkSubdivision'] +def CatmullClarkSubdivision(faces): + lines=[] + points=[] + face_to_lines={} + line_to_points={} + point_to_lines={} + line_to_faces={} + lines,line_to_faces,face_to_lines=build_index(faces) + points,point_to_lines,line_to_points=build_index(lines) + + return lines,line_to_faces,face_to_lines + +def build_index(faces): + lines=[] + face_to_lines={} + line_to_faces={} + for face_i in range(len(faces)): + face=faces[face_i] + face_to_lines[face_i]=[] + for line_i in range(len(faces[face_i])): + line=face[line_i] + if line not in lines: + lines.append(line) + line_to_faces[len(lines)-1]=[] + face_to_lines[face_i].append(lines.index(line)) + line_to_faces[lines.index(line)].append(face_i) + return lines,line_to_faces,face_to_lines + ''' subdivide a model according to its points and faces return points and faces after subdivision param: - points: [point,point,...] faces : [face,face,...] + face: [line,line,...] + line: [point,point] + point: Point3D return: [points,faces] + + PS:this func is not designed as a interface ''' -def CatmullClarkSubdivision(points,faces): +def CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines): + face_points=list(map((lambda face: sum(list(l[0] for l in face)+list(l[1] for l in face))/2.0/len(face) ,faces))) + edge_points=list( (face_points[line_to_faces[i][0]]+face_points[line_to_faces[i][1]]+points[line_to_points[i][0]]+points[line_to_points[i][1]])/4.0 for i in len(lines)) - pass +def getFacePoint(face): + x=1.0/2/len(face)*(sum(list(l.p_start for l in face))) From 6954f2e4fc02bea1fdc38a99dab5c1822221f6fc Mon Sep 17 00:00:00 2001 From: Shirhockton <781502127@qq.com> Date: Sat, 9 Jun 2018 09:34:51 +0800 Subject: [PATCH 03/53] DOO_Sabin begin try to use the DOO_Sabin calculation to solve the problem --- .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/relaxrender.iml | 18 ++ .idea/vcs.xml | 6 + .idea/workspace.xml | 243 ++++++++++++++++++ .../test/Shirhockton/DOO_Sabin.py | 63 +++++ 6 files changed, 342 insertions(+) create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/relaxrender.iml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 relaxrender/SubdivisionSurface/test/Shirhockton/DOO_Sabin.py diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..88092ab --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..8eb388c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/relaxrender.iml b/.idea/relaxrender.iml new file mode 100644 index 0000000..fdb3a83 --- /dev/null +++ b/.idea/relaxrender.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..4155b3a --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -185,7 +183,8 @@ - + + @@ -193,10 +192,9 @@ - + - @@ -206,6 +204,7 @@ + @@ -220,6 +219,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -262,8 +281,8 @@ - - + + @@ -272,8 +291,8 @@ - - + + From ab556786e0897dcf3951685f94165fe8fddec287 Mon Sep 17 00:00:00 2001 From: Shirhockton <781502127@qq.com> Date: Fri, 15 Jun 2018 19:16:58 +0800 Subject: [PATCH 21/53] tian's work add the py file to the main project file --- relaxrender/SubdivisionSurface/DOO_Sabin.py | 181 ++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 relaxrender/SubdivisionSurface/DOO_Sabin.py diff --git a/relaxrender/SubdivisionSurface/DOO_Sabin.py b/relaxrender/SubdivisionSurface/DOO_Sabin.py new file mode 100644 index 0000000..49630f1 --- /dev/null +++ b/relaxrender/SubdivisionSurface/DOO_Sabin.py @@ -0,0 +1,181 @@ +import numpy as np +from relaxrender.points import Point3D, Point + +# points_doos=list() +# points_current=list() + +''' +one point for another ones on the faces beside it +''' +# points_doos={} +current_points = [] +current_faces = [] +points_doos = [] + + +class Face: + def __init__(self, points): + self.points = points + + +# class points_doo: +# def __init__(self,main_point,points): +# self.main_point=main_point +# self.points=points +# def add_point(self,p): +# self.points.append(p) + +def DOO_Sabin_single_time(faces): + for f in faces: + f = get_new_face(f) + for points_ds in points_doos: + new_face = Face(points_ds) + faces.append(new_face) + return faces + +def DOO_Sabin(faces,times): + for i in range(0,times): + DOO_Sabin_single_time(faces) + return faces + +def get_face_point(face): + face_point = get_average_point(face.points) + return face_point + + +''' +for each point in a face, there would be a new point +''' + + +def get_new_face(face): + face_point = get_face_point(face) + new_face_points = [] + for p in face.points: + + ''' + _______global variables_______ + ''' + if p not in current_points: + current_points.append(p) + flag = True + else: + flag=False + + if face.points.index(p) == 0: + tmp1 = len(face.points) - 1 + tmp2 = face.points.index(p) + 1 + + elif face.points.index(p) == len(face.points) - 1: + tmp1 = face.points.index(p) - 1 + tmp2 = 0 + else: + tmp1 = face.points.index(p) - 1 + tmp2 = face.points.index(p) + 1 + + last_average_line = get_average_point([p, face.points[tmp1]]) + next_average_line = get_average_point([p, face.points[tmp2]]) + + new_face_point = get_average_point([p, face_point, last_average_line, next_average_line]) + + new_face_points.append(new_face_point) + + # ''' + # append p's points + # ''' + # if points_doos.has_key(p): + # p_points = points_doos[p] + # p_points.append(new_face_point) + # ''' + # _______global variables_______ + # ''' + # points_doos[p] = p_points + # else: + # p_points=[new_face_point,] + # p_points.append(new_face_point) + # ''' + # _______global variables_______ + # ''' + # points_doos[p]=p_points + if flag: + points_doos.append([new_face_point, ]) + else: + points_doos[current_points.index(p)].append(new_face_point) + + face.points = new_face_points + new_face=Face(new_face_points) + return new_face + + +def get_average_point(points): + x_sum = 0 + y_sum = 0 + z_sum = 0 + for p in points: + x_sum = x_sum + p.data[0] + y_sum = y_sum + p.data[1] + z_sum = z_sum + p.data[2] + Apoint = Point3D(x_sum / len(points), y_sum / len(points), z_sum / len(points)) + return Apoint + + +''' +debug:print the x,y,z of the point +''' + + +def print_point(p): + tmp = [p.data[0], p.data[1], p.data[2]] + print(tmp) + + +''' +debug:print the points of the face +''' +def print_face(f): + for p in f.points: + print_point(p) + + +''' +debug:print the points +''' +def print_points(ps): + for p in ps: + print_point(p) + + + +''' +debug:print the faces of the object +''' +def print_obj(faces): + i=0 + for f in faces: + i=i+1 + print("face",i) + print_face(f) + + +if __name__ == '__main__': + point_test_1 = Point3D(4, 4, 4) + point_test_2 = Point3D(4, 4,0) + point_test_3 = Point3D(4, 0, 4) + point_test_4 = Point3D(4, 0, 0) + point_test_5 = Point3D(0, 4, 4) + point_test_6 = Point3D(0, 4, 0) + point_test_7 = Point3D(0, 0, 4) + point_test_8 = Point3D(0, 0, 0) + face_test_1 = Face([point_test_1, point_test_2, point_test_3, point_test_4]) + face_test_2 = Face([point_test_1, point_test_5, point_test_6, point_test_2]) + face_test_3 = Face([point_test_1, point_test_5, point_test_7, point_test_3]) + face_test_4 = Face([point_test_3, point_test_4, point_test_8, point_test_7]) + face_test_5 = Face([point_test_5, point_test_6, point_test_8, point_test_7]) + face_test_6 = Face([point_test_2, point_test_4, point_test_8, point_test_6]) + faces_test=[face_test_1,face_test_2,face_test_3,face_test_4,face_test_5,face_test_6] + print_obj(DOO_Sabin(faces_test,6)) + # points_test=[point_test_1,point_test_2,point_test_3,point_test_4] + # face_test=Face(points_test) + # print_face(get_new_face(face_test)) + # for ps in points_doos: + # print_points(ps) From e9d435c90d276244f20c5fe5418ebadf2f1f9816 Mon Sep 17 00:00:00 2001 From: X-wenhao Date: Fri, 15 Jun 2018 19:31:38 +0800 Subject: [PATCH 22/53] to merge --- .../CatmullClarkSubdivision.py | 5 +-- relaxrender/SubdivisionSurface/draw.py | 34 +++++++++++++++++-- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py index ad440e3..6f2b2fb 100644 --- a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py +++ b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py @@ -31,12 +31,9 @@ def CatmullClarkSubdivision(faces,num): #draw(face_to_lines,line_to_points,points) #print("lines:",lines) faces=CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines) - lines,line_to_faces,face_to_lines=build_index(faces) - #print(line_to_faces,face_to_lines) - points,point_to_lines,line_to_points=build_index(lines) - #draw(face_to_lines,line_to_points,points) return faces + def build_index(faces): lines=[] face_to_lines={} diff --git a/relaxrender/SubdivisionSurface/draw.py b/relaxrender/SubdivisionSurface/draw.py index bcd9026..1e97609 100644 --- a/relaxrender/SubdivisionSurface/draw.py +++ b/relaxrender/SubdivisionSurface/draw.py @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt import numpy as np from relaxrender.points import Point,Point3D - +from .CatmullClarkSubdivision import CatmullClarkSubdivision_in,build_index def draw(face_to_lines,line_to_points,points): verts=list((p.data[0],p.data[1],p.data[2]) for p in points) faces=[] @@ -40,4 +40,34 @@ def draw(face_to_lines,line_to_points,points): ax.set_ylim3d(-0.5, 1.5) ax.set_zlabel('Z') ax.set_zlim3d(-0.5, 1.5) - plt.show() \ No newline at end of file + plt.show() + +def test_CatmullClarkSubdivision(): + verts = [(0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 0, 0), (0, 0, 1), (0, 1, 1), (1, 1, 1), (1, 0, 1)] + points=list(Point.create(np.array(list(v))) for v in verts) + line_to = [[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]] + face_to = [[0,1,2,3],[4,5,6,7],[0,4,8,9],[1,5,9,10],[2,6,10,11],[3,7,11,8]] + lines=[] + for lt in line_to: + lines.append([]) + for i in lt: + lines[-1].append(points[i]) + faces=[] + for ft in face_to: + faces.append([]) + for i in ft: + faces[-1].append(lines[i]) + for i in range(4): + lines,line_to_faces,face_to_lines=build_index(faces) + #print(line_to_faces,face_to_lines) + points,point_to_lines,line_to_points=build_index(lines) + draw(face_to_lines,line_to_points,points) + #print("lines:",lines) + faces=CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines) + lines,line_to_faces,face_to_lines=build_index(faces) + #print(line_to_faces,face_to_lines) + points,point_to_lines,line_to_points=build_index(lines) + draw(face_to_lines,line_to_points,points) + +if __name__=='__main__': + test_CatmullClarkSubdivision() \ No newline at end of file From 1a01142208c41c5b1a9aeac9f6f41ef4f1a10811 Mon Sep 17 00:00:00 2001 From: JILLWONG <411702101@qq.com> Date: Fri, 15 Jun 2018 19:35:40 +0800 Subject: [PATCH 23/53] move --- relaxrender/SubdivisionSurface/loop.py | 104 +++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 relaxrender/SubdivisionSurface/loop.py diff --git a/relaxrender/SubdivisionSurface/loop.py b/relaxrender/SubdivisionSurface/loop.py new file mode 100644 index 0000000..66f4fcc --- /dev/null +++ b/relaxrender/SubdivisionSurface/loop.py @@ -0,0 +1,104 @@ +from math import * + + +def loop(vertices,faces): + ''' + input:vertices=[[x0,y0,z0],[x1,y1,z1]...],faces=[[index0,index1,index2]...] + output:new_vertices,new_face + + ''' + num_faces=len(faces) + num_vertices=len(vertices) + new_vertices=vertices+[[0,0,0]]*num_faces*3 + new_index_of_ver=num_vertices + edge_vertices=[] + new_faces=[] + + for i in range(num_vertices): + x=[] + for j in range(num_vertices): + x.append([0,0,0]) + edge_vertices.append(x) + + for f_i in range(0,num_faces): + va=faces[f_i][0] + vb=faces[f_i][1] + vc=faces[f_i][2] + vp,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver) + edge_vertices[va][vb][0]=ev0 + edge_vertices[va][vb][1]=ev1 + edge_vertices[va][vb][2]=ev2 + vq,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(vb,vc,va,edge_vertices,new_index_of_ver) + edge_vertices[va][vb][0]=ev0 + edge_vertices[va][vb][1]=ev1 + edge_vertices[va][vb][2]=ev2 + vr,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(va,vc,vb,edge_vertices,new_index_of_ver) + edge_vertices[va][vb][0]=ev0 + edge_vertices[va][vb][1]=ev1 + edge_vertices[va][vb][2]=ev2 + four_faces=[[va,vp,vr],[vp,vb,vq],[vr,vq,vc],[vr,vp,vq]] + new_faces=new_faces+four_faces + + + for v_i in range(0,num_vertices-1): + for v_j in range(v_i,num_vertices): + v_index=edge_vertices[v_i][v_j][0] + if(v_index!=0): + first_opposite_index_ver=edge_vertices[v_i][v_j][1] + second_opposite_index_ver=edge_vertices[v_i][v_j][2] + if(first_opposite_index_ver==0 or second_opposite_index_ver==0): + new_vertices[v_index]=[1.0/2*vertices[v_i][i]+1.0/2*vertices[v_j][i] for i in range(3)] + else: + new_vertices[v_index]= [(3/8*vertices[v_i][i]+3/8*vertices[v_j][i] \ + + 1/8*vertices[first_opposite_index_ver][i]+1/8*vertices[second_opposite_index_ver][i]) \ + for i in range(3)] + + adj_ver=[] + for ov_i in range(0,num_vertices): + x=[] + for ov_j in range(0,num_vertices): + if((ov_iov_j and edge_vertices[ov_j][ov_i][0]!=0)): + x.append(ov_j) + adj_ver.append(x) + + for ov in range (0,num_vertices): + k=len(adj_ver[ov]) + adj_boundary_ver=[] + for i in range(0,k): + ov_adj=adj_ver[ov][i] + if((ov_adj>ov and edge_vertices[ov][ov_adj][2]==0) or (ov_adjvb): + v_tmp = va + va = vb + vb = v_tmp + + edge_vertices_va_vb_0=edge_vertices[va][vb][0] + edge_vertices_va_vb_1=edge_vertices[va][vb][1] + edge_vertices_va_vb_2=edge_vertices[va][vb][2] + if (edge_vertices_va_vb_0==0): + edge_vertices_va_vb_0 = new_index_of_ver + edge_vertices_va_vb_1 = vc + new_index_of_ver = new_index_of_ver+1 + else: + edge_vertices_va_vb_2 = vc + + new_ver_index = edge_vertices_va_vb_0 + return new_ver_index,va,vb,vc,edge_vertices_va_vb_0,edge_vertices_va_vb_1,edge_vertices_va_vb_2,new_index_of_ver + + +vertices = [[10,10,10],[-100,10,-10],[-100,-10,10],[10,-10,-10]] +faces = [[0,1,2],[0,2,3],[0,3,1],[3,2,1]] + +print(loop(vertices,faces)) \ No newline at end of file From e8a117ee82a9160c90c513a9adb7649dc1f630bb Mon Sep 17 00:00:00 2001 From: JILLWONG <411702101@qq.com> Date: Fri, 15 Jun 2018 19:43:17 +0800 Subject: [PATCH 24/53] edit --- relaxrender/SubdivisionSurface/loop.py | 8 ++++---- relaxrender/loopSubdivision/loop.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/relaxrender/SubdivisionSurface/loop.py b/relaxrender/SubdivisionSurface/loop.py index 66f4fcc..611add8 100644 --- a/relaxrender/SubdivisionSurface/loop.py +++ b/relaxrender/SubdivisionSurface/loop.py @@ -24,15 +24,15 @@ def loop(vertices,faces): va=faces[f_i][0] vb=faces[f_i][1] vc=faces[f_i][2] - vp,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver) + vp,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver) edge_vertices[va][vb][0]=ev0 edge_vertices[va][vb][1]=ev1 edge_vertices[va][vb][2]=ev2 - vq,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(vb,vc,va,edge_vertices,new_index_of_ver) + vq,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(vb,vc,va,edge_vertices,new_index_of_ver) edge_vertices[va][vb][0]=ev0 edge_vertices[va][vb][1]=ev1 edge_vertices[va][vb][2]=ev2 - vr,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(va,vc,vb,edge_vertices,new_index_of_ver) + vr,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(va,vc,vb,edge_vertices,new_index_of_ver) edge_vertices[va][vb][0]=ev0 edge_vertices[va][vb][1]=ev1 edge_vertices[va][vb][2]=ev2 @@ -78,7 +78,7 @@ def loop(vertices,faces): return new_vertices,new_faces -def add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver): +def _add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver): if (va>vb): v_tmp = va va = vb diff --git a/relaxrender/loopSubdivision/loop.py b/relaxrender/loopSubdivision/loop.py index 66f4fcc..611add8 100644 --- a/relaxrender/loopSubdivision/loop.py +++ b/relaxrender/loopSubdivision/loop.py @@ -24,15 +24,15 @@ def loop(vertices,faces): va=faces[f_i][0] vb=faces[f_i][1] vc=faces[f_i][2] - vp,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver) + vp,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver) edge_vertices[va][vb][0]=ev0 edge_vertices[va][vb][1]=ev1 edge_vertices[va][vb][2]=ev2 - vq,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(vb,vc,va,edge_vertices,new_index_of_ver) + vq,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(vb,vc,va,edge_vertices,new_index_of_ver) edge_vertices[va][vb][0]=ev0 edge_vertices[va][vb][1]=ev1 edge_vertices[va][vb][2]=ev2 - vr,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=add_edge_vertices(va,vc,vb,edge_vertices,new_index_of_ver) + vr,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(va,vc,vb,edge_vertices,new_index_of_ver) edge_vertices[va][vb][0]=ev0 edge_vertices[va][vb][1]=ev1 edge_vertices[va][vb][2]=ev2 @@ -78,7 +78,7 @@ def loop(vertices,faces): return new_vertices,new_faces -def add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver): +def _add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver): if (va>vb): v_tmp = va va = vb From 21c2fbd7c8ae2094888f67b3be55804ce38130b9 Mon Sep 17 00:00:00 2001 From: Shirhockton <781502127@qq.com> Date: Fri, 15 Jun 2018 19:47:41 +0800 Subject: [PATCH 25/53] tian's work complete the interface --- .idea/workspace.xml | 20 +-- .../test/Shirhockton/DOO_Sabin.py | 130 ++++++++++++------ 2 files changed, 97 insertions(+), 53 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d11e1e3..72959af 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,9 @@ - + + + - + - - + @@ -291,8 +295,8 @@ - - + + diff --git a/relaxrender/SubdivisionSurface/test/Shirhockton/DOO_Sabin.py b/relaxrender/SubdivisionSurface/test/Shirhockton/DOO_Sabin.py index 49630f1..83fc00d 100644 --- a/relaxrender/SubdivisionSurface/test/Shirhockton/DOO_Sabin.py +++ b/relaxrender/SubdivisionSurface/test/Shirhockton/DOO_Sabin.py @@ -18,6 +18,23 @@ def __init__(self, points): self.points = points +""" + DOO_Sabin(faces,times): + input:faces(list) , subdivision times + output:new faces(list) + + + + faces ————list of face + face ———— points ——— list of point +""" + +def DOO_Sabin(faces,times): + for i in range(0,times): + _DOO_Sabin_single_time(faces) + return faces + + # class points_doo: # def __init__(self,main_point,points): # self.main_point=main_point @@ -25,21 +42,31 @@ def __init__(self, points): # def add_point(self,p): # self.points.append(p) -def DOO_Sabin_single_time(faces): + +def _change_faces(x_faces): + s_faces=[] + for f in x_faces: + new_points=[] + for l in f: + new_points.append(l[0]) + new_points.append(l[1]) + new_f=new_points + s_faces.append(new_f) + return s_faces + + + +def _DOO_Sabin_single_time(faces): for f in faces: - f = get_new_face(f) + f = _get_new_face(f) for points_ds in points_doos: new_face = Face(points_ds) faces.append(new_face) return faces -def DOO_Sabin(faces,times): - for i in range(0,times): - DOO_Sabin_single_time(faces) - return faces -def get_face_point(face): - face_point = get_average_point(face.points) +def _get_face_point(face): + face_point = _get_average_point(face.points) return face_point @@ -48,8 +75,8 @@ def get_face_point(face): ''' -def get_new_face(face): - face_point = get_face_point(face) +def _get_new_face(face): + face_point = _get_face_point(face) new_face_points = [] for p in face.points: @@ -73,10 +100,10 @@ def get_new_face(face): tmp1 = face.points.index(p) - 1 tmp2 = face.points.index(p) + 1 - last_average_line = get_average_point([p, face.points[tmp1]]) - next_average_line = get_average_point([p, face.points[tmp2]]) + last_average_line = _get_average_point([p, face.points[tmp1]]) + next_average_line = _get_average_point([p, face.points[tmp2]]) - new_face_point = get_average_point([p, face_point, last_average_line, next_average_line]) + new_face_point = _get_average_point([p, face_point, last_average_line, next_average_line]) new_face_points.append(new_face_point) @@ -107,7 +134,7 @@ def get_new_face(face): return new_face -def get_average_point(points): +def _get_average_point(points): x_sum = 0 y_sum = 0 z_sum = 0 @@ -124,7 +151,7 @@ def get_average_point(points): ''' -def print_point(p): +def _print_point(p): tmp = [p.data[0], p.data[1], p.data[2]] print(tmp) @@ -132,50 +159,63 @@ def print_point(p): ''' debug:print the points of the face ''' -def print_face(f): +def _print_face(f): for p in f.points: - print_point(p) + _print_point(p) ''' debug:print the points ''' -def print_points(ps): +def _print_points(ps): for p in ps: - print_point(p) + _print_point(p) ''' debug:print the faces of the object ''' -def print_obj(faces): +def _print_obj(faces): i=0 for f in faces: i=i+1 print("face",i) - print_face(f) - - -if __name__ == '__main__': - point_test_1 = Point3D(4, 4, 4) - point_test_2 = Point3D(4, 4,0) - point_test_3 = Point3D(4, 0, 4) - point_test_4 = Point3D(4, 0, 0) - point_test_5 = Point3D(0, 4, 4) - point_test_6 = Point3D(0, 4, 0) - point_test_7 = Point3D(0, 0, 4) - point_test_8 = Point3D(0, 0, 0) - face_test_1 = Face([point_test_1, point_test_2, point_test_3, point_test_4]) - face_test_2 = Face([point_test_1, point_test_5, point_test_6, point_test_2]) - face_test_3 = Face([point_test_1, point_test_5, point_test_7, point_test_3]) - face_test_4 = Face([point_test_3, point_test_4, point_test_8, point_test_7]) - face_test_5 = Face([point_test_5, point_test_6, point_test_8, point_test_7]) - face_test_6 = Face([point_test_2, point_test_4, point_test_8, point_test_6]) - faces_test=[face_test_1,face_test_2,face_test_3,face_test_4,face_test_5,face_test_6] - print_obj(DOO_Sabin(faces_test,6)) - # points_test=[point_test_1,point_test_2,point_test_3,point_test_4] - # face_test=Face(points_test) - # print_face(get_new_face(face_test)) - # for ps in points_doos: - # print_points(ps) + _print_face(f) + + +def _change_point(point,color): + new_point=Point(point) + new_point.color=color + return new_point + + + +""" +test: +input: cube's faces,6 times +output:new faces +""" +# if __name__ == '__main__': +# point_test_1 = Point3D(4, 4, 4) +# point_test_2 = Point3D(4, 4,0) +# point_test_3 = Point3D(4, 0, 4) +# point_test_4 = Point3D(4, 0, 0) +# point_test_5 = Point3D(0, 4, 4) +# point_test_6 = Point3D(0, 4, 0) +# point_test_7 = Point3D(0, 0, 4) +# point_test_8 = Point3D(0, 0, 0) +# face_test_1 = Face([point_test_1, point_test_2, point_test_3, point_test_4]) +# face_test_2 = Face([point_test_1, point_test_5, point_test_6, point_test_2]) +# face_test_3 = Face([point_test_1, point_test_5, point_test_7, point_test_3]) +# face_test_4 = Face([point_test_3, point_test_4, point_test_8, point_test_7]) +# face_test_5 = Face([point_test_5, point_test_6, point_test_8, point_test_7]) +# face_test_6 = Face([point_test_2, point_test_4, point_test_8, point_test_6]) +# faces_test=[face_test_1,face_test_2,face_test_3,face_test_4,face_test_5,face_test_6] +# _print_obj(DOO_Sabin(faces_test,6)) +# # points_test=[point_test_1,point_test_2,point_test_3,point_test_4] +# # face_test=Face(points_test) +# # _print_face(_get_new_face(face_test)) +# # for ps in points_doos: +# # _print_points(ps) +# From 2c83e2dc02f4093ed05befd54e2c7dc1c373ad88 Mon Sep 17 00:00:00 2001 From: X-wenhao Date: Fri, 15 Jun 2018 19:47:42 +0800 Subject: [PATCH 26/53] change draw and add test to it --- .../CatmullClarkSubdivision.py | 26 ++++--------------- relaxrender/SubdivisionSurface/draw.py | 15 ++++++----- 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py index 6f2b2fb..5c46d04 100644 --- a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py +++ b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py @@ -25,16 +25,16 @@ def CatmullClarkSubdivision(faces,num): line_to_faces={} for i in range(num): - lines,line_to_faces,face_to_lines=build_index(faces) + lines,line_to_faces,face_to_lines=_build_index(faces) #print(line_to_faces,face_to_lines) - points,point_to_lines,line_to_points=build_index(lines) + points,point_to_lines,line_to_points=_build_index(lines) #draw(face_to_lines,line_to_points,points) #print("lines:",lines) - faces=CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines) + faces=_CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines) return faces -def build_index(faces): +def _build_index(faces): lines=[] face_to_lines={} line_to_faces={} @@ -66,7 +66,7 @@ def build_index(faces): PS:this func is not designed as a interface ''' -def CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines): +def _CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines): #print("old_points:",list((p.data[0],p.data[1],p.data[2]) for p in points)) #print("face_to_lines:",face_to_lines) #print("line_to_points:",line_to_points) @@ -121,21 +121,5 @@ def CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,l return re_faces -if __name__=='__main__': - verts = [(0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 0, 0), (0, 0, 1), (0, 1, 1), (1, 1, 1), (1, 0, 1)] - points=list(Point.create(np.array(list(v))) for v in verts) - line_to = [[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]] - face_to = [[0,1,2,3],[4,5,6,7],[0,4,8,9],[1,5,9,10],[2,6,10,11],[3,7,11,8]] - lines=[] - for lt in line_to: - lines.append([]) - for i in lt: - lines[-1].append(points[i]) - faces=[] - for ft in face_to: - faces.append([]) - for i in ft: - faces[-1].append(lines[i]) - CatmullClarkSubdivision(faces,4) diff --git a/relaxrender/SubdivisionSurface/draw.py b/relaxrender/SubdivisionSurface/draw.py index 1e97609..87f03af 100644 --- a/relaxrender/SubdivisionSurface/draw.py +++ b/relaxrender/SubdivisionSurface/draw.py @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt import numpy as np from relaxrender.points import Point,Point3D -from .CatmullClarkSubdivision import CatmullClarkSubdivision_in,build_index +from .CatmullClarkSubdivision import _CatmullClarkSubdivision_in,_build_index def draw(face_to_lines,line_to_points,points): verts=list((p.data[0],p.data[1],p.data[2]) for p in points) faces=[] @@ -57,16 +57,17 @@ def test_CatmullClarkSubdivision(): faces.append([]) for i in ft: faces[-1].append(lines[i]) + print('test CatmullClarkSubdivision, you should close the current to see the next') for i in range(4): - lines,line_to_faces,face_to_lines=build_index(faces) + lines,line_to_faces,face_to_lines=_build_index(faces) #print(line_to_faces,face_to_lines) - points,point_to_lines,line_to_points=build_index(lines) + points,point_to_lines,line_to_points=_build_index(lines) draw(face_to_lines,line_to_points,points) - #print("lines:",lines) - faces=CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines) - lines,line_to_faces,face_to_lines=build_index(faces) + faces=_CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines) + print('subdividing {},and there are {} faces now'.format(i+1,len(faces))) + lines,line_to_faces,face_to_lines=_build_index(faces) #print(line_to_faces,face_to_lines) - points,point_to_lines,line_to_points=build_index(lines) + points,point_to_lines,line_to_points=_build_index(lines) draw(face_to_lines,line_to_points,points) if __name__=='__main__': From a34ea3b2be17f10bb473f381461a1927365c94d1 Mon Sep 17 00:00:00 2001 From: Shirhockton <781502127@qq.com> Date: Fri, 15 Jun 2018 19:53:21 +0800 Subject: [PATCH 27/53] tian's work rename --- .idea/workspace.xml | 50 ++----- .../DOO_Sabin.py => DOOSabinSubdivision.py} | 0 .../Shirhockton/DOOSabinSubdivision.py} | 130 ++++++++++++------ 3 files changed, 100 insertions(+), 80 deletions(-) rename relaxrender/SubdivisionSurface/{test/Shirhockton/DOO_Sabin.py => DOOSabinSubdivision.py} (100%) rename relaxrender/SubdivisionSurface/{DOO_Sabin.py => test/Shirhockton/DOOSabinSubdivision.py} (53%) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 72959af..d286d9e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,7 @@ - + - - - - - - - - - - - - - + - + @@ -88,7 +76,6 @@ - @@ -126,6 +113,7 @@ - @@ -133,7 +159,7 @@ - + + + + + + + - - + + + @@ -184,7 +234,7 @@ - + @@ -199,6 +249,28 @@ + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + + + + + + + + + + + + + - - + + - + + - - - + + + + + + @@ -247,36 +335,42 @@ - + + - - - + + + + + + - - + + - + - - - + + + + + - + - - + + diff --git a/relaxrender/SubdivisionSurface/DOOSabinSubdivision.py b/relaxrender/SubdivisionSurface/DOOSabinSubdivision.py index 83fc00d..21faa84 100644 --- a/relaxrender/SubdivisionSurface/DOOSabinSubdivision.py +++ b/relaxrender/SubdivisionSurface/DOOSabinSubdivision.py @@ -19,20 +19,24 @@ def __init__(self, points): """ - DOO_Sabin(faces,times): + DOO_Sabin(faces,times): input:faces(list) , subdivision times output:new faces(list) - faces ————list of face - face ———— points ——— list of point + faces :list of face + face : points : list of point """ def DOO_Sabin(faces,times): + new_faces=[] + for f in faces: + n_f=Face(f) + new_faces.append(n_f) for i in range(0,times): - _DOO_Sabin_single_time(faces) - return faces + _DOO_Sabin_single_time(new_faces) + return new_faces # class points_doo: @@ -176,7 +180,7 @@ def _print_points(ps): ''' debug:print the faces of the object ''' -def _print_obj(faces): +def print_obj(faces): i=0 for f in faces: i=i+1 diff --git a/tests/test_DOOSabinSubdivision.py b/tests/test_DOOSabinSubdivision.py new file mode 100644 index 0000000..1e03131 --- /dev/null +++ b/tests/test_DOOSabinSubdivision.py @@ -0,0 +1,39 @@ +import numpy as np +from relaxrender.points import Point3D, Point +from relaxrender.SubdivisionSurface.DOOSabinSubdivision import * + +""" + point_test_*: Point3D + face_test_*: list of point_test + faces_test: list of face_test + +""" + +""" + DOO_Sabin(faces,times): + input:faces(list) , subdivision times + output:new faces(list) + + + + faces :list of face + face : points : list of point +""" + +if __name__ == '__main__': + point_test_1 = Point3D(4, 4, 4) + point_test_2 = Point3D(4, 4,0) + point_test_3 = Point3D(4, 0, 4) + point_test_4 = Point3D(4, 0, 0) + point_test_5 = Point3D(0, 4, 4) + point_test_6 = Point3D(0, 4, 0) + point_test_7 = Point3D(0, 0, 4) + point_test_8 = Point3D(0, 0, 0) + face_test_1 = [point_test_1, point_test_2, point_test_3, point_test_4] + face_test_2 = [point_test_1, point_test_5, point_test_6, point_test_2] + face_test_3 = [point_test_1, point_test_5, point_test_7, point_test_3] + face_test_4 = [point_test_3, point_test_4, point_test_8, point_test_7] + face_test_5 = [point_test_5, point_test_6, point_test_8, point_test_7] + face_test_6 = [point_test_2, point_test_4, point_test_8, point_test_6] + faces_test=[face_test_1,face_test_2,face_test_3,face_test_4,face_test_5,face_test_6] + print_obj(DOO_Sabin(faces_test,6)) \ No newline at end of file From a48820c9eb79b8ec9e4050320a64173863707767 Mon Sep 17 00:00:00 2001 From: X-wenhao Date: Sat, 16 Jun 2018 19:06:37 +0800 Subject: [PATCH 37/53] finish part of test --- .../CatmullClarkSubdivision.py | 4 +-- .../test_CatmullClarkSubdivision.py | 32 ++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) rename relaxrender/{SubdivisionSurface => }/CatmullClarkSubdivision.py (98%) rename relaxrender/SubdivisionSurface/draw.py => tests/test_CatmullClarkSubdivision.py (71%) diff --git a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py b/relaxrender/CatmullClarkSubdivision.py similarity index 98% rename from relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py rename to relaxrender/CatmullClarkSubdivision.py index b904d32..c84ad2f 100644 --- a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py +++ b/relaxrender/CatmullClarkSubdivision.py @@ -3,8 +3,8 @@ The interface is CatmullClarkSubdivision function ''' -from ..triangle import Triangle,Triangles -from ..points import Point,Point3D +from .triangle import Triangle,Triangles +from .points import Point,Point3D import numpy as np __author__="X-wenhao" diff --git a/relaxrender/SubdivisionSurface/draw.py b/tests/test_CatmullClarkSubdivision.py similarity index 71% rename from relaxrender/SubdivisionSurface/draw.py rename to tests/test_CatmullClarkSubdivision.py index aac8470..962b45b 100644 --- a/relaxrender/SubdivisionSurface/draw.py +++ b/tests/test_CatmullClarkSubdivision.py @@ -1,17 +1,39 @@ """ this module include function to draw,which is used during test - this module is also used to test CatmullClarkSubdivison ,just run as following - python -m relaxrender.Subdivision.draw + this module is also used to test CatmullClarkSubdivison """ - +import unittest from mpl_toolkits.mplot3d import Axes3D from mpl_toolkits.mplot3d.art3d import Poly3DCollection,Line3DCollection import matplotlib.pyplot as plt import numpy as np -from ..points import Point,Point3D -from .CatmullClarkSubdivision import _CatmullClarkSubdivision_in,_build_index +from relaxrender.points import Point,Point3D +from relaxrender.CatmullClarkSubdivision import _CatmullClarkSubdivision_in,_build_index __author__="X-wenhao" + +class TestCatmullClarkSubdivision(unittest.TestCase): + + def test_CatmullClarkSubdivision(self): + verts = [(0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 0, 0), (0, 0, 1), (0, 1, 1), (1, 1, 1), (1, 0, 1)] + points=list(Point.create(np.array(list(v))) for v in verts) + line_to = [[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]] + face_to = [[0,1,2,3],[4,5,6,7],[0,4,8,9],[1,5,9,10],[2,6,10,11],[3,7,11,8]] + lines=[] + for lt in line_to: + lines.append([]) + for i in lt: + lines[-1].append(points[i]) + faces=[] + for ft in face_to: + faces.append([]) + for i in ft: + faces[-1].append(lines[i]) + lines,line_to_faces,face_to_lines=_build_index(faces) + points,point_to_lines,line_to_points=_build_index(lines) + self.assertTrue(_CatmullClarkSubdivision_in(faces,lines,points,face_to_lines,line_to_points,line_to_faces,point_to_lines)) + + def draw(face_to_lines,line_to_points,points): verts=list((p.data[0],p.data[1],p.data[2]) for p in points) faces=[] From d879b07194a619618ecbf806d6429b274bcde0d3 Mon Sep 17 00:00:00 2001 From: Shirhockton <781502127@qq.com> Date: Sat, 16 Jun 2018 19:07:53 +0800 Subject: [PATCH 38/53] tian's work comlete the test --- .idea/workspace.xml | 166 ++++++++++--- .../test/Shirhockton/DOOSabinSubdivision.py | 221 ------------------ tests/test_DOOSabinSubdivision.py | 37 +-- 3 files changed, 159 insertions(+), 265 deletions(-) delete mode 100644 relaxrender/SubdivisionSurface/test/Shirhockton/DOOSabinSubdivision.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e854c7a..98f125c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,9 @@ - - + + - + - + @@ -31,10 +31,10 @@ - + - + @@ -43,13 +43,25 @@ - - + + - - + + - + + + + + + + + + + + + + @@ -112,7 +124,6 @@ - @@ -125,12 +136,6 @@ - - - - - - @@ -140,6 +145,7 @@ - @@ -253,7 +249,7 @@ - + @@ -303,6 +299,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -312,6 +374,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -326,7 +416,6 @@ - @@ -334,9 +423,6 @@ - - - @@ -354,9 +440,7 @@ - - - + @@ -365,9 +449,7 @@ - - - + @@ -376,9 +458,6 @@ - - - @@ -403,9 +482,7 @@ - - - + @@ -414,9 +491,7 @@ - - - + @@ -425,9 +500,7 @@ - - - + @@ -436,9 +509,7 @@ - - - + @@ -447,9 +518,7 @@ - - - + @@ -458,9 +527,7 @@ - - - + @@ -484,9 +551,6 @@ - - - @@ -494,9 +558,7 @@ - - - + @@ -504,13 +566,12 @@ - - + @@ -518,16 +579,6 @@ - - - - - - - - - - @@ -540,7 +591,7 @@ - + @@ -548,5 +599,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py b/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py deleted file mode 100644 index 8c60eb5..0000000 --- a/relaxrender/SubdivisionSurface/CatmullClarkSubdivision.py +++ /dev/null @@ -1,30 +0,0 @@ -''' - TODO: finish Catmull Clark Subdivision - data struct: - point: relaxrender.points.Point3D - line : relaxrender.points.Vector - face : [line,line,...] -''' - -from relaxrender.points import Point3D,Vector -import numpy as np - -__all__==['CatmullClarkSubdivision'] - -''' - subdivide a model according to its points and faces - return points and faces after subdivision - - param: - points: [point,point,...] - faces : [face,face,...] - return: - [points,faces] -''' -def CatmullClarkSubdivision(points,faces): - - pass - - - - diff --git a/relaxrender/SubdivisionSurface/__init__.py b/relaxrender/SubdivisionSurface/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/relaxrender/SubdivisionSurface/draw.py b/relaxrender/SubdivisionSurface/draw.py deleted file mode 100644 index e69de29..0000000 From 46a88777c0a64d11ca93b563a8d00e13ed326804 Mon Sep 17 00:00:00 2001 From: X-wenhao Date: Sun, 17 Jun 2018 12:28:41 +0800 Subject: [PATCH 43/53] move file --- .../SubdivisionSurface/LoopSubdivision.py | 104 --------------- relaxrender/SubdivisionSurface/__init__.py | 0 .../test/RookieBrain/design | 118 ------------------ .../test/RookieBrain/rela_tes | 36 ------ .../SubdivisionSurface/test/RookieBrain/sce | 105 ---------------- 5 files changed, 363 deletions(-) delete mode 100644 relaxrender/SubdivisionSurface/LoopSubdivision.py delete mode 100644 relaxrender/SubdivisionSurface/__init__.py delete mode 100644 relaxrender/SubdivisionSurface/test/RookieBrain/design delete mode 100644 relaxrender/SubdivisionSurface/test/RookieBrain/rela_tes delete mode 100644 relaxrender/SubdivisionSurface/test/RookieBrain/sce diff --git a/relaxrender/SubdivisionSurface/LoopSubdivision.py b/relaxrender/SubdivisionSurface/LoopSubdivision.py deleted file mode 100644 index 611add8..0000000 --- a/relaxrender/SubdivisionSurface/LoopSubdivision.py +++ /dev/null @@ -1,104 +0,0 @@ -from math import * - - -def loop(vertices,faces): - ''' - input:vertices=[[x0,y0,z0],[x1,y1,z1]...],faces=[[index0,index1,index2]...] - output:new_vertices,new_face - - ''' - num_faces=len(faces) - num_vertices=len(vertices) - new_vertices=vertices+[[0,0,0]]*num_faces*3 - new_index_of_ver=num_vertices - edge_vertices=[] - new_faces=[] - - for i in range(num_vertices): - x=[] - for j in range(num_vertices): - x.append([0,0,0]) - edge_vertices.append(x) - - for f_i in range(0,num_faces): - va=faces[f_i][0] - vb=faces[f_i][1] - vc=faces[f_i][2] - vp,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(va,vb,vc,edge_vertices,new_index_of_ver) - edge_vertices[va][vb][0]=ev0 - edge_vertices[va][vb][1]=ev1 - edge_vertices[va][vb][2]=ev2 - vq,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(vb,vc,va,edge_vertices,new_index_of_ver) - edge_vertices[va][vb][0]=ev0 - edge_vertices[va][vb][1]=ev1 - edge_vertices[va][vb][2]=ev2 - vr,va,vb,vc,ev0,ev1,ev2,new_index_of_ver=_add_edge_vertices(va,vc,vb,edge_vertices,new_index_of_ver) - edge_vertices[va][vb][0]=ev0 - edge_vertices[va][vb][1]=ev1 - edge_vertices[va][vb][2]=ev2 - four_faces=[[va,vp,vr],[vp,vb,vq],[vr,vq,vc],[vr,vp,vq]] - new_faces=new_faces+four_faces - - - for v_i in range(0,num_vertices-1): - for v_j in range(v_i,num_vertices): - v_index=edge_vertices[v_i][v_j][0] - if(v_index!=0): - first_opposite_index_ver=edge_vertices[v_i][v_j][1] - second_opposite_index_ver=edge_vertices[v_i][v_j][2] - if(first_opposite_index_ver==0 or second_opposite_index_ver==0): - new_vertices[v_index]=[1.0/2*vertices[v_i][i]+1.0/2*vertices[v_j][i] for i in range(3)] - else: - new_vertices[v_index]= [(3/8*vertices[v_i][i]+3/8*vertices[v_j][i] \ - + 1/8*vertices[first_opposite_index_ver][i]+1/8*vertices[second_opposite_index_ver][i]) \ - for i in range(3)] - - adj_ver=[] - for ov_i in range(0,num_vertices): - x=[] - for ov_j in range(0,num_vertices): - if((ov_iov_j and edge_vertices[ov_j][ov_i][0]!=0)): - x.append(ov_j) - adj_ver.append(x) - - for ov in range (0,num_vertices): - k=len(adj_ver[ov]) - adj_boundary_ver=[] - for i in range(0,k): - ov_adj=adj_ver[ov][i] - if((ov_adj>ov and edge_vertices[ov][ov_adj][2]==0) or (ov_adjvb): - v_tmp = va - va = vb - vb = v_tmp - - edge_vertices_va_vb_0=edge_vertices[va][vb][0] - edge_vertices_va_vb_1=edge_vertices[va][vb][1] - edge_vertices_va_vb_2=edge_vertices[va][vb][2] - if (edge_vertices_va_vb_0==0): - edge_vertices_va_vb_0 = new_index_of_ver - edge_vertices_va_vb_1 = vc - new_index_of_ver = new_index_of_ver+1 - else: - edge_vertices_va_vb_2 = vc - - new_ver_index = edge_vertices_va_vb_0 - return new_ver_index,va,vb,vc,edge_vertices_va_vb_0,edge_vertices_va_vb_1,edge_vertices_va_vb_2,new_index_of_ver - - -vertices = [[10,10,10],[-100,10,-10],[-100,-10,10],[10,-10,-10]] -faces = [[0,1,2],[0,2,3],[0,3,1],[3,2,1]] - -print(loop(vertices,faces)) \ No newline at end of file diff --git a/relaxrender/SubdivisionSurface/__init__.py b/relaxrender/SubdivisionSurface/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/relaxrender/SubdivisionSurface/test/RookieBrain/design b/relaxrender/SubdivisionSurface/test/RookieBrain/design deleted file mode 100644 index c5e7605..0000000 --- a/relaxrender/SubdivisionSurface/test/RookieBrain/design +++ /dev/null @@ -1,118 +0,0 @@ -import numpy as np - -from .triangle import Triangle, Triangles -from .points import Point3D, Vector - -__all__ = ['dist', - 'sphere_sampling', - 'line_in_triangle', - 'ray_in_triangle'] - - -def dist(p3d1, p3d2): - return np.linalg.norm(p3d1.data - p3d2.data) - - -def sphere_sampling(sample_size): - # according to https://en.wikibooks.org/wiki/Mathematica/Uniform_Spherical_Distribution - theta = np.random.random((sample_size, 1)) * np.pi * 2 - phi = np.arccos(np.sqrt(np.random.random((sample_size, 1)))) *2 - - res = np.concatenate((np.sin(phi)*np.cos(theta), - np.sin(phi)*np.sin(theta), - np.cos(phi)), axis=1) - - if sample_size == 1: - return res[0,0], res[0, 1], res[0, 2] - else: - return res - - - -def line_in_triangle(ray, triangle): - """ - input: ray is a vector - input: triangle is a Triangle - output: interact point or None. - """ - - vray = ray.end.data - ray.start.data - vnorm = triangle.norm.end.data - triangle.norm.start.data - if np.abs(np.dot(vray, vnorm)) < 1e-3: - return None - - tray = triangle.p1.data - ray.start.data - alpha = np.dot(tray, vnorm) / np.dot(vray, vnorm) - - ipoint = alpha * ray.end.data + (1-alpha) * ray.start.data - - v1 = triangle.p1.data - ipoint - v2 = triangle.p2.data - ipoint - v3 = triangle.p3.data - ipoint - v1norm = np.linalg.norm(v1) - v2norm = np.linalg.norm(v2) - v3norm = np.linalg.norm(v3) - - if v1norm < 1e-6 or v2norm < 1e-6 or v3norm < 1e-6: - return None - - v1 = v1 / np.linalg.norm(v1) - v2 = v2 / np.linalg.norm(v2) - v3 = v3 / np.linalg.norm(v3) - - d1 = np.arccos(np.dot(v1, v2)) - d2 = np.arccos(np.dot(v2, v3)) - d3 = np.arccos(np.dot(v3, v1)) - - if np.abs(np.sum((d1, d2, d3)) - np.pi*2) < 1e-3: - return Point3D(ipoint[0], ipoint[1], ipoint[2]) - else: - return None - - -def ray_in_triangle(ray, triangle, include_start_point=False): - """ - input: ray is a vector - input: triangle is a Triangle - output: interact point or None. - """ - vray = ray.end.data - ray.start.data - vnorm = triangle.norm.end.data - triangle.norm.start.data - if np.abs(np.dot(vray, vnorm)) < 1e-3: - return None - - tray = triangle.p1.data - ray.start.data - - alpha = np.dot(tray, vnorm) / np.dot(vray, vnorm) - - if include_start_point: - if alpha < 0: - return None - else: - if alpha <= 0: - return None - - ipoint = alpha * ray.end.data + (1-alpha) * ray.start.data - - v1 = triangle.p1.data - ipoint - v2 = triangle.p2.data - ipoint - v3 = triangle.p3.data - ipoint - v1norm = np.linalg.norm(v1) - v2norm = np.linalg.norm(v2) - v3norm = np.linalg.norm(v3) - - if v1norm < 1e-6 or v2norm < 1e-6 or v3norm < 1e-6: - return None - - v1 = v1 / np.linalg.norm(v1) - v2 = v2 / np.linalg.norm(v2) - v3 = v3 / np.linalg.norm(v3) - - d1 = np.arccos(np.dot(v1, v2)) - d2 = np.arccos(np.dot(v2, v3)) - d3 = np.arccos(np.dot(v3, v1)) - - if np.abs(np.sum((d1, d2, d3)) - np.pi*2) < 1e-3: - return Point3D(ipoint[0], ipoint[1], ipoint[2]) - else: - return None diff --git a/relaxrender/SubdivisionSurface/test/RookieBrain/rela_tes b/relaxrender/SubdivisionSurface/test/RookieBrain/rela_tes deleted file mode 100644 index 627940f..0000000 --- a/relaxrender/SubdivisionSurface/test/RookieBrain/rela_tes +++ /dev/null @@ -1,36 +0,0 @@ -import numpy as np - -from .color import Color - -class Context: - output_device = ['jpg', 'mp4', 'screen'] - - def __init__(self): - self.color_mode = 'RGB' - - self.triangle_right_hand_norm = True - - self.x_right_from_screen = True - self.y_up_from_screen = True - self.z_face_screen = True - - self.x_range = (-1.0, 1.0) - self.y_range = (-1.0, 1.0) - self.z_range = (-1.0, 1.0) - - self.raycasting_iteration = int(1e6) - - self.writer_output_device = 'jpg' - self.writer_color_mode = 'RGB' - self.output_height = 600 - self.output_width = 800 - - def integration_test(self): - if self.color_mode not in Color.supported_color_space.keys(): - raise ValueError('unsupported color mode in context.') - - if self.writer_output_device not in Context.output_device: - raise ValueError('unsupported output device.') - - if self.writer_color_mode not in Color.supported_color_space.keys(): - raise ValueError('unsupported writer color mode in context.') diff --git a/relaxrender/SubdivisionSurface/test/RookieBrain/sce b/relaxrender/SubdivisionSurface/test/RookieBrain/sce deleted file mode 100644 index 8f8a17a..0000000 --- a/relaxrender/SubdivisionSurface/test/RookieBrain/sce +++ /dev/null @@ -1,105 +0,0 @@ -import numpy as np - -from .scene import Scene -from .camera import PerspectiveCamera -from .mesh import Mesh -from .texture import Texture, PlaneLightSource, UniformReflection -from .triangle import Triangles -from .points import Point3D, Point2D -from .triangle import Triangle, Triangles -from .color import Color, Red, White, Black, Green, Blue, Grey - -__all__ = ['cornell_box'] - - -def make_cornell_box(): - tris = Triangles() - texs = [] - tex_pos = [] - - # add light - tris.append_rct(np.array([0.5, 0.999, -0.5]), - np.array([-0.5, 0.999, -0.5]), - np.array([-0.5, 0.999, -1.5]), - np.array([0.5, 0.999, -1.5])) - - texs.append(PlaneLightSource()) - texs.append(PlaneLightSource()) - - tex_pos.append(None) - tex_pos.append(None) - - # add ceilling, wall, floor - # ceiling - tris.append_rct(np.array([1, 1, 0]), - np.array([-1, 1, 0]), - np.array([-1, 1, -2]), - np.array([1, 1, -2])) - - texs.append(UniformReflection(Grey)) - texs.append(UniformReflection(Grey)) - - tex_pos.append(None) - tex_pos.append(None) - - # left wall - tris.append_rct(np.array([-1, 1, 0]), - np.array([-1, -1, 0]), - np.array([-1, -1, -2]), - np.array([-1, 1, -2])) - - texs.append(UniformReflection(Red)) - texs.append(UniformReflection(Red)) - - tex_pos.append(None) - tex_pos.append(None) - - # right wall - tris.append_rct(np.array([1, 1, 0]), - np.array([1, 1, -2]), - np.array([1, -1, -2]), - np.array([1, -1, 0])) - - texs.append(UniformReflection(Green)) - texs.append(UniformReflection(Green)) - - tex_pos.append(None) - tex_pos.append(None) - - # floor - tris.append_rct(np.array([-1, -1, 0]), - np.array([1, -1, 0]), - np.array([1, -1, -2]), - np.array([-1, -1, -2])) - - texs.append(UniformReflection(Grey)) - texs.append(UniformReflection(Grey)) - - tex_pos.append(None) - tex_pos.append(None) - - # back - tris.append_rct(np.array([1, 1, -2]), - np.array([-1, 1, -2]), - np.array([-1, -1, -2]), - np.array([1, -1, -2])) - - texs.append(UniformReflection(Grey)) - texs.append(UniformReflection(Grey)) - - tex_pos.append(None) - tex_pos.append(None) - - - mesh = Mesh(tris, texs, tex_pos) - - c_pos = np.array([0.0, 0.0, 1.0]) - c_up = np.array([0.0, 1.0, 0]) - c_right = np.array([1.0, 0.0, 0]) - camera = PerspectiveCamera(c_pos, c_up, c_right, np.pi/2, np.pi/2) - - ret = Scene(mesh, camera) - - return ret - -cornell_box = make_cornell_box() From 37753f8b3ace9b00e7925c8e9e37b8e814f47e83 Mon Sep 17 00:00:00 2001 From: X-wenhao Date: Sun, 17 Jun 2018 12:32:52 +0800 Subject: [PATCH 44/53] add .idea/ to .gitignore --- .gitignore | 1 + .idea/misc.xml | 4 - .idea/modules.xml | 8 - .idea/relaxrender.iml | 18 -- .idea/vcs.xml | 6 - .idea/workspace.xml | 552 ------------------------------------------ 6 files changed, 1 insertion(+), 588 deletions(-) delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/relaxrender.iml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.gitignore b/.gitignore index 3339914..4a97af1 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ build .coverage .pytest_cache/ htmlcov/ +.idea/ diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 88092ab..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 8eb388c..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/relaxrender.iml b/.idea/relaxrender.iml deleted file mode 100644 index fdb3a83..0000000 --- a/.idea/relaxrender.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index a641b6b..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Point - - - _print_obj - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1528458610023 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From dc4f6518f32d6b81053bf86ebf560c736b8d6c9a Mon Sep 17 00:00:00 2001 From: Shirhockton <781502127@qq.com> Date: Sun, 17 Jun 2018 13:46:17 +0800 Subject: [PATCH 47/53] tian --- .idea/misc.xml | 4 - .idea/modules.xml | 8 - .idea/relaxrender.iml | 18 -- .idea/vcs.xml | 6 - .idea/workspace.xml | 613 ------------------------------------------ 5 files changed, 649 deletions(-) delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/relaxrender.iml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 88092ab..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 8eb388c..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/relaxrender.iml b/.idea/relaxrender.iml deleted file mode 100644 index fdb3a83..0000000 --- a/.idea/relaxrender.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index ddbfa49..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,613 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Point - - - _print_obj - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -