Grasshopperでは、入力したデータの順番を変更したり、階層構造を修正するコンポーネントがSetsタブの中に多くあります。またデータ構造を任意に変更することで、Rhinoで操作するときに選択する順番を変える様な働きをさせることもできます。
https://www.applicraft.com/ghcp_sets/
Setsタブの中でも、使用頻度の高い[Sort List]コンポーネントを紹介したいと思います。
[Sort List]は、名前の通り入力したデータをSort(並び替える)働きをします。K(Key-鍵)に入力した値を、昇順(低い値から順)に並び替えます。例)2と0と1を入力すると、値が0→1→2と順に並びます。

通常の[Sort List]コンポーネントの働き
その際、Aの端子に同数のデータを入力すると、Kと同じ順に並び替えることができるという働きも持ちます。また、あくまでKの順に並び替えるので、Aの値はどういったデータ(テキスト、点、曲線、サーフェスなど)でも構いません。

AにKと同数の値を入力した例
この仕組みを使うことで、様々なアルゴリズムに応用できます。下記、[Sort List]の使用例となります。
このページで使用しているghファイルはこちらからダウンロードできます。
Rhinoから読み込んだ点を、円を描くように順に並び替えて曲線を作成する
Set Multiple Points から、特に順を指定せずRhinoから読み込み、[Nurbs Curve]コンポーネントで曲線を作成した例。点の順番がランダムになっているため、曲線の形状がおかしくなっています。
[Circle Fit]で入力した点群にできる限り近しい円を作成し、[Curve Closest Point]で点が最も近い円の上にあるt値を取得し、[Sort List]のK端子にt値を、A端子に点を入力することで、t値順に点を並び替えて、曲線を作成した例。
円のt値順に点を並び替えることで、周回する曲線が作成できます。
Rhinoから読み込んだ曲線を、Y座標順に並び替えてLoftする
Set Multiple CurvesでRhinoから読み込んだ曲線群を、Y座標順に並び変えたアルゴリズム。
[Control Points]で曲線の制御点を取得。曲線の最初の制御点(List Itemの0番)のY座標を取得して、[Sort List]を使い、Y座標順に読み込んだ曲線を並び替えています。
ここではY方向に並んだ曲線群だったので、一方向にLoftできています。
読み込んだ曲線群

並び替えずにLoft

Y順に並び替えてLoft


Rhinoから読み込んだ閉じた断面のSeam(継ぎ目)の位置を変更し、Sweep1で面を作成した例
Set Multiple CurvesでRhinoから読み込んだ閉じた三角形の断面を、レール曲線に最も近い点をSeam(継ぎ目)にするよう変更して[Sweep1]で面を作成したアルゴリズム例。
閉じた曲線を使ってLoftやSweepを行うと、Seamの位置が問題となり、意図した形状が作成できないことがあります。RhinoではマウスでドラッグすることでSeamを修正できますが、Grasshopperでは下記のようなアルゴリズムで修正が必要な場合があります。
[Discontinuity]で三角形の断面の折れた箇所の点とt値を取得(三角形なので、断面ごとにそれぞれ三つずつ取得できる)。
折れた箇所の点とレール曲線との距離を[Curve Closest Point]で求めて、[Sort List]で距離順にt値を並び替えます。
もっとも近いt値(List Itemの0番)を使用して、[Seam]で曲線が始まる継ぎ目に指定。その後に、[Sweep1]で面を作成した例になります。
ここでは、念のため閉じた曲線の断面の向きが逆転することがないように、[Flip Curve]でGuide曲線と向きを揃えています。
読み込んだ曲線

Seamを並び替えずにSweep1

Seamを変更してSweep1


※クリックで拡大します。
データ階層でSort Listを使用した応用例 データを任意の階層に分割する
[Hexagonal]で作成した六角形を、指定した数になるように階層に分けてランダムに出力するアルゴリズム。
六角形の個数を[List Length]で求め、その個数だけ[Random]のIntegersオプションを使い、指定した範囲内の整数を作成。
[Sort List]を使い、ランダムな整数値の順に六角形を並び替えて、[Partition List]で階層に分けることで、
ランダムにデータを取り出すアルゴリズムになります。



[Sort List]はKeyに入れた値をもとに、別の値を並び替えるというシンプルな働きですが、モデリングする際やデータを管理する際などにも使える非常に応用範囲が広いコンポーネントになります。
また、例ではKとAの2つの入力で行いましたが、コンポーネントにズームし、+アイコンから端子の数を任意に増やして使用することもできます。[Sort List]は多岐にわたる場面で使用可能なコンポーネントなので、是非使いこなしてアルゴリズムを作成して頂けたらと思います。


このページで使用したghファイルはこちらからダウンロードできます。