首页 > 其他分享 >使用OCCT构建两个面之间的最短路径

使用OCCT构建两个面之间的最短路径

时间:2023-12-21 09:22:06浏览次数:34  
标签:std 路径 return OCCT TopoDS TopAbs shape 构建 processedShape

查找两个面之间的最短面路径

查找面的邻面。

std::vector<TopoDS_Face> OCCTUtility::adjacentFace(TopoDS_Face const &face, std::optional<TopoDS_Shape>     shape, std::optional<TopTools_IndexedDataMapOfShapeListOfShape> edgeMapFace)
{
    std::vector<TopoDS_Face> result{};
    if (!edgeMapFace)
    {
        TopTools_IndexedDataMapOfShapeListOfShape tmp{};
        if (!shape)
            return result;
        TopExp::MapShapesAndAncestors(shape.value(), TopAbs_EDGE, TopAbs_FACE, tmp);
        if (tmp.Size() == 0)
            return result;
        edgeMapFace = std::move(tmp);
    }

    for (TopExp_Explorer exp(face, TopAbs_EDGE); exp.More(); exp.Next())
    {
        auto faces = edgeMapFace.value().FindFromKey(exp.Current());
        for (auto it = faces.begin(); it != faces.end(); ++it)
        {
            if (*it != face)
                result.push_back(TopoDS::Face(*it));
        }
    }
    return result;
}

广度优先算法搜索面路径结果

std::vector<TopoDS_Face> OCCTUtility::shortestPathOnTwoFace(TopoDS_Shape const &shape, TopoDS_Face const &face1, TopoDS_Face const &face2) noexcept
{
    if (shape.IsNull() || face1.IsNull() || face1.ShapeType() != TopAbs_FACE || face2.IsNull() || face2.ShapeType() != TopAbs_FACE)
        return {};

    TopTools_MapOfShape processedShape{};
    std::queue<std::pair<TopoDS_Face, std::vector<TopoDS_Face>>> not_processedShape{};
    TopTools_IndexedDataMapOfShapeListOfShape edgeMapFace{};
    std::vector<TopoDS_Face> facePath;

    TopExp::MapShapesAndAncestors(shape, TopAbs_EDGE, TopAbs_FACE, edgeMapFace);
    not_processedShape.push({});
    not_processedShape.front().first = face1;
    not_processedShape.front().second = adjacentFace(not_processedShape.front().first, shape, edgeMapFace);

    while (!not_processedShape.empty())
    {
        auto node = not_processedShape.front();
        not_processedShape.pop();

        if (processedShape.Contains(node.first))
            continue;

        facePath.push_back(node.first);
        for (auto const &i : node.second)
        {
            if (processedShape.Contains(i))
                continue;
            facePath.push_back(i);
            if (i == face2)
                return facePath;

            not_processedShape.push({i, adjacentFace(i, {}, edgeMapFace)});
            facePath.pop_back();
        }
    }
    return {};
}

可依据上一步结果(面最短路径)获取最短边(非联通,非C0)路径

获取两个面之间的通用边

std::optional<TopoDS_Edge> OCCTUtility::commentEdge(TopoDS_Face const &face1, TopoDS_Face const &face2) noexcept
{
    if (face1.IsNull() || face2.IsNull())
        return {};

    TopTools_IndexedMapOfShape faceMapEdge1{};
    TopExp::MapShapes(face1, TopAbs_EDGE, faceMapEdge1);
    TopTools_IndexedMapOfShape faceMapEdge2{};
    TopExp::MapShapes(face2, TopAbs_EDGE, faceMapEdge2);

    std::vector<TopoDS_Edge> edges;
    for (auto it = faceMapEdge1.cbegin(); it != faceMapEdge1.cend(); ++it)
    {
        auto fit = std::find_if(faceMapEdge2.cbegin(), faceMapEdge2.cend(),[it](TopoDS_Shape shape)
        {
            return shape.IsSame(*it);
        });
        if (fit != faceMapEdge2.cend())
            edges.push_back(TopoDS::Edge(*fit));
    }
    return edges.back();
}

标签:std,路径,return,OCCT,TopoDS,TopAbs,shape,构建,processedShape
From: https://www.cnblogs.com/LeiFeng1000/p/17918213.html

相关文章

  • 《构建之法》读书笔记(三)
      《构建之法》,读这本书教会了我在团队开发时的团队合作。   首先是代码规范:1.代码风格规范。2.代码设计规范。一.代码风格规范   1.缩进:一般用四个空格的距离,从可读性来说正好。   2.行宽:行款可以限定为100字符。   3.断行与空白的{}行:尽量......
  • 构建更加完善的全病程患者服务网络,圆心科技上市之路愈发顺畅
    中国的智慧医疗模式,是一种创新型的医疗模式,通过建立线上医疗服务平台,将优质医疗资源下沉到基层社区,使得居民可以更加便捷地获得医疗服务。这种模式的出现,为缓解医疗资源紧张问题提供了新的思路和途径。为更好地推进智慧医疗的建设,我国医疗健康企业圆心科技构建了一套贯通诊......
  • 风控决策引擎——决策流构建实战
    引言本篇主要聚焦介绍风控决策引擎中决策树编排能力的构建。决策引擎是风控的大脑,而决策树的编排能力和体验是构建大脑的手段,如何构建高效、丝滑、稳定可靠的决策树编排能力,是对风控决策引擎的一大挑战,本篇文章和大家分享一下过往构建心得。背景任何系统在初期构建肯定不是往“......
  • 从0到1智能风控决策引擎构建
    引言互联网时代,万物互联,网络安全形势越来越严峻,安全是企业的基石,风控在企业中扮演着“警察”角色,运用各种技术和手段,保护企业内的用户利益不受侵害。风控决策引是风控中台的入口,提供业务风险场景事件接入,可视化编排复杂决策,丰富的特征变量与场景识别服务等功能。相较于需要开发背......
  • pip安装路径由.local调整为/usr/local
    如果没有设置PYTHONUSERBASE,默认会安装在~/.local下如果不希望安装在.local目录下,可以通过配置环境变量PYTHONUSERBASE指定对应的路径,比如/usr/local当然也可以直接修改site.py的_getuserbase方法,通过设置USER_SITE和USER_BASE来指定即调整USERSITE有2种方式:1.设置环境变量P......
  • 构建陪诊预约系统:技术实战指南
    在医疗科技的飞速发展中,陪诊预约系统的应用为患者和陪诊人员提供了更为便捷和贴心的服务。本文将带领您通过技术实现,构建一个简单而实用的陪诊预约系统,以提升医疗服务的效率和用户体验。技术栈选择在开始之前,我们需要选择适用于陪诊预约系统的技术栈:前端:使用React.js构建交互界面......
  • 构建陪诊预约系统:技术实现与用户体验
    在医疗服务不断创新的背景下,陪诊预约系统作为一种结合技术与人性化服务的应用,为患者提供了更为便捷和贴心的医疗体验。让我们通过简单的示例代码,了解一下如何构建一个基本的陪诊预约系统。技术栈选择在开始构建陪诊预约系统之前,我们需要选择合适的技术栈。以下是一个简单的技术栈示......
  • Leetcode 71. 简化路径
    https://leetcode.cn/problems/simplify-path/description/给你一个字符串path,表示指向某一文件或目录的Unix风格绝对路径(以'/'开头),请你将其转化为更加简洁的规范路径。在Unix风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点(..)表示将目录切换到上一级(指向父目......
  • QT 加载构建控件的时候 是灰色的,并且不能编译
    先上图 我安装完程序之后,返现上面红框中是灰色的,并且前面还带一个黄色感叹号并且下面C++的地方还是空的,应该是系统没有c++编译器 为系统安装g++编译器sudoapt-getinstallg++不能编译需要安装套件,用命令行安装sudoapt-getinstallbuild-essential......
  • dockerfile构建镜像
    定制docker镜像的方式有两种:手动修改容器内容,导出新的镜像(前面超哥讲dockersave等)基于Dockerfile自行编写指令,基于指令流程创建镜像。dockerfile简介 镜像是多层存储,每一层在前一层的基础上进行修改;容器也是多层存储,以镜像为基础层,在其基础上加一层作为容器运行时的存......