NCF参数化建筑论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15314|回复: 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 17:33:21 | 只看该作者
哪里哪里,我有VB.net的voronoi2D,但是没看懂,RS版的应该能看懂。
3m
 楼主| 发表于 2009-9-24 18:57:23 | 只看该作者
这个应该可以看懂了吧。
4m
发表于 2009-9-27 05:27:19 | 只看该作者
3# f(x)

很不错嘛,这个脚本是你写的吗?
5m
发表于 2009-10-19 18:34:10 | 只看该作者
{:3_57:}多有一些更有意义的脚本就好了,呵呵~
6m
发表于 2009-10-19 22:15:18 | 只看该作者
5# yjj8927367

我也很期待啊,可惜这种东西不太好弄到……
7m
发表于 2009-11-28 15:53:01 | 只看该作者
4# 射手明
我的代码风格都没看出来
我不是把北京写得代码都考给你了么 都不看下 哎~~~~
8m
发表于 2010-1-26 17:04:56 | 只看该作者
现在不是有不少人会rvb了么
这个脚本是我半年前写的 里面有很严重的bug
要想消除很简单

For i=0 To ubound(aa)
  arrBox=creatbox(aa,aa(i))
之间加个距离的排序(升序哦)就可以了
重排一下数组就行了

其实这个算法是仿照3d voronoi来的 并不太好 算得慢死了
好的算法《计算几何》里有 没必要认为这就是2dvoronoi的标准算法
9m
发表于 2010-3-26 23:13:57 | 只看该作者
好像挺不賴的
10m
发表于 2010-3-31 18:31:35 | 只看该作者
的确有比较严重的bug啊~
11m
发表于 2010-5-19 23:56:48 | 只看该作者
一看这么多就烦啊。要是我写出来的也许就不会了吧,呵呵
12m
发表于 2010-7-22 02:04:48 | 只看该作者
thanks~~~~~
13m
发表于 2010-8-2 23:06:44 | 只看该作者
顶 学学!!!!!
14m
发表于 2010-11-17 22:24:54 | 只看该作者
好像跟那个经典有点差距啊
15m
发表于 2010-12-11 23:02:33 | 只看该作者
楼主真不错~~~~~~~~
16m
发表于 2011-4-18 12:03:49 | 只看该作者
这个是RS的??楼主很强大呀/。。。
17m
发表于 2011-4-19 09:20:01 | 只看该作者
樓主很強大。。向你好好學習。。。
18m
发表于 2011-4-19 10:56:20 | 只看该作者
楼主太强大了
19m
发表于 2011-4-28 12:22:24 | 只看该作者
very good!!!!!
20m
发表于 2011-6-11 15:05:02 | 只看该作者
lz  我好葱白你哦.....

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

GMT+8, 2024-11-27 14:58 , Processed in 0.098603 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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