OCC 创建点线面体

news2024/11/14 15:02:07

目录

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

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 actor
	actor->SetMapper(mapper.GetPointer()); //将vtk数据交给actor
	render->AddActor(actor.GetPointer()); //在渲染器中加入vtk actor

	iren->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 endregion

	
	VTKRenderWindow(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 endregion

	
	VTKRenderWindow(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 endregion

	
	VTKRenderWindow(cylinder);

}

三、总结

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

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

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

相关文章

Gateway源码分析:路由Route、断言Predicate、Filter

文章目录 源码总流程图说明GateWayAutoConfigurationDispatcherHandlergetHandler()handleRequestWith()RouteToRequestUrlFilterReactiveLoadBalancerClientFilterNettyRoutingFilter 补充知识适配器模式 详细流程图 源码总流程图 在线总流程图 说明 Gateway的版本使用的是…

在线 PDF 制作者泄露用户上传的文档

两家在线 PDF 制作者泄露了数万份用户文档&#xff0c;包括护照、驾驶执照、证书以及用户上传的其他个人信息。 我们都经历过这样的情况&#xff1a;非常匆忙&#xff0c;努力快速制作 PDF 并提交表单。许多人向在线 PDF 制作者寻求帮助&#xff0c;许多人的祈祷得到了回应。 …

Python学习笔记—100页Opencv详细讲解教程

目录 1 创建和显示窗口... - 4 - 2 加载显示图片... - 6 - 3 保存图片... - 7 - 4 视频采集... - 8 - 5视频录制... - 11 - 6 控制鼠标... - 12 - 7 TrackBar 控件... - 14 - 8.RGB和BGR颜色空间... - 16 - 9.HSV和HSL和YUV.. - 17 - 10 颜色空间的转化... - 18 - …

分页查询与分页条件查询

--------------- 无PageHelper插件分页查询 1.创建PageBean实体类 Data NoArgsConstructor AllArgsConstructor public class PageBean<T> {private Long total;//总条数private List<T> items;//当前页数据集合 }类型安全性 泛型&#xff1a;提供了编译时的类型…

【学长工具库】1.如何快速部署开源框架 | 若依框架保姆级搭建教程

今天学长带来了一款十分适合自学的开源框架-若依框架&#xff0c; 本文会详细的教大家怎么部署这个系统。 文末有所有资料获取方式~ 框架技术栈 前端采用 Vue、Element UI。后端采用 Spring Boot、Spring Security、Redis & Jwt。权限认证使用 Jwt&#xff0c;支持多终端…

【IEEE出版,会议历史良好、论文录用检索快】第四届计算机科学与区块链国际学术会议 (CCSB 2024,9月6-8)

CCSB 2024会议由深圳大学主办&#xff0c;旨在探讨计算机科学的最新发展如何与区块链技术相结合&#xff0c;以及这一结合如何推动金融、供应链管理、数据安全和其他多个行业的革新&#xff0c; 本次会议将提供一个多学科交流的平台&#xff0c;汇集来自相关领域学者的研究和思…

vxe-弹窗初始化激活选中Vxe-Table表格中第一行input输入框

1.实现效果 2.Modal弹窗的渲染过程 一、Vue组件的生命周期 Vue组件从创建到销毁会经历一系列的生命周期钩子&#xff0c;这些钩子为开发者提供了在不同阶段插入自定义逻辑的机会。在Modal弹窗的上下文中&#xff0c;这些生命周期钩子同样适用。 beforeCreate&#xff1a;组件…

解决 Ubuntu 用户登录后的 shell 和功能问题

在使用 Ubuntu 系统管理用户时&#xff0c;可能会遇到一些常见的问题&#xff0c;比如新创建的用户无法使用常见命令&#xff08;如 ll&#xff09;以及输出信息没有颜色。这些问题通常与用户的默认 shell 有关。本文将总结如何解决这些问题&#xff0c;并确保新用户能够正常使…

【linux深入剖析】命名管道 | 匿名管道与命名管道的区别 | system V共享内存

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 命名管道2. 创建命名管…

STM32之九:ADC模数转换器

目录 1. 简介 2. ADC 2.1 逐次逼近型寄存器SAR 2.2 ADC转换时间 3 ADC框图 3.1 8 bit ADC0809芯片内部框图 3.2 ADC框图 3.2.1 注入通道和规则通道 3.2.2 单次/连续转换模式 3.2.3 扫描模式 3.2.4 外部触发转换 3.2.5 数据对齐 3.2.6 模拟看门狗 4. 总结和ADC驱…

mac无法清空废纸篓怎么办 mac废纸篓清空了如何找回 cleanmymac误删文件怎么恢复

废纸篓相当于“一颗后悔药”&#xff0c;用于临时存储用户删除的文件。我们从从Mac上删除的文件&#xff0c;一般会进入废纸篓中。如果我们后悔了&#xff0c;可以从废纸篓中找回来。然而&#xff0c;有时我们会发现mac无法清空废纸篓&#xff0c;这是怎么回事?本文将探讨一些…

Unity-URP-SSAO记录

勾选After Opacity Unity-URP管线&#xff0c;本来又一个“bug”, 网上查不到很多关于ssao的资料 以为会不会又是一个极度少人用的东西 而且几乎都是要第三方替代 也完全没有SSAO大概的消耗是多少&#xff0c;完全是黑盒(因为用的人少&#xff0c;研究的人少&#xff0c;优…

JMeter学习笔记:线程组

继续&#xff1a;请求&#xff08;Sampler元件模拟的用户请求&#xff09;出错后继续运行&#xff1b; 启动下一进程&#xff1a;如果出错&#xff0c;则同一脚本中的余下请求将不再执行&#xff0c;直接重新开始执行&#xff1b; 停止线程&#xff1a;如果遇到请求&#xff…

51单片机嵌入式开发:14、STC89C52RC 之HX1838红外解码NEC+数码管+串口打印+LED显示

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 STC89C52RC 之HX1838红外解码NEC数码管串口打印LED显示 STC89C52RC 之HX1838红外解码NEC数码管串口打印LED显示1 概述2 硬件电路2.1 遥控器2.2 红外接收器电路2.3 STC89C52单…

深入理解Linux网络(三):TCP对象创建

深入理解Linux网络&#xff08;三&#xff09;&#xff1a;TCP对象创建 TCP对象创建inet_createsock_init_data TCP对象创建 常见的三句TCP编程&#xff1a; int main() {int sk socket(AF_INET, SOCK_STREAM, 0);connect(sk, ...)recv(sk, ...) }简单的两三⾏代码&#xff…

逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack

网址&#xff1a;aHR0cDovL3d3dy54aW5nYW9rYW90Yi5jb20vY29sbGVnZXMvc2VhcmNo 抓包分析&#xff0c;发现请求头有参数u-sign是加密的&#xff0c;载荷没有进行加密&#xff0c;直接跟栈分析。 进入第二个栈&#xff0c;打上断点&#xff0c;分析有没有加密位置。 可以看到参数…

【PyTorch】图像二分类项目-部署

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 在独立于训练脚本的新脚本中部署用于推理的模型&#xff0c;需要构造一个模型类的对象&#xff0c;并将权重加载到模型中。操作流程为&#xff1a;定义模型--加载权重--在验证和测试数据集上部署模型。 import torch…

Windows11 安装Docker,安装至D盘(其他非C盘皆可)

Docker默认安装在C盘&#xff0c;这未来随着docker使用必定会导致C盘空间吃紧。 所以本文提前进行空间布局&#xff0c;将docker默认安装路径软链接到D盘。 软链接D盘 Docker默认安装路径为C:\Program Files\Docker。使用管理员权限打开命令终端 输入以下命令&#xff1a;m…

【LeetCode】day14:226 - 翻转二叉树, 101 - 对称二叉树, 104 - 二叉树的最大深度, 111 - 二叉树的最小深度

LeetCode 代码随想录跟练 Day14 226.翻转二叉树101.对称二叉树104.二叉树的最大深度111.二叉树的最小深度 226.翻转二叉树 题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 使用递归处理&#xff08;迭代以及层序同…

jdk1.8 List集合Stream流式处理

jdk1.8 List集合Stream流式处理 一、介绍(为什么需要流Stream&#xff0c;能解决什么问题&#xff1f;)1.1 什么是 Stream&#xff1f;1.2 常见的创建Stream方法1.3 常见的中间操作1.4 常见的终端操作 二、创建流Stream2.1 Collection的.stream()方法2.2 数组创建流2.3 静态工厂…