OpenCASCADEで曲線同士の交点計算

Open Cascadeを用いて三次元曲線同士の交点を求めるには、GeomAPIのExtremaCurveCurveを利用します。このエクストリーマクラスは、交点を求める為のクラスではなく、曲線同士の、それぞれ相手との最寄りの点を求める為のクラスです。お互いの最寄りの点が同一点であれば、そこが交点として扱うことができます。

ソースコード

</p>

<h1>include &lt;stdio.h&gt;</h1>

<h1>include &lt;TopoDS_Edge.hxx&gt;</h1>

<h1>include &lt;BRep_Tool.hxx&gt;</h1>

<p>// TKBinL ... 明示的にリンクしてやる</p>

<h1>include &lt;BRepBuilderAPI_MakeEdge.hxx&gt;</h1>

<p>// TKGeomAlgo</p>

<h1>include &lt;GeomAPI_ExtremaCurveCurve.hxx&gt;</h1>

<p>int main(void)
{
  // カーブパラメータの受け取り用
  Standard_Real _first, _last;</p>

<p>// エッジ(線分)からカーブを作成
  TopoDS_Edge e1 = BRepBuilderAPI_MakeEdge(
                     gp_Pnt(0, 0, 0), gp_Pnt(10, 0, 0));
  Handle(Geom_Curve) c1 = BRep_Tool::Curve(e1, _first, _last);</p>

<p>// もう一つ作成
  TopoDS_Edge e2 = BRepBuilderAPI_MakeEdge(
                     gp_Pnt(4, -5, 0), gp_Pnt(6, 5, 0));
  Handle(Geom_Curve) c2 = BRep_Tool::Curve(e2, _first, _last);</p>

<p>// エクストリーマに2つのカーブを入れる
  GeomAPI_ExtremaCurveCurve ecc;
  ecc.Init(c1, c2);</p>

<p>// 各々の最寄り点を得る
  gp_Pnt p1;
  gp_Pnt p2;
  ecc.NearestPoints(p1, p2); // アドレス参照で受け取り</p>

<p>// 得た点が同一点なら、そこが交点。第2引数はトレランス値。
  if (p1.IsEqual(p2, 0.001))
    printf(&quot;p=(%f, %f, %f)\n&quot;, p1.X(), p1.Y(), p1.Z());</p>

<p>return 0;
}

ビルド

ビルドオプションは次のとおり。これらのライブラリ以外にもリンクしますが、下記のオプション指定だけで適当に解決してくれます。

g++ -g -o hoge -I/usr/include/opencascade \
-lTKernel -lTKMath -lTKBinL hoge.cpp

実行すると、次のように交点の座標を印字します。

$ ./hoge
p=(5.000000, 0.000000, 0.000000)

  • 延長線上の交点について
  • 交点が複数ある場合

投稿者:

dyama

佐世保のシステムエンジニアです。詳しいプロフィールやこのブログについてはこちらをご覧ください。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください