Grasshopper :: Centroidの処理を高速化する


柱の中心点の座標を出したい時など図形の中心点(重心)を出したいシチュエーションは多いかと思います。

そんな時は、通常[Area]コンポーネントを用いて[Centroid]を出しますが、数が増えると計算に時間がかかってきます。

[Area]から面積も出力されるため、余計に時間がかかるのではないでしょうか。

そこで、PythonC#を使って[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)

コメントを残す