Grasshopper :: Centroidの処理を高速化する
柱の中心点の座標を出したい時など図形の中心点(重心)を出したいシチュエーションは多いかと思います。
そんな時は、通常[Area]コンポーネントを用いて[Centroid]を出しますが、数が増えると計算に時間がかかってきます。
[Area]から面積も出力されるため、余計に時間がかかるのではないでしょうか。そこで、PythonとC#を使って[Centroid]だけを計算し、どの方法が一番処理速度が速いか検証しました。
結果だけをみたい方は、ページ下部までスクロールしていただくと、“まとめ”があります。
検証方法
コードは、Rhino
,rhinoscriptsyntax
,ghpythonlib.components
の3つのモジュールを使い、
Rhino
,rhinoscriptsyntax
からはCurveのCentroid抽出、
ghpythonlib.components
では、[Area]コンポーネントを呼び出して[Centroid]のみ抽出します。
Pythonで以上の3種類、C#ではRhino
のモジュールのみで作成しました。
コードは以下の通りです。
また、Input側で、[Item Access]と[List Access]の場合と2パターン行いました。
[Area]コンポーネントも比較用に配置し、計9個のコンポーネントを同時に処理させます。
コンポーネントの名前は、[言語_モジュール_Accessタイプ]で命名してあります。
例えば、PythonでモジュールがRhino、Item Accessの場合は、[Py_rh_Item]となります。
処理対象は100mm角の正方形とし、ランダムな点を100個、1000個、10000個それぞれ用意し、[Rectangle]コンポーネントに繋いで作成しました。
それでは、結果を見てみましょう!
検証結果
100個の場合
一番速かったのは、[C#_rh_Item]、一番遅いのは、[Py_gh_Item]でした。
なんと、[Area]コンポーネントよりも時間がかかってしまいました。
1000個の場合
一番速かったのは、[C#_rh_List]、一番遅かったのは、100個と同じ[Py_gh_Item]でした。
処理にもだんだん時間がかかってきています。
10000個の場合
一番速かったのは、[Py_rs_List]、一番遅かったのは、全て共通の[Py_gh_Item]でした。
ここまでくると、最速と最低で処理速度に1分以上開きが出てきました。
まとめ
以上の結果をまとめると、、、
- モジュールは、Rhinoが速い傾向がみられた。
- Pythonよりも、C#の方が速い傾向がみられた。
- [Item Access]よりも、[List Access]でforループさせた方がかなり処理が速かった。
- ghpythonlib.componentsでのコンポーネントの呼び出しは、通常のコンポーネントよりも処理速度が遅い傾向がみられた。
何回か試したところ、微妙に順番は前後しましたが、おすすめとしては、
[C#_Rhino_List Access]か、[Python_rhinoscriptsyntax_List Access]の組み合わせが良さそうでした!!
今回はあくまで[Centroid]の処理に絞ったため、他のケースでも同じことが言えるかは確かではないのでご注意を。
ぜひ参考にしてみてください。
使用した主なコンポーネント
- [Area] (Surface > Analysis > Area)
- [C# Script] (Maths > Script > C# Script)
- [Python Script] (Maths > Script > Python Script)
- [Rectangle] (Curve > Primitive > Rectangle)