最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Grasshopper 中樹形數(shù)據(jù)的實際應(yīng)用

2023-09-14 22:58 作者:Rhino3D原廠中國  | 我要投稿

本文以設(shè)計一座橋梁的鋼纜的連接方式為例,詳細(xì)分析了在使用GH的實現(xiàn)過程中,如何利用GH既有的數(shù)據(jù)規(guī)則來解決實際設(shè)計中遇到的復(fù)雜問題。過程著重于介紹分析思路,反映設(shè)計過程中遇到的數(shù)據(jù)處理及如何解決問題的思維過程。內(nèi)容屬于較為深入的GH部分,要求學(xué)員對Grasshopper有較久的使用經(jīng)驗,且對數(shù)據(jù)結(jié)構(gòu)的規(guī)則較為清楚。

?

在過去十年的Grasshopper技術(shù)推廣過程中,我們注意到:由于大部分設(shè)計專業(yè)的學(xué)員之前并沒有接受過系統(tǒng)編程課程的邏輯思維訓(xùn)練,因此在使用Grasshopper的過程中涉及到邏輯思維的部分通常都會感覺較為吃力。

這個問題的另一個具體的表象就是:很多學(xué)員在遇到Grasshopper的樹形數(shù)據(jù)結(jié)構(gòu)時,對它的概念理解以及實際運用層面感到困難。這通常是所有學(xué)習(xí)GH的用戶到了某個階段都需要跨過的一道坎。

與其他的參數(shù)化設(shè)計軟件和編程軟件不同,GH采用的樹形據(jù)結(jié)構(gòu)的數(shù)據(jù)管理是很特別的,它可以讓用戶“分層級”的“多維度”的管理和控制大量的數(shù)據(jù)。但前提是使用者必須對這種數(shù)據(jù)管理和控制的原理有對應(yīng)的了解,才能對其進行合理和靈活的控制。這部分是很多使用者依靠自己琢磨難以深入到的部分。在此我們將用一個實際的設(shè)計案例的過程分析幫助用戶思考樹形數(shù)據(jù)的組織關(guān)系。


?

設(shè)計一座懸掛結(jié)構(gòu)的橋

這是一個懸掛結(jié)構(gòu)的橋,如圖是整個橋的側(cè)面結(jié)構(gòu)。黑色矩形方框是橋體。橋體上10個紅色點橋體的固定點,用鋼絲懸掛固定。頂上的兩個藍(lán)色矩形代表懸掛橋的兩個立柱,每個立柱上各有3個鋼絲固定點。我們需要解決的問題就是如何在橋體和柱子的固定點之間拉鋼絲。


這個設(shè)計中遇到的實際問題可以被簡化為點連線的問題,即:如何在下面10個點和上面6個點(2*3結(jié)構(gòu))之間做各種連線方式的設(shè)計。為了理清設(shè)計思路,我們先看兩種最極端的連線方式:

  1. 最穩(wěn)固的方式(連線最復(fù)雜)

  2. 最省材料的方式(連線最簡單)


?

1. 最穩(wěn)固的方式(連線最復(fù)雜)

所謂最穩(wěn)固的方式(并且是合理的),也即是:橋體的每個點(底下的10個點)都和柱子上的每個點(頂上的6個點)都做連線。

這個連線方式可以概括為:10個點和6個點之間的所有可能的連線,是交叉的數(shù)據(jù)對應(yīng)的方式,因此會有60條線(10乘以6)。

雖說是最復(fù)雜的連線方式,但是在編程邏輯中卻是最簡單的,程序如下圖:

連接效果如圖:

雖然這是最穩(wěn)固的連接方式,邏輯上來講很簡單,程序處理也很容易。但連接的視覺效果卻不夠好,因為橋體上的每個點都掛了6根連線,很明顯連線過于密集(10*6=60根連線),并且造價也較貴。

2. 最省材料的連接方式

所謂最省材料的連接方式,也即是:橋體上的每個點(10個點)只使用一根鋼絲做固定。

從連接的角度可以理解為:底部的10個點中,每個點都和上面的6個點的其中之一做連接。

思考:那么具體和頂部的哪一個點做連接呢?通常與最近的一個點連接是最合理的,因為最省材料而且鋼纜牽引的角度也更趨近于垂直向上,力學(xué)上來說較為合理。

所以,整個連線的邏輯就是:底部的10個點中,每個點與頂上的6個點中最近的一個點做連線。

這個邏輯就稍微復(fù)雜一點了,從編程邏輯來考慮,實現(xiàn)這個效果可以分兩個步驟實現(xiàn):

  1. 首先做出橋體上每個點與柱體上6個點的連線。

  2. 然后從每個橋體上點的6個連線中挑選出最短的一根。

在這個編程邏輯中要特別注意:第一步的程序輸出的數(shù)據(jù)雖然仍然是得到60根線,但是如果這60根線是在同一個列表中的,那么從數(shù)據(jù)管理的角度來說是有缺陷的,因為這樣的數(shù)據(jù)結(jié)構(gòu)無法反映出橋體上的某一個點上連接的6根連線是哪6根。因此無法進行長度的比對和挑選,因此到了第二步也就也無法完成最短線的挑選。

因此在第一步中,這60跟線必須是依據(jù)底部的10個點分別處理的,也即是:第一步輸出的數(shù)據(jù)結(jié)構(gòu)應(yīng)該有10個分支(列表)對應(yīng)底部的10個點,而每個分支里面有6個數(shù)據(jù)(6根線)。這種數(shù)據(jù)結(jié)構(gòu)可以清楚的反映出60根線中,哪些線是連接哪個點的。這實際上就是Grasshopper的樹形數(shù)據(jù)的基本用途。數(shù)據(jù)結(jié)構(gòu)圖和GH中的Param Viewer觀察輸出結(jié)構(gòu)應(yīng)該如下圖所示:


提示:Param Viewer是用于檢查樹形結(jié)構(gòu)常用的工具,用戶應(yīng)該熟悉如何去閱讀它。

?

2.1?橋體上每個點與柱體上6個點的連線

第一個步驟的程序如下圖所示:

程序處理細(xì)節(jié):為了保證輸出結(jié)果是想要的樹形結(jié)構(gòu),因此根據(jù)GH的數(shù)據(jù)對應(yīng)法則,必須把B端的數(shù)據(jù)做Graft處理,這樣數(shù)據(jù)的對應(yīng)方式就變成橋體上的每個點與頂部的六個點做數(shù)據(jù)對應(yīng)連接線。

思考:做Graft之后數(shù)據(jù)產(chǎn)生什么樣的結(jié)構(gòu)變化?為什么要把B端做Graft,而不是把A端做Graft?如果對A端做Graft數(shù)據(jù)會變成什么樣的數(shù)據(jù)結(jié)構(gòu)?為什么需要這樣的數(shù)據(jù)結(jié)構(gòu)?


2.2 每個橋體點的6個連線中挑選最短一根

這個功能從編程邏輯角度思考可以這樣解決:首先對每個點的六條線的長度做從小到大的排序,然后從中挑第一條線,因為第一條線必定是每個點的六條線中最短的一根。這部分并不涉及數(shù)據(jù)結(jié)構(gòu)的處理,理解工具運作的原理就可以做出來,程序如下:

效果如下圖,每條線都是底部的每個點與頂部6個點中最近的一個點的連線:

在這個例子中,如何控制程序?qū)⑤敵龅?0根線使用樹形結(jié)構(gòu)做正確的歸屬管理,是程序?qū)崿F(xiàn)正確連線效果的關(guān)鍵。

總結(jié):以上兩種方案都是最極端的:例如第一個方案安全性自然是最好,但是因為連線最多意味著實際項目中鋼纜也必須使用很多,因此造價很貴。而第二種方案雖然造價最便宜,但是因為每個橋體上的固定點只有一根鋼纜固定,因此安全性也是最差的??梢栽囅肴绻渲杏幸桓訑嗔?,那么整個橋就有一半的區(qū)域完全沒有支撐,因此很可能整個橋立馬就垮了。所以有時候我們會綜合造價、成本等因素來考慮解決方案。

3. 較合理的方式

上述兩個極端方案都有各自的明顯的問題,因此從加強安全性角度考慮可以做些改進:讓橋體上的每個固定點都有2根鋼纜拉住它,且兩根鋼纜分別連接到兩個不同的立柱上。再從造價和力學(xué)角度考慮讓每根鋼纜連接對應(yīng)的立柱中最短的一個點,這樣可以在安全性和造價方面獲得一個不錯的平衡。

因此這個設(shè)計的具體要求就是:對于橋體上的10個點,每個點分別跟兩個立柱連接的3根線中挑選出最短的一根。

這個設(shè)計從邏輯上來講其實和第二個方案比較接近,區(qū)別在于第二個設(shè)計僅僅要求找出每個點的6個連線中最短的一個,而這個設(shè)計要求還需將每個點的6根線按照立柱的歸屬分成2組,然后再找出每一組中的最短的線。因此輸出的60根線應(yīng)該是按照如下的樹形結(jié)構(gòu)管理和數(shù)據(jù)結(jié)構(gòu)的程序為:

首先需要注意:立柱點輸入端輸入的數(shù)據(jù),必須按照立柱歸屬做樹形結(jié)構(gòu)的管理,兩個分支對應(yīng)兩個立柱,每個分支里面3個數(shù)據(jù)對應(yīng)每個立柱的三個固定點。

立柱的樹形數(shù)據(jù)結(jié)構(gòu)依賴于前端的程序?qū)?yīng)生成。

在接下來的連線程序部分會遇到數(shù)據(jù)對應(yīng)方面的控制問題,當(dāng)前程序部分結(jié)構(gòu)如下:

現(xiàn)在A和B組數(shù)據(jù)的結(jié)構(gòu)與之前不同,按照GH的數(shù)據(jù)對規(guī)則來看,事實上這里無論怎么調(diào)整都不可能直接得到我們要的數(shù)據(jù)結(jié)構(gòu)。<想想為什么>

因此我們的考慮就是退而求其次:如果沒有辦法直接得到60根線(10個點—2個立柱—3根線) 的樹形結(jié)構(gòu)方式,那么我也可以接受其他的樹形結(jié)構(gòu)管理方式,只要60跟線的數(shù)據(jù)沒有混淆在一起,我們就可以在后面做樹形結(jié)構(gòu)的調(diào)整。

因此在這里我們可以考慮讓得到的60根線的樹形結(jié)構(gòu)可以體現(xiàn)出:分別屬于橋體10個點,分別屬于2個立柱,分別屬于立柱的3個固定點的結(jié)構(gòu)?也即是樹形結(jié)構(gòu)中必須體現(xiàn)出:10,3,2的結(jié)構(gòu),無論順序如何。<這里根據(jù)排列原則有六種樹形結(jié)構(gòu)是符合要求的>

當(dāng)前的程序從輸入數(shù)據(jù)的樹形結(jié)構(gòu)來分析唯一可以做到這個效果的方法就是:將A組的數(shù)據(jù)做Graft,如下圖所示。<思考為什么其他方式都不可以?>

輸出的數(shù)據(jù)接結(jié)構(gòu)如下,嘗試?yán)斫饷總€層級代表的含義是什么。

上面的樹形數(shù)據(jù),結(jié)構(gòu)是<2,3,10>的結(jié)構(gòu),是符合我們的預(yù)期的。但我們希望樹形結(jié)構(gòu)管理是這樣:底部10個點的每個點分別與兩個立柱各自的3三個點連線。因此數(shù)據(jù)結(jié)構(gòu)應(yīng)該是:

因此接下來我們需要在GH中把當(dāng)前的樹形結(jié)構(gòu)做對應(yīng)調(diào)整:


調(diào)整樹形結(jié)構(gòu)的組織順序,使到的工具是Path Mapper,Path Mapper在調(diào)整樹形結(jié)構(gòu)方面有非常多的用途,但是要做到靈活運用,用戶首先要能看懂樹形結(jié)構(gòu)代表的含義,進一步必須清楚自己需要的樹形結(jié)構(gòu)是什么樣的,才能配合Path Mapper做對應(yīng)的調(diào)整。如果對Path Mapper工具用法不清楚,建議系統(tǒng)學(xué)習(xí)Rhino原廠的發(fā)布的一套視頻工具課程:

Grasshopper 工具視頻課程

?? https://pezzs.xet.tech/s/3uvetF

?

一旦樹形結(jié)構(gòu)調(diào)整正確了,后面的部分就很容處理了,跟之前的部分完全一樣:對每個分支中的三條線的長度做從小到大的排序,根據(jù)排序把對應(yīng)第一條線跳出來即可。完整程序如下:

可以看到,雖然整個程序編寫過程中涉及的樹形數(shù)據(jù)的理解和控制需要非常多的思考,但是寫出來的程序卻是很簡單的。

最終效果如下圖所示,其設(shè)計的連線邏輯就是:橋體上的每個點都有兩根線拉住它,并且這兩根線分別連接到兩個不同的立柱上(分散風(fēng)險),并且每根線都是立柱上3個點中距離最短的點的連線(造價低,力學(xué)效果好)。

因為程序本身可以處理立柱點輸入端的多分枝數(shù)據(jù)結(jié)構(gòu),因此對于更加復(fù)雜的設(shè)計,例如我們需要將立柱數(shù)量變成5個,僅僅需要從輸入端將對應(yīng)的5個分支的數(shù)據(jù)輸入即可,程序不需要做任何修改,仍然是簡單的結(jié)構(gòu)但是可以處理復(fù)雜的數(shù)據(jù),如下圖所示:

思考:文章的后面部分中,我們將介紹一種不太好的編程思路。也是很多對Grasshopper數(shù)據(jù)結(jié)構(gòu)缺乏理解的用戶很常見的做法。


4. 用戶常見分析方式

例如剛才我們提到的第三種方案:找出底部10個點的每個點分別跟兩個立柱連接的3根線中最短的一根。

遇到這種需要處理復(fù)雜的樹形結(jié)構(gòu)的程序的時候,我們經(jīng)常見到用戶會使用下面這種做法。

程序僅考慮處理單個柱子連接的情況,程序如下:

這個程序幾乎可以沿用最簡化方案的程序,但輸入僅僅是3個點(第一根柱子里的)。

當(dāng)需要處理多根立柱的數(shù)據(jù)的時候,將整個程序復(fù)制一個出來,輸入端更換為另一根柱子的3個點,最后再把數(shù)據(jù)合并在一起如下圖所示。

這種做法雖然也可以做到本例中的效果,但是其的本質(zhì)是用多個一模一樣的程序并排分別處理不同立柱中的數(shù)據(jù),然后再把每個程序得到的數(shù)據(jù)合并在一起。

這種做法如果要說好處,應(yīng)該是可以少費一點腦力,不用去組織多層的樹形數(shù)據(jù)結(jié)構(gòu)。但是缺點也是很明顯的:如果柱子數(shù)量較多,就需要手工復(fù)制出這部分的程序并每個都做修改來實現(xiàn)分別的處理,程序會因此變得很復(fù)雜,不利于修改和管理程序,程序執(zhí)行效率也會變得比較低。例如前例中最后提到的:如果設(shè)計變動成5跟立柱,那么程序就必須復(fù)制出5個一模一樣的部分,分別改動每個立柱的數(shù)據(jù),如下圖所示:

這種方式還有一個嚴(yán)重的缺點:如果柱子數(shù)量本身是一個設(shè)計中考慮的變量,那么如果柱子數(shù)量發(fā)生變動,每次使用者都必須手動更改每一個程序部分:重新連接每個程序部分的輸入數(shù)據(jù),重新連線,更改每一個程序的參數(shù),否則程序運行就會出錯。

也即是說,這種方法是因為程序無法處理輸入端的樹形結(jié)構(gòu)數(shù)據(jù),因此把數(shù)據(jù)結(jié)構(gòu)拆開讓多個程序分別處理,因此這種程序往往顯得“呆板”,它不能適應(yīng)輸入的數(shù)據(jù)分支結(jié)構(gòu)發(fā)生變化的情況。

提示:通過這個案例的過程解釋,希望學(xué)員可以掌握能夠處理復(fù)雜的樹形結(jié)構(gòu)的程序的方法,寫出高效而聰明的程序輔助設(shè)計。

?


本次分享結(jié)束,歡迎分享這篇文章給你身邊的小伙伴。

如果你在使用 Rhino Grasshopper 時遇到問題,可以前往 Rhino 中文討論區(qū)發(fā)帖提問哦~


Grasshopper 中樹形數(shù)據(jù)的實際應(yīng)用的評論 (共 條)

分享到微博請遵守國家法律
新闻| 临安市| 特克斯县| 莱阳市| 濮阳市| 崇仁县| 普格县| 澄迈县| 揭阳市| 长沙县| 武夷山市| 芮城县| 酒泉市| 台北市| 汉源县| 邻水| 新巴尔虎左旗| 乌恰县| 霍邱县| 九龙坡区| 鄂伦春自治旗| 泾阳县| 南汇区| 平邑县| 阿克| 岱山县| 平塘县| 会东县| 安仁县| 玉田县| 舒兰市| 方城县| 都昌县| 交口县| 阳泉市| 广灵县| 昭通市| 思南县| 萝北县| 湘潭县| 禹州市|