Open CASCADE学习|绘制砂轮

今天绘制一个砂轮,其轮廓由两条直线段和两段圆弧构成,圆弧分别与直线相切,两条圆弧之间相交而非相切。建模思路是:先给定两条直线段的起始点及长度,画出直线段,然后给定其中一圆弧的半径及圆心角,依据此计算出该圆弧圆心,接着求出另一圆弧圆心和半径,最后创建边和环,对环进行环形扫掠,得到砂轮实体。构建过程主要涉及:

直线、直线段创建

直线的创建通常涉及gp_Lin类,它代表一个无限长的直线。而直线段的创建则涉及Geom_TrimmedCurve类,它是表示修剪曲线的基类,可以用于表示直线段、圆弧段等。

圆、圆弧创建

创建圆和圆弧涉及使用gp_Circ类来表示圆,以及Geom_TrimmedCurve类来表示圆弧。

求直线上一点的垂线

平面内两直线相交求交点

创建TopoDS_Edge

TopoDS_Edge 是表示拓扑边缘的类,通常它是构成几何形状边界的一部分。要创建一个 TopoDS_Edge 对象,你通常需要从几何形状(如线段、圆弧、圆、椭圆等)开始,并将其转换为拓扑边缘。

创建TopoDS_Wire

TopoDS_Wire表示一个由有序的边(edge)序列构成的拓扑线框。创建TopoDS_Wire通常涉及使用BRep类库中的构造器来构建一系列的边,并将它们组合成一个线框。

创建旋转扫掠

建旋转扫掠(也称为旋转体或回转体)通常涉及使用BRepPrimAPI_MakeRevolution类。这个类允许围绕一个指定的轴旋转一个二维轮廓来创建一个三维实体。

前面已经使用SW绘制过:Solidworks二次开发:python画砂轮

基于C++的具体实现如下:

#include <GC_MakeSegment.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <gp_Circ.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <gp_Lin2d.hxx>
#include <gp_Pnt2d.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <gp_Lin.hxx>
#include <IntAna2d_AnaIntersection.hxx>
#include <BRepPrimAPI_MakeRevol.hxx>
​
#include"Viewer.h"
​
​
int main(int argc, char* argv[])
{Standard_Real Line1_angle = 280 * M_PI / 180;Standard_Real Line1_length = 0.762;Standard_Real Line2_angle = 236 * M_PI / 180;Standard_Real Line2_length = 0.9081;Standard_Real Arc1_r = 0.159;Standard_Real Arc1_angle = 48;gp_Pnt Line1_p1(-0.9832 / 2, 0, 0);gp_Pnt Line2_p1(0.9832 / 2, 0, 0);gp_Lin Line1(Line1_p1, gp_Dir(cos(Line1_angle), sin(Line1_angle), 0.));gp_Lin Line2(Line2_p1, gp_Dir(cos(Line2_angle), sin(Line2_angle), 0.));Handle(Geom_TrimmedCurve) L1 = GC_MakeSegment(Line1, 0., Line1_length);TopoDS_Edge L1e = BRepBuilderAPI_MakeEdge(L1);Handle(Geom_TrimmedCurve) L2 = GC_MakeSegment(Line2, 0., Line2_length);TopoDS_Edge L2e = BRepBuilderAPI_MakeEdge(L2);gp_Pnt l1end = L1->EndPoint();gp_Pnt l2end = L2->EndPoint();gp_Lin Line1v(l1end, gp_Dir(cos(Line1_angle+M_PI_2), sin(Line1_angle+ M_PI_2), 0.));gp_Lin2d Line2v(gp_Pnt2d(l2end.X(), l2end.Y()), gp_Dir2d(cos(Line2_angle- M_PI_2), sin(Line2_angle- M_PI_2)));gp_Lin Line2v3d(l2end, gp_Dir(cos(Line2_angle - M_PI_2), sin(Line2_angle - M_PI_2),0.));Handle(Geom_TrimmedCurve) L1v = GC_MakeSegment(Line1v, 0., Arc1_r);gp_Pnt l1vend = L1v->EndPoint();gp_Circ c1(gp_Ax2(l1vend,gp_Dir(0,0,1)), Arc1_r);Handle(Geom_TrimmedCurve) c1c = GC_MakeArcOfCircle(c1, l1end, Arc1_angle, 1);gp_Pnt c1end = c1c->EndPoint();gp_Lin2d Line3(gp_Pnt2d(c1end.X(),c1end.Y()),gp_Dir2d(l2end.X() - c1end.X(), l2end.Y() - c1end.Y()));gp_Lin2d Line3v = Line3.Normal(gp_Pnt2d((l2end.X() + c1end.X())/2,(l2end.Y() + c1end.Y())/2));IntAna2d_AnaIntersection aIntAna;aIntAna.Perform(Line2v, Line3v); IntAna2d_IntPoint aIntPoint = aIntAna.Point(1);gp_Pnt o2(aIntPoint.Value().X(), aIntPoint.Value().Y(),0.);Handle(Geom_TrimmedCurve) L2v = GC_MakeSegment(Line2v3d, l2end, o2);Standard_Real r2=L2v->LastParameter();gp_Circ c2(gp_Ax2(o2, gp_Dir(0, 0, 1)), r2);Handle(Geom_TrimmedCurve) c2c = GC_MakeArcOfCircle(c2, c1end, l2end, 1);
​TopoDS_Edge c1ce = BRepBuilderAPI_MakeEdge(c1c);TopoDS_Edge L1ev = BRepBuilderAPI_MakeEdge(L1v);TopoDS_Edge c2ce = BRepBuilderAPI_MakeEdge(c2c);
​gp_Pnt Line1_up(-0.9832 / 2, 5, 0);gp_Pnt Line2_up(0.9832 / 2, 5, 0);TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(Line1_p1, Line1_up);TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(Line1_up, Line2_up);TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(Line2_up, Line2_p1);TopTools_ListOfShape listEdge;listEdge.Append(anEdge1);listEdge.Append(anEdge2);listEdge.Append(anEdge3);listEdge.Append(L1e);listEdge.Append(c1ce);listEdge.Append(c2ce);listEdge.Append(L2e);BRepBuilderAPI_MakeWire mw;mw.Add(listEdge);mw.Build();TopoDS_Shape gwheel = BRepPrimAPI_MakeRevol(mw, gp_Ax1(gp_Pnt(0, 5, 0), gp_Dir(1, 0, 0)), 2*M_PI);Viewer vout(50, 50, 500, 500);vout << gwheel;vout.StartMessageLoop();return 0;
}
​

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

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

相关文章

4核8G服务器能承受多少并发?

腾讯云4核8G服务器能承受多少并发&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#x…

Python世界之开端

目录 一、基础语法 1.交互式编程 2.脚本式编程 3.标识符 4.同一行显示多条语句 5.保留字符 6.行和缩进 7.错误提醒 8.多行语句 9.引号 10.注释 11.空行 12.print 输出 13.代码组 二、变量类型 1.标准数据类型 2.数字 3.字符串 1.字符串运算符 2.转义字符 …

Nginx网络服务

一、Nginx概述 1.1Nginx介绍 Nginx&#xff1a; 一款高新能、轻量级Web服务软件稳定性高系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部…

【LeetCode: 889. 根据前序和后序遍历构造二叉树 + DFS】

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

【Linux】用户与用户组,用户账号系统文件

目录 一 用户与用户组 1.1 含义 1.2 用户相关语法 1.2.1 useradd&#xff08;添加用户账号&#xff09; 1.2.2 userdel&#xff08;删除用户账号&#xff09; 1.2.3 usermod&#xff08;修改用户账号&#xff09; 1.2.4 passwd(用户口令的管理&#xff09; 1.2.5 su&am…

Git面试题整理(对比)

1.拉取请求pull和分支branch有什么区别 拉取请求(Pull Request) 定义:拉取请求是在代码协作平台上发起的一种通知&#xff0c;它告诉其他团队成员:“我完成了一段代码的工作&#xff0c;请审查并合并到主分支中去”。它不仅是请求合并代码的方式&#xff0c;也是代码审查、讨论…

使用Lombok @Data 出现java: 找不到符号 的问题

第一种&#xff1a;pom依赖最好如下方式 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>compile</scope> </dependency>第二种&#xff1…

【Azure 架构师学习笔记】- Azure Databricks (10) -- UC 使用

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (9) – UC权限 在前面的文章&#xff1a;【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog中演示了如何配置一个UC。 本文…

excel数据导入到数据库的方法

背景&#xff1a;最近在做和HW对接的某项目&#xff0c;需要将第三方接口提供的数据进行展示&#xff1b;在对方提供了详细的excel后&#xff0c;觉得也挺简单的就是将excel数据导入到数据库中。 方案一&#xff1a; 普通的初学者肯定会想&#xff0c;那我读取excel数据&…

人工智能的理解

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是一种模拟人类智能思维过程的计算机系统。它通过模仿、学习和应用人类的思维方式和行为模式来完成各种任务&#xff0c;包括但不限于感知、推理、学习、规划、决策等。人工智能的发展已经取得了巨大的进…

UE5 骨骼重定向

1.通过 VRoidStudio 1.26.0 软件创建模型 导出 2.下载ue插件 https://github.com/ruyo/VRM4U/releases 安装 重启 3.拖入创建的模型 到指定文件夹 4.为模型创建 IK绑定&#xff0c;重定向骨骼根 新增链条 5.创建IK 重定向&#xff0c;指定源 和 目标 IK绑定 6.

【More Effective C++】条款6:区分前置++和后置++

前置&#xff1a;返回引用原因&#xff1a; 保证和内建类型一致&#xff0c;i&#xff0c;是合法的 后置&#xff1a;返回一个const值的原因 避免连加操作&#xff0c;因为i是不合法的&#xff0c;和内建类型不一致&#xff1b;避免混淆&#xff0c;因为第二个是对第一个返回…

基于MPPT最大功率跟踪算法的涡轮机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪算法的涡轮机控制系统simulink建模与仿真.mppt采用爬山法实现&#xff0c;仿真输出MPPT控制效果&#xff0c;功率&#xff0c;转速等。 2.系统仿真结果 …

Thymeleaf无法显示模板视图,加载页面显示404状态问题的解决方法

本篇文章主要讲解&#xff1a;Thymeleaf无法显示模板视图&#xff0c;加载页面显示404状态问题的解决方法 日期&#xff1a;2024年2月23日 作者&#xff1a;任聪聪 现象说明&#xff1a; 1.只返回输出模板的名称&#xff0c;如图&#xff1a; 2.显示报错信息&#xff1a; Whi…

左右互博。

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 讨厌鬼在和小甜妹在玩石头游戏。 游戏一开始有 nnn 堆石子&#xff0c;第 iii 堆石子&#xff0c;有 aia_iai​ 个石子。两人轮流进行游戏。 轮到某个人时&#xff0c;这个人先选数量为 x(x&…

64-JQuery动画

1.隐藏正在显示的元素.hide(速度,函数) 显示正在隐藏的元素.show(速度,函数) 元素可见切换为隐藏,元素隐藏切换为可见.toggle(速度,函数) 速度单位是毫秒 <script>$("button").eq(0).click(function(){//隐藏$("div").hide();})$("butt…

C#WinForm窗体TableLayout控件布局

Winform界面TablLayout是常用的控件之一 可以实现界面任意位置布局&#xff0c;在表格中添加其他控件默认只能占用一个单元格&#xff0c;如果想跨任意数量行列需要使用两个函数设置&#xff0c;下面举例 新建Tab表 设置插入按钮布局 // // button1 // this.tableLayoutPanel…

sqlserver 三范式

在关系数据库设计中&#xff0c;三范式是一种用于规范化数据库结构的理论模型&#xff0c;旨在消除数据冗余和提高数据存储的效率。三范式分为以下三个级别&#xff1a; 第一范式&#xff08;1NF&#xff09;&#xff1a;确保每个表中的每个字段都是原子的&#xff0c;即不可再…

React htmlfor

注意&#xff0c;在添加属性时&#xff0c; class 属性需要写成 className &#xff0c;for 属性需要写成 htmlFor &#xff0c;这是因为 class 和 for 是 JavaScript 的保留字。 在React中&#xff0c;当我们需要为一个表单元素设置标签时&#xff0c;可以使用htmlFor属性。它…

第三百六十三回

文章目录 1. 概念介绍2. 实现方法2.1 环绕效果2.2 立体效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义SlideImageSwitch组件"相关的内容&#xff0c;本章回中将介绍两种阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…