NCF参数化建筑论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 13659|回复: 20
打印 上一主题 下一主题

voronoi 2D 脚本

[复制链接]
跳转到指定楼层
1m
发表于 2009-9-24 15:35:44 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
刚刚看贴子的时候发现,以前答应给yanhui兄发voronoi 2D的脚本,一直都忘了,现在发出来, yanhui兄不会怪罪我吧。

Call Main()
Sub Main()
Dim aa,i
Dim arrBox,box2
aa=rhino.getobjects("point",1)

For i=0 To ubound(aa)
  arrBox=creatbox(aa,aa(i))
  box2=intersectbox(arrBox)
  
Next
End Sub
Function creatbox(points,cen)
Dim po,v1,v2,v3,vv,ce
Dim ps(4)
Dim v11,v22,v33
Dim i,j
Dim pts,mid,length
Dim cbox
length=10
vv=array(0,0,1)
ReDim cbox(Ubound(points))
enableredraw(False)
For i = 0 To UBound(points)
  pts= Rhino.PointCoordinates(Points(i))
  ce=rhino.PointCoordinates(cen)
  If Not rhino.isvectorzero(rhino.VectorSubtract(pts,ce)) Then
   mid=midp(ce,pts)
   v1=rhino.vectorunitize(rhino.VectorCreate(ce,mid))
   v2=rhino.vectorunitize(rhino.vectorcrossproduct(v1,vv))
   v3=rhino.vectorunitize(rhino.VectorReverse(v2))
  v11=rhino.VectorScale(v1,2*length)
   v22=rhino.VectorScale(v2,length)
   v33=rhino.VectorScale(v3,length)
  ps(0)=rhino.VectorAdd(mid,v22)
  ps(1)=rhino.VectorAdd(mid,v33)
   ps(2)=rhino.vectoradd(ps(1),v11)
   ps(3)=rhino.VectorAdd(ps(0),v11)
   ps(4)=rhino.VectorAdd(mid,v22)
   '检验xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   'rhino.AddPoint(ps(0))
   'rhino.AddPoint(ps(1))
   'rhino.AddPoint(ps(2))
   'rhino.AddPoint(ps(3))
   'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   cbox(i)=rhino.Addcurve(ps,2)
  End If
Next
enableredraw(True)
creatbox=deletenull(cbox)
End Function
Function intersectbox(bb)
intersectbox=Null
Dim i,qq,j
Dim aa
ReDim aa(ubound(bb))
aa(0)=bb(0)
enableredraw(False)
For i=1 To ubound(bb)
  qq=rhino.curveBooleanIntersection(bb(i),aa(i-1))
  If isarray(qq) Then
   If i=1 Then Rhino.DeleteObject bb(i-1)
   Rhino.DeleteObject bb(i)
   For j=1 To ubound(qq)
    rhino.DeleteObject(qq(j))
  Next
   aa(i)=qq(0)
   rhino.DeleteObject(aa(i-1))
  Else
   Rhino.DeleteObject bb(i)
   aa(i)=aa(i-1)
  End If
Next
enableredraw(True)
intersectbox=bb(0)
End Function   
Function midp(p1,p2)
midp=Null
midp=Array((p1(0)+p2(0))/2,(p1(1)+p2(1))/2,(p1(2)+p2(2))/2)
End Function
Function deletenull(list)
deletenull=Null
Dim i,j,n,m
n=Ubound(list)
For i=0 To n
  If isempty(list(i))=True Then m=i  
Next
For j=m To n-1
  list(j)=list(j+1)
Next
ReDim Preserve list(n-1)
deletenull=list
End Function

评分

参与人数 2强度 +1 照度 +2 收起 理由
iknowhy + 2 感谢分享!
yanhui314 + 1

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
2m
 楼主| 发表于 2009-9-24 18:57:23 | 显示全部楼层
这个应该可以看懂了吧。

小黑屋|手机版|NCF参数化建筑论坛 ( 浙ICP备2020044100号-2 )    辽公网安备21021102000973号

GMT+8, 2024-5-16 04:26 , Processed in 0.250282 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表