Graft, Flatten, Simplify の意味について

「Graft」「Flatten」「Simplify」の3つは、ghを使う上でとても重要です。これらを理解していなければマトモにグラスホッパーは使えない、というレベルです。

これらは、コンポーネントの入出力で、つなぎ目で右クリックすれば操作できます。

graft

では、これから解説をしますが、実際のコーディングでデータ構造を確認したいときは「Panel」を使います。「Panel」あるいは「//」と打ち込むと、データの中身が見られるコンポーネントが現れます。「Panel」は最も使うコンポーネントの一つです。

lines

この例は、3つの箱にそれぞれ3本のLineが入っている状態ですね。グラスホッパーではこのデータ全体のことを「ツリー(Tree)」と呼び、箱のことを「ブランチ(Branch)」と呼びます。また、それぞれのデータの左に書かれている数字を「インデックス(Index)」と呼びます。つまり「このツリーには{0;0},{0;1},{0;2}という3つのブランチにそれぞれ3本のLineが入っている」と言うことができます。

①「Graft」は「細分化」を意味します。

今、2つのツリーにそれぞれ3つの点があるとします。

1

赤と緑は3対3でピッタリ対応してるので、ラインで結ぶと綺麗に3本になります。

normal-line

ここで片方を「Graft」すると、線が増えます。

graft-line

ここで何が起こっているかというと、片方が「Graft」で細分化されたことで、赤の小さな箱1つと緑の大きな箱一つが対応する状態になり、結果として3つの対応関係が生まれています。

2

つまり、見た目では9本の線でしかありませんが、実際は紫3本、黄色3本、青3本で、大きな箱の中に細分化された箱が3つあり、それぞれに右の大きな箱が対応しています。

点をラインで繋ぐ等「動作型コンポーネント」適応すると一番内側の箱同士が対応します。なので、両方「Graft」をかければ、見た目上、元に戻ります。

3

この細分化が「Graft」による操作です。

②「Flatten」は全てのアイテムを一つのブランチの中にまとめます。

次に「Flatten」の解説をします。「Flatten」は「Graft」とは逆に仕切りを払うので、片方にかければ線の多い状態に戻ります。

2

注意すべきは「Graft」からの「Flatten」は不可逆ではない、ということです。
「Graft」はそれまであった仕切りを維持+さらに細分化しますが、「Flatten」はすべての仕切りを問答無用に取っ払うため、2層以上の仕切りがある場合は戻れません。

ブランチが2層以上に重なる複雑な場合を見てみましょう。何度か「Graft」されて以下のようなツリー構造になったとします。
4

このような場合、左右を同じツリー構造にしようとして右を「Flatten」すると、仕切りがすべてなくなります。

5

対等な状態に戻すためには「Unflatten」や「Shift Path」というコンポーネントが必要になります。「Flatten」では大雑把すぎて「Graft」の効果を打ち消すことは無理というわけです。

③「Simplify」は見た目と中身のギャップをなくす

最後に「Simlify」ですが、これは見た目上の関係をベースに、余計な仕切りをなくしてシンプルにする、というものです。その必要があるのは、「Merge」などでデータを一つにするときです。

ラインで繋ぐといった「動作型コンポーネント」は一番内側基準で対応する一方、データを結合するといった「箱型コンポーネント」は一番外側基準で対応します。

6

見た目は同じ構造っぽく見える形でも、データを結合するとバグることがあります。

7

「Merge」で結合すると、こんな感じに整理されていないデータ構造になります。
なので、「Simplify」で一旦整理してあげます。

3

この状態で「Merge」をすれば綺麗になります。

8

「Graft」、「Flatten」、「Simplify」のイメージ解説でした。

Leave a Comment