论文需要生成一个球面网格,最简单的想法是通过正多面体的细分来逼近球面。我们知道柏拉图多面体有五个,三个是由正三角形组成(正四,八,二十面体),一个由正方形组成(正六面体),一个由正五边形组成(正十二面体)。三角形的细分比较简单,而且保持拓扑可以连续细分。
由于只是为了得到图片,就直接用matlab来实现了,方便,matlab中画着三角网格可以用trimesh或者patch
Syntax
trimesh(Tri,X,Y,Z)
trimesh(Tri,X,Y,Z,C)
trimesh(...'PropertyName',PropertyValue...)
patch(X,Y,C)
patch(X,Y,Z,C)
patch(FV)
patch(...'PropertyName',propertyvalue...)
patch('PropertyName',propertyvalue,...)
但是都要用一个参数来指定每个三角面是由那些点组成(比如trimesh中的Tri)。我们用vertex储存点,face指定面由哪些点构成,细分的函数如下:
1 function [vertex, face] = Subdivision(vertex, face) 2 face_num = size(face, 1); 3 vertex_num = size(vertex, 1); 4 new_vertexs = zeros(face_num*3, 3); 5 new_faces = zeros(face_num*3, 3); 6 for i = 1 : face_num 7 new_vertexs(3*(i-1)+1, :)=(vertex(face(i, 1), :)+vertex(face(i, 2), :))/2; 8 new_vertexs(3*(i-1)+1, :)= new_vertexs(3*(i-1)+1, :)/norm(new_vertexs(3*(i-1)+1, :),2); 9 new_vertexs(3*(i-1)+