NCF参数化建筑论坛

标题: 3d 凸包 ghx已传上 [打印本页]

作者: panhao1    时间: 2010-1-21 03:02
标题: 3d 凸包 ghx已传上
本帖最后由 panhao1 于 2010-1-22 17:04 编辑

3000ms
扫描算法是网上的 请高人指点
基本上没有用处
算法相当蛮力
弄出几乎可能出现的所有的面 然后逐面进行判定
19个点就存在16*16*16=4096个面 判定4096次 很恐怖的
{:3_63:}
以前2d hull的算法也很糟糕 请高手指点
这里贴上2d hull的代码
Private Sub RunScript(ByVal x As List(Of On3dPoint), ByRef A As Object)
    'your code goes here…
    Dim list As  New List (Of On3dPoint)
    Dim firstPt As New On3dPoint(x(0))
    Dim j As Integer = 0
    For i As Integer = 1 To x.count - 1
      If x(i).x < firstPt.x Then
        firstPt = x(i)
        j = i
      End If
    Next
    list.Add(firstpt)
    Dim firstPt1 As New On3dPoint(firstpt)
    'first is correct
    Dim listPt As New List (Of On3dPoint)(x)
    listPt.RemoveRange(j, 1)
    Dim sign As Integer = 0
    While sign = 0
      'print(jj)
      For ii As Integer=0 To listpt.Count - 1
        If ispt(firstPt, listpt(ii), listpt, ii) = True Then
          If listpt(ii) = firstpt1 Then
            sign = 1
            Exit For
          Else
            print(ispt(firstPt, listpt(ii), listpt, ii))
            Dim newlistpt As New List (Of On3dPoint)(x)
            newlistpt = removeitem(firstpt, newlistpt)
            print(newlistpt.count)
            firstPt = listpt(ii)
            list.Add(firstpt)
            newlistpt = removeitem(firstpt, newlistpt)
            print(newlistpt.count)
            listpt = newlistpt
            Exit For
          End If
        End If
      Next
    End While
    a = list







  End Sub
  '<Custom additional code>
  Function ispt(first, second, list, i)
    Dim list1 As New list(Of On3dpoint)
    list1 = list
    Dim second1 As New On3dpoint
    second1 = second
    Dim vector As New On3dVector
    vector = first - second
    Dim v As New On3dVector(0, 0, 1)
    vector.Rotate(1.5708, v)
    Dim third As New list(Of On3dPoint)(list1)
    third.removerange(i, 1)
    Dim sign As Double = 0
    '____________________________________________
    For j As Integer=0 To third.count - 1
      Dim forth As New On3dVector
      forth = first - third(j)
      Dim v1 As New On3dVector(vector)
      Dim v2 As New On3dVector(forth)
      v1.unitize()
      v2.unitize()
      Dim dot As Double
      dot = OnUtil.ON_DotProduct(v1, v2)
      If (dot > 1) Then dot = 1
      If (dot < -1) Then dot = -1
      dot = math.Acos(dot)
      If dot < 1.571 Then
        sign = 1
        Exit For
      End If
    Next
    '______________________________
    If sign = 0 Then
      ispt = True
    Else
      ispt = False
    End If
  End Function
  Function removeitem(item, list)
    Dim newlist As New list(Of On3dPoint)
    For i As Integer=0 To list.count - 1
      If  list(i) <> item Then
        newlist.add(list(i))
      End If
    Next
    removeitem = newlist
  End Function


效果视屏已传上
作者: panhao1    时间: 2010-1-21 03:07
最快的算法是通过求向量交角来判定边界 我用的是数点Function ispt(first, second, list, i)
慢了一个数量级 有没有哪位同学知道如何区分交角是顺时针还是逆时针
作者: skywoolf    时间: 2010-1-21 09:25
有点理解紫暗说的算法问题了,期待高手出现.
作者: nice    时间: 2010-1-21 11:26
囧,你不是做出了个,3D 的么,怎么不贴下,也许大家写不会,要改的话就容易多了,这样也容易多了吧
作者: panhao1    时间: 2010-1-21 15:45
4# nice

讨论算法的话并不需要代码吧
网上有C++的扫描算法 但是移植到gh里还是有些困难的
我的算法很简单 就是判定所有存在的面是否符合凸包的要求

计算几何上的逐个添加点的算法 不知有人看懂了没有
讨论算法用伪码就行了

这是3d hull的伪码
输入 L(3d 点)
for (i=0 ,i<L.length-2,i++){
for (j=i ,i<L.length-1,j++){
for (k=j ,i<L.length-,k++){
if(L(i),L(j),L(k)组成的面否符合hull的边界条件){
添加L(i),L(j),L(k)组成的面到集合M中
}

}
}
}


算法太囧 不好意思贴出来
作者: renn    时间: 2010-1-21 16:38
O'Rourke (1998) gives a robust two-dimensional implementation as well as an  three-dimensional implementation. Qhull works efficiently in 2 to 8 dimensions (Barber et al. 1996).
作者: gzblake    时间: 2010-1-21 23:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: panhao1    时间: 2010-1-21 23:18
7# gzblake
其他算发有退化的bug的 2级循环算法是很烂
一般都是通过 向量朝一个方向的转角的大小 找点
Function ispt(first, second, list, i)
是很笨的方法 但bug最少

你可以改成求出(已知的一条边和 (这条边的末端点与其它点的连线)的交角集合)中的最小值来找点
作者: gzblake    时间: 2010-1-21 23:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: panhao1    时间: 2010-1-22 09:54
本帖最后由 panhao1 于 2010-1-22 09:59 编辑

9# gzblake
2d凸包不算退化情况的话 是这样的 思考怎样用一根线箍住扎在木板上的一些钉子就就明白了
作者: skywoolf    时间: 2010-1-22 10:12
{:3_51:}这个图表达的真清晰~
作者: gzblake    时间: 2010-1-22 15:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 咸鱼空间    时间: 2010-1-22 15:39
买来看看{:3_46:}
作者: panhao1    时间: 2010-1-22 17:08
修改了一个bug 把ghx文件传上来了
会C++的大歌帮忙指点下扫描法吧
作者: gzblake    时间: 2010-1-22 22:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: abiao111    时间: 2010-1-26 01:39
5# panhao1
思路很清晰哈
哦 两级嵌套循环…感觉貌似冗余度有点大………
作者: Qrange    时间: 2010-1-26 20:53
感觉是个好东西~
作者: yl0110    时间: 2010-1-28 22:53
真的很牛····
作者: hadid    时间: 2010-1-29 13:44
凸包是什么呢,我觉得这个还是真不错
作者: dunksman    时间: 2010-2-4 01:49
很棒啊!! 学习,学习!
作者: qsun1988    时间: 2010-2-4 03:01
学习中,谢谢
作者: redspread    时间: 2010-2-10 00:00
群里看到讨论,真巧看到此帖。认真学习一下。
作者: Avalon    时间: 2010-2-10 15:40
这贴有技术
作者: skyvsapple1    时间: 2010-4-11 20:48
看贴必回。。。。。。。。。。。
作者: franksu86    时间: 2010-4-28 02:56
樓主厲害   小弟學習到了 !
作者: franksu86    时间: 2010-5-2 13:34
弱弱問一下    3dhull的扫描算法.txt 要放在gh檔的vb ?
作者: panhao1    时间: 2010-5-2 20:55
26# franksu86
不是vb代码
作者: franksu86    时间: 2010-5-2 22:51
那3dhull的扫描算法.txt的部分是用來做什麼的 ?
作者: panhao1    时间: 2010-5-2 23:14
28# franksu86
给大家研究算法的
作者: franksu86    时间: 2010-5-3 03:01
謝謝你的解說 !!!!
作者: vonngy    时间: 2010-5-18 09:44
不会编程~不会C++~~~
作者: sonicely    时间: 2010-7-7 14:15
好东西啊!
作者: hzhbeck7    时间: 2010-7-10 04:04
高手啊,学习了!
作者: hzhbeck7    时间: 2010-7-12 00:32
看不懂,期待楼主详解
作者: nexx    时间: 2010-7-12 16:23
2d的好理解 一个点顶多两根边线共享一个点 3d的呢?
作者: fb1985218    时间: 2010-9-14 17:21
支持原创,顶楼主
作者: qwesxqe    时间: 2010-10-10 14:59
很牛逼{:3_46:}
作者: winseedme    时间: 2011-3-26 23:43
谢谢楼主学习学习
作者: 3582076094    时间: 2011-4-4 13:25
支持3d……
作者: 刘鹏涛    时间: 2011-4-4 13:38
感谢楼主分享 分享了
作者: hfly31    时间: 2011-4-10 12:49
强悍啊!!!!11
作者: 元未觉醒1984    时间: 2011-5-27 23:30
这么贵??
作者: 元未觉醒1984    时间: 2011-5-27 23:31
望楼主降价啊
作者: rfnkwj    时间: 2011-8-2 14:37
真的很蠻力阿....
作者: 于房巴    时间: 2011-11-5 07:06
1~3折售ONLY_H&M_杰克琼斯_ZARA等知名品牌服装(专柜新品 与市场同步 假一罚十) :13132208878

天津地区送货上门货到付款,发现质量问题无条件退全款,批发零售皆可。

所有商品均为原单,数量有限清版即止,欲购从速。

13132208878  QQ 78130933
作者: 红叶小子    时间: 2011-11-5 09:46
怎么总是看不到呢
作者: foxaaa    时间: 2011-11-5 09:48
这个完全不懂啊
楼主
作者: 王建芹    时间: 2011-11-5 10:29
下载下来 学习学习
作者: haiou8    时间: 2011-11-7 21:08
不知道说啥
作者: cloudone    时间: 2011-11-14 21:50
真的很不错哟~~
作者: V.Y    时间: 2011-12-5 10:54
这个技术贴,,,都是大侠- -
作者: s.k.    时间: 2011-12-10 17:02
与神在交流,嘿嘿
作者: 9j6ikr3u    时间: 2011-12-27 18:43
网络举报、社会事件发帖,举报爆料曝光℡182{8611}9596,UV
举报专业发帖,检举爆料曝光,还社会一个公道。152+1122_238  182{8611}9596,UV 点击百度快照
假设看不到信息,请点击右下角“百度百度快照”。本团队是网络专业举报发帖,由8人组成,日手工发帖量6000,有24万论坛的数据。可以让你需要传播的信息2天之内发送到各大搜索引擎(如百度,谷歌等)。有无数热心的网友关注转载。
本团队自2008年创办,已有3年的历史和经验,为一些正规渠道无法上报,无法让公众知晓的事件发帖曝光。 为整个社会更加公平公正贡献一份力量。
152+1122_238  182{8611}9596,UV
作者: ha123321    时间: 2013-10-11 14:25
感谢楼主啊
作者: ha123321    时间: 2013-10-11 15:32
很好的教程,多谢楼主分享!~~
作者: ha123321    时间: 2013-10-11 19:04
感谢楼主啊
作者: 左手◆23年    时间: 2014-2-16 11:44
不错,感谢楼主分享!




欢迎光临 NCF参数化建筑论坛 (http://ncf-china.com/) Powered by Discuz! X3.2