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

2023-12-29 16:09:45

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


1、前言

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


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

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

在这里插入图片描述
其源代码为:

	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;
			}
		}

文章来源:https://blog.csdn.net/yang19861007/article/details/135290191
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。