Open CASCADE学习|分割

目录

1、添加头文件与源文件

GEOMAlgo_Splitter.h

GEOMAlgo_Splitter.cpp

2、测试

2.1平面分割立方体

2.2以边分面

2.3以面分面


1、添加头文件与源文件

GEOMAlgo_Splitter.h

// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE//// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public// License as published by the Free Software Foundation; either// version 2.1 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA//// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com////  File:   GEOMAlgo_Splitter.hxx////  Author: Peter KURNEV#ifndef GEOMAlgo_Splitter_HeaderFile#define GEOMAlgo_Splitter_HeaderFile#include <Standard.hxx>#include <Standard_Macro.hxx>#include <Standard_Boolean.hxx>#include <Standard_Integer.hxx>#include <NCollection_BaseAllocator.hxx>#include <TopAbs_ShapeEnum.hxx>#include <TopoDS_Shape.hxx>#include <TopTools_ListOfShape.hxx>#include <TopTools_MapOfShape.hxx>#include <BOPAlgo_Builder.hxx>//=======================================================================//class    : GEOMAlgo_Splitter//purpose  ://=======================================================================class GEOMAlgo_Splitter : public BOPAlgo_Builder{public:    Standard_EXPORT        GEOMAlgo_Splitter();    Standard_EXPORT        GEOMAlgo_Splitter(const Handle(NCollection_BaseAllocator)& theAllocator);    Standard_EXPORT        virtual ~GEOMAlgo_Splitter();    Standard_EXPORT        void AddTool(const TopoDS_Shape& theShape);    Standard_EXPORT        const TopTools_ListOfShape& Tools()const;    Standard_EXPORT        void SetLimit(const TopAbs_ShapeEnum aLimit);    Standard_EXPORT        TopAbs_ShapeEnum Limit()const;    Standard_EXPORT        void SetLimitMode(const Standard_Integer aMode);    Standard_EXPORT        Standard_Integer LimitMode()const;    Standard_EXPORT        virtual void Clear();protected:    Standard_EXPORT        virtual void BuildResult(const TopAbs_ShapeEnum theType);    Standard_EXPORT        virtual void PostTreat();protected:    TopTools_ListOfShape myTools;    TopTools_MapOfShape myMapTools;    TopAbs_ShapeEnum myLimit;    Standard_Integer myLimitMode;};#endif

GEOMAlgo_Splitter.cpp

// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE//// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public// License as published by the Free Software Foundation; either// version 2.1 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA//// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com//// File:        GEOMAlgo_Splitter.cxx// Created:     Thu Sep 06 10:54:04 2012// Author:      Peter KURNEV//              <pkv@irinox>//#include"GEOMAlgo_Splitter.h"#include <TopAbs_ShapeEnum.hxx>#include <TopoDS_Shape.hxx>#include <TopoDS_Compound.hxx>#include <TopoDS_Iterator.hxx>#include <BRep_Builder.hxx>#include <TopTools_MapOfShape.hxx>#include <TopTools_ListOfShape.hxx>#include <TopExp.hxx>staticvoid TreatCompound(const TopoDS_Shape& aC,    TopTools_ListOfShape& aLSX);//=======================================================================//function : //purpose  : //=======================================================================GEOMAlgo_Splitter::GEOMAlgo_Splitter()    :    BOPAlgo_Builder(),    myTools(myAllocator),    myMapTools(100, myAllocator){    myLimit = TopAbs_SHAPE;    myLimitMode = 0;}//=======================================================================//function : //purpose  : //=======================================================================GEOMAlgo_Splitter::GEOMAlgo_Splitter(const Handle(NCollection_BaseAllocator)& theAllocator)    :    BOPAlgo_Builder(theAllocator),    myTools(myAllocator),    myMapTools(100, myAllocator){    myLimit = TopAbs_SHAPE;    myLimitMode = 0;}//=======================================================================//function : ~//purpose  : //=======================================================================GEOMAlgo_Splitter::~GEOMAlgo_Splitter(){}//=======================================================================//function : AddTool//purpose  : //=======================================================================void GEOMAlgo_Splitter::AddTool(const TopoDS_Shape& theShape){    if (myMapTools.Add(theShape)) {        myTools.Append(theShape);        //        AddArgument(theShape);    }}//=======================================================================//function : Tools//purpose  : //=======================================================================const TopTools_ListOfShape& GEOMAlgo_Splitter::Tools()const{    return myTools;}//=======================================================================//function : SetLimit//purpose  : //=======================================================================void GEOMAlgo_Splitter::SetLimit(const TopAbs_ShapeEnum aLimit){    myLimit = aLimit;}//=======================================================================//function : Limit//purpose  : //=======================================================================TopAbs_ShapeEnum GEOMAlgo_Splitter::Limit()const{    return myLimit;}//=======================================================================//function : SetLimitMode//purpose  : //=======================================================================void GEOMAlgo_Splitter::SetLimitMode(const Standard_Integer aMode){    myLimitMode = aMode;}//=======================================================================//function : LimitMode//purpose  : //=======================================================================Standard_Integer GEOMAlgo_Splitter::LimitMode()const{    return myLimitMode;}//=======================================================================//function : Clear//purpose  : //=======================================================================void GEOMAlgo_Splitter::Clear(){    myTools.Clear();    myMapTools.Clear();    myLimit = TopAbs_SHAPE;    BOPAlgo_Builder::Clear();}//=======================================================================//function : BuildResult//purpose  : //=======================================================================void GEOMAlgo_Splitter::BuildResult(const TopAbs_ShapeEnum theType){    TopAbs_ShapeEnum aType;    BRep_Builder aBB;    TopTools_MapOfShape aM;    TopTools_ListIteratorOfListOfShape aIt, aItIm;    //    aIt.Initialize(myArguments);    for (; aIt.More(); aIt.Next()) {        const TopoDS_Shape& aS = aIt.Value();        aType = aS.ShapeType();        if (aType == theType && !myMapTools.Contains(aS)) {            if (myImages.IsBound(aS)) {                const TopTools_ListOfShape& aLSIm = myImages.Find(aS);                aItIm.Initialize(aLSIm);                for (; aItIm.More(); aItIm.Next()) {                    const TopoDS_Shape& aSIm = aItIm.Value();                    if (aM.Add(aSIm)) {                        aBB.Add(myShape, aSIm);                    }                }            }            else {                if (aM.Add(aS)) {                    aBB.Add(myShape, aS);                }            }        }    }}//=======================================================================//function : PostTreat//purpose  : //=======================================================================void GEOMAlgo_Splitter::PostTreat(){    if (myLimit != TopAbs_SHAPE) {        Standard_Integer i, aNbS;        BRep_Builder aBB;        TopoDS_Compound aC;        TopTools_IndexedMapOfShape aMx;        //        aBB.MakeCompound(aC);        //        TopExp::MapShapes(myShape, myLimit, aMx);        aNbS = aMx.Extent();        for (i = 1; i <= aNbS; ++i) {            const TopoDS_Shape& aS = aMx(i);            aBB.Add(aC, aS);        }        if (myLimitMode) {            Standard_Integer iType, iLimit, iTypeX;            TopAbs_ShapeEnum aType, aTypeX;            TopTools_ListOfShape aLSP, aLSX;            TopTools_ListIteratorOfListOfShape aIt, aItX, aItIm;            TopTools_MapOfShape  aM;            //            iLimit = (Standard_Integer)myLimit;            //            // 1. Collect the shapes to process aLSP            aIt.Initialize(myArguments);            for (; aIt.More(); aIt.Next()) {                const TopoDS_Shape& aS = aIt.Value();                if (myMapTools.Contains(aS)) {                    continue;                }                //                aType = aS.ShapeType();                iType = (Standard_Integer)aType;                //                if (iType > iLimit) {                    aLSP.Append(aS);                }                //                else if (aType == TopAbs_COMPOUND) {                    aLSX.Clear();                    //                    TreatCompound(aS, aLSX);                    //                    aItX.Initialize(aLSX);                    for (; aItX.More(); aItX.Next()) {                        const TopoDS_Shape& aSX = aItX.Value();                        aTypeX = aSX.ShapeType();                        iTypeX = (Standard_Integer)aTypeX;                        //                        if (iTypeX > iLimit) {                            aLSP.Append(aSX);                        }                    }                }            }// for (; aIt.More(); aIt.Next()) {            //            aMx.Clear();            TopExp::MapShapes(aC, aMx);            // 2. Add them to aC            aIt.Initialize(aLSP);            for (; aIt.More(); aIt.Next()) {                const TopoDS_Shape& aS = aIt.Value();                if (myImages.IsBound(aS)) {                    const TopTools_ListOfShape& aLSIm = myImages.Find(aS);                    aItIm.Initialize(aLSIm);                    for (; aItIm.More(); aItIm.Next()) {                        const TopoDS_Shape& aSIm = aItIm.Value();                        if (aM.Add(aSIm)) {                            if (!aMx.Contains(aSIm)) {                                aBB.Add(aC, aSIm);                            }                        }                    }                }                else {                    if (aM.Add(aS)) {                        if (!aMx.Contains(aS)) {                            aBB.Add(aC, aS);                        }                    }                }            }        }// if (myLimitMode) {        myShape = aC;    }//if (myLimit!=TopAbs_SHAPE) {    //    Standard_Integer aNbS;    TopoDS_Iterator aIt;    TopTools_ListOfShape aLS;    //    aIt.Initialize(myShape);    for (; aIt.More(); aIt.Next()) {        const TopoDS_Shape& aS = aIt.Value();        aLS.Append(aS);    }    aNbS = aLS.Extent();    if (aNbS == 1) {        myShape = aLS.First();    }    //    //BOPAlgo_Builder::PostTreat();}//=======================================================================//function : TreatCompound//purpose  : //=======================================================================void TreatCompound(const TopoDS_Shape& aC1,    TopTools_ListOfShape& aLSX){    Standard_Integer aNbC1;    TopAbs_ShapeEnum aType;    TopTools_ListOfShape aLC, aLC1;    TopTools_ListIteratorOfListOfShape aIt, aIt1;    TopoDS_Iterator aItC;    //    aLC.Append(aC1);    for (;;) {        aLC1.Clear();        aIt.Initialize(aLC);        for (; aIt.More(); aIt.Next()) {            const TopoDS_Shape& aC = aIt.Value(); //C is compound            //            aItC.Initialize(aC);            for (; aItC.More(); aItC.Next()) {                const TopoDS_Shape& aS = aItC.Value();                aType = aS.ShapeType();                if (aType == TopAbs_COMPOUND) {                    aLC1.Append(aS);                }                else {                    aLSX.Append(aS);                }            }        }        //        aNbC1 = aLC1.Extent();        if (!aNbC1) {            break;        }        //        aLC.Clear();        aIt.Initialize(aLC1);        for (; aIt.More(); aIt.Next()) {            const TopoDS_Shape& aSC = aIt.Value();            aLC.Append(aSC);        }    }// while(1)}//// myErrorStatus// // 0  - Ok// 1  - The object is just initialized// 2  - PaveFiller is failed// 10 - No shapes to process// 30 - SolidBuilder failed

2、测试

2.1平面分割立方体

#include <BRepPrimAPI_MakeBox.hxx>#include"GEOMAlgo_Splitter.h"#include <gp_Pln.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <TopExp_Explorer.hxx>#include"Viewer.h"int main(int argc, char* argv[]){    gp_Pnt p0 = gp_Pnt(5, 5, 5);    gp_Dir vnorm = gp_Dir(1, 1, 1);    gp_Pln pln = gp_Pln(p0, vnorm);    TopoDS_Face face = BRepBuilderAPI_MakeFace(pln, -10, 10, -10, 10).Face();    TopoDS_Shape box = BRepPrimAPI_MakeBox(10, 10, 10).Shape();    //启动分割函数    GEOMAlgo_Splitter splitter = GEOMAlgo_Splitter();    //将box作为参数,将面face作为分割工具。    splitter.AddArgument(box);    splitter.AddTool(face);    splitter.Perform();    Viewer vout(50, 50, 500, 500);    //显示分割后的体    for (TopExp_Explorer i(splitter.Shape(), TopAbs_SOLID); i.More(); i.Next())    {        vout << i.Current();    }    vout << face;    vout.StartMessageLoop();    return 0;}

#include <BRepPrimAPI_MakeBox.hxx>#include"GEOMAlgo_Splitter.h"#include <gp_Pln.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <TopExp_Explorer.hxx>#include"Viewer.h"int main(int argc, char* argv[]){    gp_Pnt p0 = gp_Pnt(5, 5, 5);    gp_Dir vnorm = gp_Dir(1, 1, 1);    gp_Pln pln = gp_Pln(p0, vnorm);    TopoDS_Face face = BRepBuilderAPI_MakeFace(pln, -10, 10, -10, 10).Face();    TopoDS_Shape box = BRepPrimAPI_MakeBox(10, 10, 10).Shape();    //启动分割函数    GEOMAlgo_Splitter splitter = GEOMAlgo_Splitter();    //将box作为参数,将面face作为分割工具。    splitter.AddArgument(box);    splitter.AddTool(face);    splitter.Perform();    Viewer vout(50, 50, 500, 500);    //显示分割后的体    TopExp_Explorer i(splitter.Shape(), TopAbs_SOLID);    i.Next();    vout << i.Current();    vout << face;    vout.StartMessageLoop();    return 0;}

2.2以边分面

#include <vector>#include <gp_Pnt.hxx>#include <gp_Circ.hxx>#include <gp_Pln.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <BRepBuilderAPI_MakeEdge.hxx>#include"Viewer.h"#include"GEOMAlgo_Splitter.h"#include <TopExp_Explorer.hxx>int main(int argc, char* argv[]){    gp_Pnt p0 = gp_Pnt();    gp_Dir vnorm = gp_Dir(1, 0, 0);    gp_Pln pln = gp_Pln(p0, vnorm);    TopoDS_Shape face = BRepBuilderAPI_MakeFace(pln, -10, 10, -10, 10);    gp_Pnt p1 = gp_Pnt(0, 0, 15);    gp_Pnt p2 = gp_Pnt(0, 0, -15);    TopoDS_Shape edge = BRepBuilderAPI_MakeEdge(p1, p2);    //启动分割函数    GEOMAlgo_Splitter splitter = GEOMAlgo_Splitter();     //将面作为参数,将边edge作为分割工具。    splitter.AddArgument(face);    splitter.AddTool(edge);    splitter.Perform();    //显示分割后的体    TopExp_Explorer i(splitter.Shape(), TopAbs_FACE);    i.Next();    Viewer vout(50, 50, 500, 500);    vout << i.Current();    vout << edge;    vout.StartMessageLoop();             return 0;}

2.3以面分面

#include <vector>#include <gp_Pnt.hxx>#include <gp_Circ.hxx>#include <gp_Pln.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <BRepBuilderAPI_MakeEdge.hxx>#include"Viewer.h"#include"GEOMAlgo_Splitter.h"#include <TopExp_Explorer.hxx>int main(int argc, char* argv[]){    //第一个面    gp_Pnt p0 = gp_Pnt(5, 5, 5);    gp_Dir vnorm = gp_Dir(1, 1, 1);    gp_Pln pln = gp_Pln(p0, vnorm);    TopoDS_Shape face1 = BRepBuilderAPI_MakeFace(pln, -10, 10, -10, 10);    //工具面    vnorm = gp_Dir(1, 1, 0);    pln = gp_Pln(p0, vnorm);    TopoDS_Shape face2 = BRepBuilderAPI_MakeFace(pln, -20, 20, -20, 20);     //启动分割函数    GEOMAlgo_Splitter splitter = GEOMAlgo_Splitter();     //将面作为参数,将边edge作为分割工具。    splitter.AddArgument(face1);    splitter.AddTool(face2);    splitter.Perform();    //显示分割后的体    TopExp_Explorer i(splitter.Shape(), TopAbs_FACE);    i.Next();    Viewer vout(50, 50, 500, 500);    vout << i.Current();    vout << face2;    vout.StartMessageLoop();             return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/392365.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第三十三天| 1005.K次取反后最大化的数组和、134. 加油站 、135. 分发糖果

Leetcode 1005.K次取反后最大化的数组和 题目链接&#xff1a;1005 K次取反后最大化的数组和 题干&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可…

博途PLC数值积分器(矩形梯形积分自由切换)

数值积分器的相关介绍,大家可以也可以参看下面几篇文章,链接如下: PLC算法系列数值积分器 https://rxxw-control.blog.csdn.net/article/details/128562853https://rxxw-control.blog.csdn.net/article/details/128562853SMART PLC 梯形和矩形积分 https://rxxw-control.…

C语言学习day16:二维数组

二维数组格式&#xff1a; 数据类型 数组名[行][列] { {值1&#xff0c;值2}, {值3&#xff0c;值4} } 代码&#xff1a; int arr[2][3] { {1,2,3},{4,5,6} }; 那么我们怎么找它的下标呢&#xff0c;我先上一副图&#xff1a; 假如我现在要找1&#xff0c;那么它…

数据结构~二叉树(基础知识)

上一篇博客我们对树有了初步了解与学习&#xff0c;这篇我将初步学习二叉树&#xff01;&#xff01;&#xff08;新年快乐&#xff01;&#xff09; 目录 二叉树 1、定义&#xff1a; 2、特点&#xff1a; 3、基本形态&#xff1a; 4、二叉树的种类&#xff1a; &…

skimage库简介

scikit-image 是专注于图像处理的Python包&#xff0c;全称是scikit-image SciKit。该包由python语言编写&#xff0c;由scipy 社区开发和维护&#xff0c;使用原生的Numpy数组作为图像对象。 一、skimage简介 skimage&#xff08;scikit-Image&#xff09;是基于python开发的…

六、Spring/Spring Boot整合ActiveMQ

Spring/Spring Boot整合ActiveMQ 一、Spring整合ActiveMQ1.pom.xml2.Queue - 队列2.1 applicationContext.xml2.2 生产者2.3 消费者 3.Topic - 主题3.1 applicationContext.xml3.2 生产者3.3 消费者 4.消费者 - 监听器4.1 编写监听器类4.2 配置监听器4.3 生产者消费者一体 二、…

【无标题】管理kvm 虚拟机

管理kvm 虚拟机 点击虚拟机 创建新的虚拟机 安装操作系统 设置root密码

mpack简明教程

文章目录 摘要MessagePack简介MPACK的简单使用在定长的buffer存储不定长的数据读取截断的数据 摘要 本文先简单介绍MessagePack的基本概念。 然后&#xff0c;介绍一个MessagePack C API - MPack的通常使用。 接着尝试对MPack截断数据的读取。 注&#xff1a;本文完整代码见…

【自然语言处理】实验3,文本情感分析

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

会声会影2024新功能及剪辑视频步骤教程

会声会影2024的新功能主要包括&#xff1a; 全新的标题动态与特效&#xff1a;用户可以为文字标题指定进入、中场和退出的不同动态效果&#xff0c;比如闪现进入、中场弹跳和淡出退出等&#xff0c;让文字标题更具动感。此外&#xff0c;还新增了多个标题特效&#xff0c;包括…

Unity中关于ScrollRect组件完整解决方案(ScrollRect中元素自动排版+ScrollRect中元素自动定位到Viewport可见范围内)

一、元素自动排版功能 1、首先要往我们的unity项目中导入两个脚本文件&#xff0c;脚本文件名称分别是UIScrollEventListener和CZScrollRect&#xff0c;这两个脚本文件代码如下所示。 1-1、介绍UIScrollEventListener脚本写法。 using System.Collections; using System.Co…

代码随想录day24--回溯的应用3

LeetCode93.修复IP地址 题目描述&#xff1a; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是…

安装luajit及使用python运行lua脚本

使用Python运行lua脚本前&#xff0c;需要先安装LuaJIT&#xff0c;LuaJIT的官网是下载 (luajit.org) 目前已不再使用.exe文件的下载方式&#xff0c;需要使用Git从公共仓库下载源码&#xff0c;git命令为&#xff1a; $ git clone https://luajit.org/git/luajit.git 下载后…

Open CASCADE学习|布尔运算

目录 1、加法&#xff1a;BRepAlgoAPI_Fuse 2、减法&#xff1a;BRepAlgoAPI_Cut 3、交集&#xff1a;BRepAlgoAPI_Common 4、交线&#xff1a;BRepAlgoAPI_Section 1、加法&#xff1a;BRepAlgoAPI_Fuse #include <gp_Pnt.hxx>#include <BRepPrimAPI_MakeBox.hxx…

云计算基础 -NUMA

UMA UMA中文翻译叫&#xff1a;一致性内存访问 多个CPU通过同一根前端总线&#xff08;FSB&#xff09;来访问内存&#xff08;所有的内存访问都需要通过北桥芯片来完成&#xff09;&#xff0c;若多个CPU访问内存的不同内存单元还是相同内存单元&#xff0c;同一时刻&#x…

Vuex核心知识整理

目录 1 搭建vuex环境 2 求和案例 3 getters 配置项 4 mapState 和 mapGetters 5 mapMutations 和 mapActions 6 Vuex 模块化 1 搭建vuex环境 vuex工作原理图&#xff08;摘自官网&#xff09; 什么时候使用Vuex&#xff1a; 1.当多个组件依赖于统一状态 2.来自不同组件…

2.15日学习打卡----初学Zookeeper(二)

2.15日学习打卡 目录: 2.15日学习打卡一. Zookeeper部署运行伪集群安装集群安装服务管理 二. Zookeeper系统模型数据模型节点特性客户端命令行节点数据信息Watcher监听机制权限控制 ACL 三. 原生api操作Zookeeper四. zkclient库操作Zookeeper五. Apache Curator操作Zookeeper六…

不同的AI修改同一篇文章标题

提问AI 我写了一篇文章&#xff0c;请帮我把标题重新改一下&#xff1a;“比较不同AI分析同一个错误代码及给出解决方案的能力&#xff08;结果出我意料&#xff09;” 这篇文章的原地址为&#xff1a;https://blog.csdn.net/snans/article/details/136132211 答案对比结果&am…

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?!

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?< , (? , (?<! , (?! 有好多种称呼 (?< , (? , (?<! , (?! 有好多种称呼 , 我称为: 左限定, 右限定, 左否定, 右否定 (?<左限定)    (?右限定)(?<!左否定)    (?!右限定) 再…

Linux|centos7下的编译|ffmpeg的二进制安装

Windows版本的ffmpeg&#xff1a; ###注意&#xff0c;高版本可能必须要windows10以及以上才支持&#xff0c;win7估计是用不了的 下载地址&#xff1a;Builds - CODEX FFMPEG gyan.dev 或者这个下载地址&#xff1a;https://github.com/BtbN/FFmpeg-Builds/releases 这两个…