Opencascad(C++)-判断直线段与TopoDS_Shape是否相交(干涉)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1、前言
  • 2、根据两个点创建有界直线段
  • 3、判断TopoDS_Shape与直线段相交


1、前言

最近在研究Opencascad的开发,有个需求是判断直线与TopoDS_Shpae是否存在相交,如果相交了,则认为是干涉的,如果不相交则是不干涉的。由于直线是无线的,采用直线判断是不合理的,所以要采用有界的直线段来判断。这里我开发的经验之谈,有什么不足的或者有更好方法的,可以在评论区留言。


2、根据两个点创建有界直线段

采用两个点创建有界直线段所使用的的方法为:BRepBuilderAPI_MakeEdge,我们可以查到你说明如下(我就不翻译了):

Opencascad(C++)-判断直线段与TopoDS_Shape是否相交(干涉)_第1张图片
其源代码为:

	BRepBuilderAPI_MakeEdge edgeMaker(pnt1, pnt2);
	TopoDS_Edge aEdge = edgeMaker.Edge();

3、判断TopoDS_Shape与直线段相交

其源代码为:

TopoDS_Shape shape = productHandle->GetShape();  //这里获取的是TopoDS_Shape,根据自己的需求来改
		TopExp_Explorer exp;
		for (exp.Init(shape, TopAbs_SOLID); exp.More(); exp.Next())
		{
			TopoDS_Solid face = TopoDS::Solid(exp.Current());
			BRepExtrema_DistShapeShape extrema(aEdge, face);
			if (extrema.IsDone() && extrema.NbSolution() > 0 && extrema.Value() < 1e-6)
			{
				return true;
			}
		}
		for (exp.Init(shape, TopAbs_SHELL); exp.More(); exp.Next())
		{
			TopoDS_Shell face = TopoDS::Shell(exp.Current());
			BRepExtrema_DistShapeShape extrema(aEdge, face);
			if (extrema.IsDone() && extrema.NbSolution() > 0 && extrema.Value() < 1e-6)
			{
				return true;
			}
		}

你可能感兴趣的:(Opencascad开发,c++,Opencascad)