Option Explicit 'Script written by <重庆大学建筑城规学院,王大川(www.alwayswdc.com)> 'Script copyrighted by <共享,非商业,署名> 'Script version 2011年1月26日 10:02:42 Call Main() Sub Main() '用户输入主要参数 Dim m(7) msgbox "要取得完整形态,theta起始角度取0,结束角度取6.2831852,phi起始角度取0,结束角度3.1415926,m值最好取0-10范围,更多变化请自行尝试" m(0)=rhino.getreal("请输入大于等于0的整数m0") m(1)=rhino.getreal("请输入大于等于0的整数m1") m(2)=rhino.getreal("请输入大于等于0的整数m2") m(3)=rhino.getreal("请输入大于等于0的整数m3") m(4)=rhino.getreal("请输入大于等于0的整数m4") m(5)=rhino.getreal("请输入大于等于0的整数m5") m(6)=rhino.getreal("请输入大于等于0的整数m6") m(7)=rhino.getreal("请输入大于等于0的整数m7") Dim radius,thetaslice(1),thetastart,thetarange,phislice(1),phistart,phirange radius=rhino.getreal("请输入半径") thetaslice(0)=rhino.getreal("theta起始角度(0-2pi) ") thetaslice(1)=rhino.getreal("theta结束角度(0-2pi),大于起始角度 ") thetastart=thetaslice(0) thetarange=thetaslice(1)-thetaslice(0) phislice(0)=rhino.getreal("phi起始角度(0-pi) ") phislice(1)=rhino.getreal("phi结束角度(0-pi),大于起始角度 ") phistart=phislice(0) phirange=phislice(1)-phislice(0) Dim thetaresolution,phiresolution thetaresolution=rhino.getreal("输入竖向计算精度(最好小于500)") phiresolution=rhino.getreal("输入横向计算精度(最好小于500)") '步长与范围映射到PI和UV空间 Dim du,dv,mu,mv du = thetarange / thetaresolution dv = phirange / phiresolution mu = 1.0 / (thetaresolution - 1) mv = 1.0 / phiresolution '添加点-关键步骤 Dim i,u,mapu,mapv,pt0,j,v,points(50000),s s=0 For i=0 To thetaresolution u = i * du + thetastart mapu = i * mu For j=0 To phiresolution + 1 v = j * dv + phistart mapv = j * mv pt0=mainfunction(u,v,m,radius) Call rhino.addpoint(pt0) '建立点索引 points(s)=pt0 s=s+1 Next Next '嵌面 If 1=1 Then Dim pphi,pnum,x,y,a,b,c,d pphi = phiresolution + 1 pnum = ((phiresolution + 1) * (thetaresolution )) For x= 0 To phiresolution For y= 0 To thetaresolution a=x+y*pphi b=(x+1)+y*pphi c=((x + 1) + ((y + 1) * pphi))Mod pnum d=(x + (y + 1) * pphi) Mod pnum Call rhino.addsrfpt(Array(points(a),points(b),points(c),points(d))) Next Next End If End Sub ' '球谐函数公式部分 Function mainfunction(u,v,m,radius) Dim r,collect(2) r=0 r=r+(sin(m(0)*v))^m(1) r=r+(cos(m(2)*v))^m(3) r=r+(sin(m(4)*u))^m(5) r=r+(cos(m(6)*u))^m(7) r=r*radius collect(0)=r*sin(v)*cos(u) collect(1)=r*cos(v) collect(2)=r*sin(v)*sin(u) mainfunction=collect End Function