CurveDomainとEvaluateCurveで線のドメイン範囲と線上の点を取得する方法|Grasshopper Python × RhinoScriptSyntax入門

RhinoScriptSyntax GHPython
CurveDomain
EvaluateCurve

CurveDomain関数とEvaluateCurve関数で線のドメイン範囲と線上の点を取得することができます。

本記事のGrasshopperファイルのダウンロードはこちら

線上の点

今回は、上の画像のように、取得した線のドメイン範囲を使い、線上の点を取得します。

コード

使用コンポーネント 1: Python 3 Script 2: Curve 4: Point

import rhinoscriptsyntax as rs
# RhinoをPythonから操作するためのライブラリを読み込む

pts = [(0,0,0),(10,10,5),(20,0,10),(30,10,15),(40,0,20)]
# 曲線を通過させる複数の点座標を定義

curve = rs.AddInterpCurve(pts)
# 指定した点を通る曲線を作成する

domain = rs.CurveDomain(curve)
# 曲線のパラメータ範囲(ドメイン)を取得する

norm = 0.5
# 曲線上の位置を、0〜1の範囲で定義
# 0.5 は曲線全体の50%位置を表す

t = domain[0] + norm * (domain[1] - domain[0])
# 正規化した値を、実際の曲線パラメータ範囲へ変換する

point = rs.EvaluateCurve(curve, t)
# 指定したパラメータ位置の点座標を取得する

Python 3 Script」には、上記のコードが記載されています。

順番に、コードの解説をしていきます。

pts = [(0,0,0),(10,10,5),(20,0,10),(30,10,15),(40,0,20)]

pts = [...] では、通過させる複数の点座標を、リストで定義しています。

リストに関してはこちら

後程、これらの座標をつなぐ曲線を作成します。

curve = rs.AddInterpCurve(pts)

AddInterpCurve 関数で、先程指定した座標を通る曲線を作成しています。

domain = rs.CurveDomain(curve)

CurveDomain 関数では、曲線のドメイン範囲(パラメータ範囲)を取得しています。

曲線内部では、位置が数値パラメータによって管理されています。

今回は、(0, 4) の範囲になっています。

norm = 0.5

norm = 0.5 では、曲線上の位置を、0〜1の範囲で定義しています。

  • 0 → 曲線の始点
  • 0.5 → 曲線の中央付近
  • 1 → 曲線の終点

という意味になります。

今回は 0.5 を指定しているため、曲線全体の50%の位置を取得しようとしています。

t = domain[0] + norm * (domain[1] - domain[0])

0〜1で指定した割合を、実際の曲線パラメータ値へ変換しています。

この考えは、GrasshopperのReparameterizeと同じです。

例として、domain = (5.0, 15.0) のようなドメイン範囲があるとします(今回の曲線のドメイン範囲は(0, 4)なので、例とは異なります)。

これは、ドメイン範囲が、5〜15の範囲であることを意味しています。

実際の値を直接扱うと、t = 8.245 のようになり、直感的ではありません。

そこで、norm = 0.5 のように、0〜1の範囲で考えるようにします。

これにより、norm = 0.5 は、「50%位置」という意味になります。

しかし、EvaluateCurve 関数では、実際のドメイン範囲のパラメータ値が必要になります。

実際のパラメータ値に戻すための式が、 t = domain[0] + norm * (domain[1] - domain[0]) になります。

例えば、domain = (5.0, 15.0) とすると、

この範囲の最小値は 5 、最大値は 15 です。

範囲の長さは、15 - 5 = 10 になります。

もし、norm = 0.5 なら、「全体の50%位置」を求めたいことになります。

まず、norm * (domain[1] - domain[0]) を計算すると、0.5 * (15 - 5) = 5 になります 。

これは、「開始位置から5だけ進んだ位置」という意味です。

ただし、この 5 は「範囲内の移動量」でしかありません。

実際の値にするには、開始位置 5 を足す必要があります。

t = 5 + 5 = 10 になります。

つまり、t = domain[0] + norm * (domain[1] - domain[0]) は、「範囲の始点から、指定割合だけ進んだ位置」を求めている計算です。

point = rs.EvaluateCurve(curve, t)

EvaluateCurve 関数で、指定したパラメータ位置の点座標を取得しています。

第1引数には線データ、第2引数にはパラメータ値を指定しています。

今回は、曲線全体の50%位置にある点を取得しています。

Python 3 Script」の右側の端子名を「curve」に設定すると線データ、「point」に設定すると点データがGH上に出力されます。

Comment

Translate »