OCC 创建点线面体

目录

一、利用封装已有算法实现

1、盒子建模算法封装

 2、可视化

二、利用OCC 点线面实现

1、实现过程

 2、实现一个面

 3、拉伸面生成体

4、旋转面生成体

三、总结


一、利用封装已有算法实现

1、盒子建模算法封装

BRepPrimAPI_MakeBox box(2, 2, 2);

 2、可视化

void VTKRenderWindow(const TopoDS_Shape& shape)
{vtkNew<vtkRenderWindow> renderWindow; //创建一个vtk窗口vtkNew<vtkRenderer> render; //创建一个vtk渲染器renderWindow->AddRenderer(render.GetPointer()); //在窗口中加入渲染器vtkNew<vtkRenderWindowInteractor> iren; //创建一个vtk交互器vtkNew<vtkInteractorStyleTrackballCamera> istyle; //创建vtk相机交互器样式iren->SetRenderWindow(renderWindow.GetPointer()); //设置渲染窗口iren->SetInteractorStyle(istyle.GetPointer()); //设置交互器样式vtkNew<IVtkTools_ShapeDataSource> occSource; //创建一个可以被VTK使用的OCC数据源occSource->SetShape(new IVtkOCC_Shape(shape)); //将shape添加到数据源中vtkNew<vtkPolyDataMapper> mapper; //创建一个VTK数据类型mapper->SetInputConnection(occSource->GetOutputPort()); //创建一个管道,将occ数据导入到VTK数据中vtkNew<vtkActor> actor; //创建一个vtk actoractor->SetMapper(mapper.GetPointer()); //将vtk数据交给actorrender->AddActor(actor.GetPointer()); //在渲染器中加入vtk actoriren->Initialize(); //初始化交互器iren->Start(); //开始运行交互器
}

二、利用OCC 点线面实现

1、实现过程

  • 创建四个顶点,定义一个矩形的四个角。
  • 使用这些顶点创建四条边。
  • 将这些边连接成一个封闭的线框 (wire)。
  • 使用这个线框创建一个面 (face)。
  • 定义一个拉伸方向和距离,这里是沿 Z 轴方向拉伸 10 个单位长度。
  • 使用 BRepPrimAPI_MakePrism 类将这个面拉伸成一个体(solid)

 2、实现一个面

#include "BRepBuilderAPI_MakeVertex.hxx"
#include "BRepBuilderAPI_MakeEdge.hxx"
#include "BRepBuilderAPI_MakeWire.hxx"
#include "BRepBuilderAPI_MakeFace.hxx"
#include <gp_Pnt.hxx>
#include <gp_Dir.hxx>
#include "Standard_Real.hxx"
int main()
{//创建面
#pragma region MyRegion// 创建四个顶点gp_Pnt p1(0, 0, 0);gp_Pnt p2(10, 0, 0);gp_Pnt p3(10, 10, 0);gp_Pnt p4(0, 10, 0);// 使用顶点创建边,注意线框闭合TopoDS_Edge edge1 = BRepBuilderAPI_MakeEdge(p1, p2);TopoDS_Edge edge2 = BRepBuilderAPI_MakeEdge(p2, p3);TopoDS_Edge edge3 = BRepBuilderAPI_MakeEdge(p3, p4);TopoDS_Edge edge4 = BRepBuilderAPI_MakeEdge(p4, p1);// 将边连接成一个线框BRepBuilderAPI_MakeWire wireBuilder;wireBuilder.Add(edge1);wireBuilder.Add(edge2);wireBuilder.Add(edge3);wireBuilder.Add(edge4);TopoDS_Wire wire = wireBuilder.Wire();// 使用线框创建面BRepBuilderAPI_MakeFace faceBuilder(wire);TopoDS_Face face = faceBuilder.Face();
#pragma endregionVTKRenderWindow(face);}

 3、拉伸面生成体

#include "BRepBuilderAPI_MakeVertex.hxx"
#include "BRepBuilderAPI_MakeEdge.hxx"
#include "BRepBuilderAPI_MakeWire.hxx"
#include "BRepBuilderAPI_MakeFace.hxx"
#include "BRepPrimAPI_MakePrism.hxx"
#include <gp_Pnt.hxx>
#include <gp_Dir.hxx>
#include "Standard_Real.hxx"
int main()
{//创建面
#pragma region MyRegion// 创建四个顶点gp_Pnt p1(0, 0, 0);gp_Pnt p2(10, 0, 0);gp_Pnt p3(10, 10, 0);gp_Pnt p4(0, 10, 0);// 使用顶点创建边,注意线框闭合TopoDS_Edge edge1 = BRepBuilderAPI_MakeEdge(p1, p2);TopoDS_Edge edge2 = BRepBuilderAPI_MakeEdge(p2, p3);TopoDS_Edge edge3 = BRepBuilderAPI_MakeEdge(p3, p4);TopoDS_Edge edge4 = BRepBuilderAPI_MakeEdge(p4, p1);// 将边连接成一个线框BRepBuilderAPI_MakeWire wireBuilder;wireBuilder.Add(edge1);wireBuilder.Add(edge2);wireBuilder.Add(edge3);wireBuilder.Add(edge4);TopoDS_Wire wire = wireBuilder.Wire();// 使用线框创建面BRepBuilderAPI_MakeFace faceBuilder(wire);TopoDS_Face face = faceBuilder.Face();// 定义拉伸方向和距离gp_Vec prismVec(0, 0, 10);// 拉伸面形成体BRepPrimAPI_MakePrism prismMaker(face, prismVec);TopoDS_Shape solid = prismMaker;
#pragma endregionVTKRenderWindow(solid);}

4、旋转面生成体

#include "BRepBuilderAPI_MakeVertex.hxx"
#include "BRepBuilderAPI_MakeEdge.hxx"
#include "BRepBuilderAPI_MakeWire.hxx"
#include "BRepBuilderAPI_MakeFace.hxx"
#include "BRepPrimAPI_MakePrism.hxx"
#include "BRepPrimAPI_MakeRevol.hxx"
#include <gp_Pnt.hxx>
#include <gp_Dir.hxx>
#include "Standard_Real.hxx"
int main()
{//创建面
#pragma region MyRegion// 创建四个顶点gp_Pnt p1(0, 0, 0);gp_Pnt p2(10, 0, 0);gp_Pnt p3(10, 10, 0);gp_Pnt p4(0, 10, 0);// 使用顶点创建边,注意线框闭合TopoDS_Edge edge1 = BRepBuilderAPI_MakeEdge(p1, p2);TopoDS_Edge edge2 = BRepBuilderAPI_MakeEdge(p2, p3);TopoDS_Edge edge3 = BRepBuilderAPI_MakeEdge(p3, p4);TopoDS_Edge edge4 = BRepBuilderAPI_MakeEdge(p4, p1);// 将边连接成一个线框BRepBuilderAPI_MakeWire wireBuilder;wireBuilder.Add(edge1);wireBuilder.Add(edge2);wireBuilder.Add(edge3);wireBuilder.Add(edge4);TopoDS_Wire wire = wireBuilder.Wire();// 使用线框创建面BRepBuilderAPI_MakeFace faceBuilder(wire);TopoDS_Face face = faceBuilder.Face();// 定义拉伸方向和距离gp_Vec prismVec(0, 0, 10);// 拉伸面形成体/*BRepPrimAPI_MakePrism prismMaker(face, prismVec);TopoDS_Shape solid = prismMaker;*/// 定义旋转轴gp_Ax1 axis(gp_Pnt(0, 0, 0), gp_Dir(0, 1, 0));// 旋转面形成圆柱BRepPrimAPI_MakeRevol revolMaker(face, axis);TopoDS_Shape cylinder = revolMaker;
#pragma endregionVTKRenderWindow(cylinder);}

三、总结

OCC中帮我们封装了大量的几何图元,我们可以利用已经封装好的图元进行快速拓展自己的模型,建议多看看开发文档,多看看代码,不断深化自己对OCC的理解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM之Mybatis

SSM之Mybatis 一、MyBatis简介1、MyBatis特性2、MyBatis的下载3、MyBatis和其他持久化层技术对比 二、MyBatis框架搭建三、MyBatis基础功能1、MyBatis核心配置文件2、MyBatis映射文件3、MyBatis实现增删改查4、MyBatis获取参数值的两种方式5、MyBatis查询功能6、MyBatis自定义映…

如何判断自己的数据格式适合使用json还是Excel的形式存入neo4j数据库

判断自己的数据格式适合使用JSON还是Excel的形式存入Neo4j数据库&#xff0c;主要取决于数据的复杂性、规模、结构、以及你或你的团队对这两种格式的熟悉程度。以下是一些关键因素&#xff0c;可以帮助你做出决策&#xff1a; 数据的复杂性&#xff1a; 如果你的数据包含大量的…

Django 入门指南:从环境设置到创建第一个应用程序

简介 Django 是一个流行的 Python Web 框架&#xff0c;用于快速开发强大的 Web 应用程序。本指南将带你从安装 Django 开始&#xff0c;逐步学习如何创建一个简单的 Django 项目和应用程序。 步骤 1: 准备环境 首先&#xff0c;确保你的开发环境中安装了 Python&#xff0c…

【python】OpenCV—Shape Detection

文章目录 1、需求描述2、代码实现3、涉及到的库函数cv2.arcLengthcv2.approxPolyDP 4、案例5、参考 1、需求描述 给出图像&#xff0c;找出其轮廓&#xff0c;近似确认其为几变形图像 输入 输出 2、代码实现 # 导入必要的包 import cv2 import argparse import imutils imp…

3.1、matlab双目相机标定实验

1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来&#xff0c;从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数&#xff08;如焦距、主点、畸变等&#xff09;和外部参数&#xff08;如相机位置、朝向等&#xff09…

SVN分支管理基本原理

原文全文详见个人博客&#xff1a; SVN分支管理基本原理学习完svn和git的版本管理理念上的差异后&#xff0c;自然的我们再进一步对比svn和git在分支管理上的原理差异&#xff0c;这种差异正是由二者版本管理理念和存储方式差异造成的&#xff0c;今天我们先研究一下svn的分支…

力扣1942.最小未被占据椅子的编号

力扣1942.最小未被占据椅子的编号 用两个对组数组存到达的离开时间及其编号 遍历到达时间 同时处理之前所有离开时间离开就把座位清空 再给当前到达的安排座位 class Solution {public:int smallestChair(vector<vector<int>>& times, int targetFriend) {i…

ICMP 和 IGMP 的区别

ICMP 和 IGMP 协议 IP 层分支图 ICMP&#xff08;Internet Control Message Protocol&#xff0c;因特网控制信息协议&#xff09; 用于补充 IP 传输数据报的过程中&#xff0c;发送主机无法确定数据报是否到达目标主机。 ICMP 报文分为出错报告报文和查询报文两种。 若数据…

科技云报道:将技术普惠进行到底,百度智能云云原生数据库GaiaDB来啦!

科技云报道原创。 OpenAI再度扔出重磅炸弹。 近期&#xff0c;OpenAI公司在社交平台上宣布&#xff0c;其收购了领先实时分析数据库公司Rockset。 OpenAI强调&#xff0c;OpenAI将在其产品中整合Rockset技术&#xff0c;基于Rockset提供的数据索引和查询功能&#xff0c;使公…

pytorch学习(十三)torch维度变换

包含了flatten、view reshape transpose permute squeeze unsqueeze cat stack&#xff1b;在琢磨一遍之后就比较好理解了。 1.代码 import torch import numpy as np#生成一个2组3行4列的数据 data torch.randn((2,3,4)) print("data.shape:\n",data.shape) prin…

昇思25天学习打卡营第11天|基于 MindSpore 实现 BERT 对话情绪识别

BERT是一种先进的语言模型&#xff0c;由Google在2018年推出。它通过双向编码器Transformer的Encoder部分&#xff0c;捕捉词语和句子的深层含义。BERT的创新之处在于其预训练方法&#xff0c;特别是Masked Language Model和Next Sentence Prediction&#xff0c;这使得它在问答…

spring boot(学习笔记第十四课)

spring boot(学习笔记第十四课) Spring Security的密码加密&#xff0c;基于数据库认证 学习内容&#xff1a; Spring Security的密码加密基于数据库认证 1. Spring Security的密码加密 如果用户的密码保存在数据库中是以明文保存&#xff0c;对于公司的安全将是灾难性的&…

基于上下文自适应可变长熵编码 CAVLC 原理详细分析

CAVLC CAVLC&#xff0c;即Context-Adaptive Variable-Length Coding&#xff0c;是一种用于视频压缩的编码技术&#xff0c;特别是在MPEG-4视频编码标准中使用。CAVLC是一种熵编码方法&#xff0c;它根据视频数据的上下文信息来调整编码长度&#xff0c;以实现更有效的数据压…

Vue3实现word预览

1. 安装依赖 pnpm install vue-office/docx 2. 页面导入 // 导入依赖 import VueOfficeDocx from "vue-office/docx"; // 导入样式文件 import "vue-office/docx/lib/index.css"; 3. 使用&#xff08;这里使用是文件上传方式&#xff09;可以直接是在线…

【LeetCode:35. 搜索插入位置 + 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Linux systemd 服务启动失败Main process exited, code=exited, status=203/EXEC

文章目录 问题描述解决思路及方法排除方向一&#xff1a;nohup排除方向二&#xff1a;使用绝对路径而不是相对路径 问题描述 命令&#xff1a; java -Xms1024m -Xmx1024m -jar /usr/local/java/bin/mashang/app.jar --server.port8532 ----spring.profiles.activetest是可以直…

网络安全名词解释操作系统

1. 名词解释 渗透测试常用专业术语 1. POC&#xff0c;EXP&#xff0c;Payload与Shellcode等 POC:全称“Proof of Concept”&#xff0c;中文“概念验证”&#xff0c;常指验证某个概念或理论是否可行的过程或实验&#xff08;代码&#xff09;。 EXP:全称“Exploit”&#x…

【Vue】重新理解Vue-Router中的两种路由模式

历史小剧场 唐代实在太高太强了&#xff0c;他们忽忘了民族界限&#xff0c;他们不懂害怕外国人&#xff0c;不懂提防外国人&#xff0c;大量使用外国人当兵作将&#xff0c;结果才弄得不可收拾。于是唐代的府兵一变而成为“藩镇”&#xff0c;军阀割据&#xff0c;胡族临制。-…

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题

前言&#xff1a; emmm&#xff0c;说起来这个问题整得还挺好笑的&#xff0c;本人在公司内&#xff0c;奋笔疾书写代码&#xff0c;愉快的提交测试的时候&#xff0c;测试跟我说&#xff0c;在苹果手机上你这个样式有bug&#xff0c;我倒是要看看&#xff0c;是什么bug。 安卓…

vscode 远程 Ubuntu 系统

1、在 Ubuntu 下检查 sshd 守护进程是否开启 ps -aux | grep sshd如果没有开启&#xff0c;请在 Ubuntu 下输入指令安装 sudo apt-get install openssh-server2、首先打开 Windows 下的 vscode&#xff0c;点击左下角图标打开远程窗口 3、打开远程窗口&#xff0c;选择“Con…