Point in Curveのメモ

C#

Point in Curve というコンポーネントがあります。これは,閉曲線の中に点があるかどうかを計算してくれるコンポーネントです。

この記事を書こうと思ってからもしやと思って調べたら見つかった。公式コンポーネントすごい。

具体的にはPointとCurveの関係性が次のように返されます。

  • 0のとき,点は曲線の外側
  • 1のとき,点は曲線の上
  • 2のとき,点は曲線の内側

このコンポーネントの便利なところは,点が必ずしも曲線と同一の平面にある必要がないことです。なので次の画像のときも、結果は点は内側にある。と判断します。

中心が(0,0,0)の半径100の円と点(0,0,100) これはPoint in CurveでInside判定

次のような同一平面にない曲線の場合はどうでしょう。

曲線がねじれている。
平面的にはInside
XZ平面はこのような感じです。

この場合,PythonのコンポーネントではOutsideとなってしまいます。

曲線の内側かどうかというのはおそらく,閉曲線によってつくられる面の法線で投影しているのでしょうか。点の位置によっては入るところもありそうです。

C#などでRhinoCommonを使えばこのような場合に好きな平面で判定することができます。

上が公式のコンポーネント、下がC#のコンポーネント

コードはこんな感じに書けばOKです。Planeを指定できるところが違います。

  private void RunScript(Curve crv, Point3d pt, Plane plane, ref object A)
  {
    PointContainment pc = crv.Contains(pt, plane, 0.001);
    if(pc == PointContainment.Coincident)
    {
      A = 1;
    }
    else if(pc == PointContainment.Inside)
    {
      A = 2;
    }
    else if(pc == PointContainment.Outside)
    {
      A = 0;
    }
    else{
      A = -1;
    }
  }

RhinoCommonではPointContainment型と呼ばれる列挙型が使われていて,Planeに値が入らなかったりすると,PointContainment.Unsetという値が返されます。

コメント

タイトルとURLをコピーしました