OpenCASCADEで曲線同士の交点計算

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

ソースコード

[c]

include <stdio.h>

include <TopoDS_Edge.hxx>

include <BRep_Tool.hxx>

// TKBinL … 明示的にリンクしてやる

include <BRepBuilderAPI_MakeEdge.hxx>

// TKGeomAlgo

include <GeomAPI_ExtremaCurveCurve.hxx>

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

// エッジ(線分)からカーブを作成
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);

// もう一つ作成
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);

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

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

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

return 0;
}
[/c]

ビルド

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

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

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

[bash]
$ ./hoge
p=(5.000000, 0.000000, 0.000000)
[/bash]

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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