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]
- 延長線上の交点について
- 交点が複数ある場合