【OCCT+ImGUI系列】011-Poly-Poly_Triangle三角形面片

article/2025/6/7 22:34:11

在这里插入图片描述

Poly_Triangle 是什么?

Poly_Triangle 是一个非常轻量的类,用于表示一个三角网格中的单个三角形面片。它是构成 Poly_Triangulation(三角网格对象)的基本单位之一。之后会写关于碰撞检测的相关文章,三角面片是非常重要的一部分。

每个 Poly_Triangle 包含三个整数索引,它们是指向一个节点列表的索引(通常是 Poly_Triangulation::Nodes() 中的点)。这些节点是三角形的三个顶点。


🔹 数据成员

Standard_Integer myNodes[3];
  • 存储三个节点的索引,索引范围通常是 [1, NbNodes()](注意:OpenCascade 中使用 1-based 索引)。
  • 每个索引指向的是一个顶点坐标,坐标存储在 Poly_Triangulation 中的节点数组里。

🔹 构造函数

Poly_Triangle()
  • 默认构造函数,三个索引值初始化为 0(无效状态)。

请添加图片描述

如图为从点击选择三个点的索引来构造Poly_Triangle并显示。

Poly_Triangle(Standard_Integer theN1, Standard_Integer theN2, Standard_Integer theN3)
  • 构造函数,直接设置三个顶点索引。

🔹 成员函数

设置节点索引

void Set(Standard_Integer theN1, Standard_Integer theN2, Standard_Integer theN3)
  • 一次性设置所有三个节点索引。
void Set(Standard_Integer theIndex, Standard_Integer theNode)
  • 设置指定位置(1~3)的单个索引值。
  • 如果 theIndex 不在 1~3,抛出 Standard_OutOfRange 异常。

访问节点索引

void Get(Standard_Integer& theN1, Standard_Integer& theN2, Standard_Integer& theN3) const
  • 返回三个节点索引的值(通过引用)。
Standard_Integer Value(Standard_Integer theIndex) const
  • 返回指定位置(1~3)的节点索引值,超出范围抛异常。
Standard_Integer operator()(Standard_Integer theIndex) const
Standard_Integer& operator()(Standard_Integer theIndex)
  • 函数调用操作符的重载,提供类似数组访问的方式。
  • 返回索引值(常量或引用)。
Standard_Integer& ChangeValue(Standard_Integer theIndex)
  • 返回对某个节点索引的引用,可以进行原地修改。

注意点

  1. 索引范围是 1~NbNodes(),不是从0开始
  2. 三角形只保存的是节点索引,不保存具体的几何位置,顶点坐标保存在 Poly_Triangulation 中。
  3. 修改 Poly_Triangle 不会自动更新 Poly_Triangulation,需要你在使用时保持一致性。

总结

功能方法简述
构造Poly_Triangle()空三角形
构造Poly_Triangle(n1,n2,n3)初始化三角形索引
访问Get()获取3个顶点索引
访问Value(index) / operator()获取某个索引值
修改Set(n1,n2,n3) / Set(index, node)设置索引
修改ChangeValue(index)引用访问可直接修改

代码

#pragma once#include "pch.h"
#include <Poly_Triangulation.hxx>
#include <AIS_Triangulation.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include "BaseScene.h"
#include "VisSceneComponents.h"
#include "TutorialWindow.h"class PolyTriangle011 : public BaseScene, public VisSceneComponents, public TutorialWindow {
public:PolyTriangle011() {openTutorialWindow();initAllNodes();}void displayScene(const Handle(V3d_View)& view, const Handle(AIS_InteractiveContext)& context) override {if (!bIsSceneInit) {sceneInit(view, context);bIsSceneInit = true;}renderTutorialWindow(context);}void customInitTutorialWindow(const Handle(AIS_InteractiveContext)&) override {}private:std::vector<TColgp_Array1OfPnt> allNodes;int currentNodeSetIndex = 0;Handle(Poly_Triangulation) triangulation;Handle(AIS_Triangulation) aisTriangulation;std::vector<Handle(AIS_Shape)> vertexMarkers;int triIndices[3] = { 1, 2, 3 };bool needsUpdate = true;void initAllNodes() {allNodes.clear();// 节点集 1: 正三角形TColgp_Array1OfPnt nodes1(1, 3);nodes1.SetValue(1, gp_Pnt(0, 0, 0));nodes1.SetValue(2, gp_Pnt(100, 0, 0));nodes1.SetValue(3, gp_Pnt(50, 100, 0));allNodes.push_back(nodes1);// 节点集 2: 矩形TColgp_Array1OfPnt nodes2(1, 4);nodes2.SetValue(1, gp_Pnt(0, 0, 0));nodes2.SetValue(2, gp_Pnt(100, 0, 0));nodes2.SetValue(3, gp_Pnt(100, 100, 0));nodes2.SetValue(4, gp_Pnt(0, 100, 0));allNodes.push_back(nodes2);// 节点集 3: 10 个点(圆形分布)TColgp_Array1OfPnt nodes3(1, 10);for (int i = 0; i < 10; ++i) {double angle = 2.0 * M_PI * i / 10.0;nodes3.SetValue(i + 1, gp_Pnt(100 * cos(angle), 100 * sin(angle), 0));}allNodes.push_back(nodes3);}void sceneInit(const Handle(V3d_View)&, const Handle(AIS_InteractiveContext)& context) override {updateVisualization(context);}void renderTutorialContent(const Handle(AIS_InteractiveContext)& context) override {ImGui::TextColored(ImVec4(1, 1, 0, 1), "Poly_Triangulation Multi-point Construct Example");// 点集选择 UI(非 CollapsingHeader)ImGui::SeparatorText("Point Set Selection");const char* labels[] = { "Equilateral Triangle (3 pts)", "Rectangle (4 pts)", "Circle (10 pts)" };if (ImGui::Combo("Current Point Set", &currentNodeSetIndex, labels, IM_ARRAYSIZE(labels))) {needsUpdate = true;// 重置三角形索引在合法范围内int lower = allNodes[currentNodeSetIndex].Lower();int upper = allNodes[currentNodeSetIndex].Upper();for (int i = 0; i < 3; ++i) {triIndices[i] = std::clamp(lower + i, lower, upper);}}if (triIndices[0] == triIndices[1] ||triIndices[0] == triIndices[2] ||triIndices[1] == triIndices[2]) {ImGui::TextColored(ImVec4(1, 0, 0, 1), "Three vertices must be unique!");}// 三角形顶点选择 UI(默认展开)if (ImGui::CollapsingHeader("Triangle Index Selection", ImGuiTreeNodeFlags_DefaultOpen)) {int lower = allNodes[currentNodeSetIndex].Lower();int upper = allNodes[currentNodeSetIndex].Upper();for (int i = 0; i < 3; ++i) {std::string label = "Vertex Index " + std::to_string(i + 1);if (ImGui::SliderInt(label.c_str(), &triIndices[i], lower, upper)) {needsUpdate = true; // 用户拖动滑块后设置更新标志}}}if (needsUpdate) {updateVisualization(context);needsUpdate = false;}}void updateVisualization(const Handle(AIS_InteractiveContext)& context) {// 清理之前的显示for (auto& v : vertexMarkers)context->Remove(v, false);vertexMarkers.clear();if (!triangulation.IsNull())context->Remove(aisTriangulation, false);// 当前节点集const auto& nodes = allNodes[currentNodeSetIndex];int n = nodes.Length();triangulation = new Poly_Triangulation(n, 1, false);for (int i = nodes.Lower(); i <= nodes.Upper(); ++i)triangulation->SetNode(i, nodes(i));triangulation->SetTriangle(1, Poly_Triangle(triIndices[0], triIndices[1], triIndices[2]));for (int i = nodes.Lower(); i <= nodes.Upper(); ++i) {TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(nodes(i));auto ais = new AIS_Shape(v);ais->SetColor(Quantity_NOC_RED1);context->Display(ais, false);vertexMarkers.push_back(ais);}aisTriangulation = new AIS_Triangulation(triangulation);aisTriangulation->SetTransparency(0.4f);context->Display(aisTriangulation, true);}
};

http://www.hkcw.cn/article/JXnSHJdxTO.shtml

相关文章

分布式拜占庭容错算法——权益证明(PoS)算法详解

Java 实现权益证明&#xff08;PoS&#xff09;算法详解 一、PoS 核心机制 #mermaid-svg-8VcpJQY92Jtxe9m1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8VcpJQY92Jtxe9m1 .error-icon{fill:#552222;}#mermaid-s…

Pycharm的使用技巧总结

目录 一、高效便捷的快捷键 二、界面汉化处理 1.设置 2.插件 3.汉化插件安装 三、修改字体大小、颜色 1.选择文件-设置 2.选择编辑器-配色方案-python 3.修改注释行颜色 4.修改编辑器字体颜色 一、高效便捷的快捷键 序号快捷键功能场景效果1Ctrl /快速注释/取消注释…

从 Docker 到 Containerd:Kubernetes 容器运行时迁移实战指南

一、背景 Kubernetes 自 v1.24 起移除了 dockershim&#xff0c;不再原生支持 Docker Engine&#xff0c;用户需迁移至受支持的 CRI 兼容运行时&#xff0c;如&#xff1a; Containerd&#xff08;推荐&#xff0c;高性能、轻量级&#xff09; CRI-O&#xff08;专为 Kuberne…

基于 NXP + FPGA+Debian 高可靠性工业控制器解决方案

在工业系统开发中&#xff0c;**“稳定”**往往比“先进”更重要。设备一旦部署&#xff0c;生命周期动辄 5~10 年&#xff0c;系统重启或异常恢复成本高昂。 这时候&#xff0c;一套“值得托付”的软硬件组合&#xff0c;就显得尤为关键。 ✅ NXP —— 提供稳定、长期供货的工…

03.搭建K8S集群

K8S集群搭建的方式 目前主流的搭建k8s集群的方式有kubeadm、minikube、二进制包三种方式&#xff1a; kubeadm&#xff08;本案例搭建方式&#xff09; 是一个工具&#xff0c;用于快速搭建kubernetes集群&#xff0c;目前应该是比较方便和推荐的&#xff0c;简单易用 kubea…

Redis底层数据结构之快链表(QuickList)

QuickList基本结构 用一句话来说&#xff0c;QuickList是一个双端链表&#xff0c;每一个链表节点中存储的是ZipList&#xff0c;参照下面这张图可以更好地理解QuickList的结构组成&#xff1a; QuickList在Redis6.0中一共定义了6个结构体&#xff0c;分别为&#xff1a; quick…

Mac查看MySQL版本的命令

通过 Homebrew 查看&#xff08;如果是用 Homebrew 安装的&#xff09; brew info mysql 会显示你安装的版本、路径等信息。 你的终端输出显示&#xff1a;你并没有安装 MySQL&#xff0c;只是查询了 brew 中的 MySQL 安装信息。我们一起来看下重点&#xff1a; &#x1f9fe…

Spring Boot 自动配置原理:从入门到精通

Spring Boot 的自动配置是其核心特性之一&#xff0c;它极大地简化了 Spring 应用的开发&#xff0c;让开发者可以专注于业务逻辑&#xff0c;而无需编写大量的配置代码。 本文将深入探讨 Spring Boot 自动配置的原理&#xff0c;帮助你理解其工作机制&#xff0c;并能灵活运用…

网络原理1

协议 在网络通信中&#xff0c;协议是非常重要的概念。协议是在网络通信过程中的约定。发送方和接收方需要提前商量好数据的格式&#xff0c;才能确保正确进行沟通。 应用层协议 应用层&#xff0c;对应着应用程序&#xff0c;是跟我们程序员打交道最多的一层。调用操作系统…

【JSON-to-Video】设置背景视频片断

欢迎来到JSON转视频系列教程。今天要教大家如何添加背景视频片断&#xff0c;在视频制作中&#xff0c;巧妙运用背景视频&#xff0c;能为作品增添独特魅力。下面就为大家详细讲解具体步骤。 JSON转视频教程&#xff0c;添加背景视频片断 设置bgVideo字段 {"bgVideo"…

工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线

一、方案背景​ 在工地、矿山、工厂等高危作业场景&#xff0c;反光衣是保障人员安全的必备装备。但传统人工巡查存在效率低、易疏漏等问题&#xff0c;难以实现实时监管。AI智能分析网关V4基于人工智能技术&#xff0c;可自动识别人员着装状态&#xff0c;精准定位未穿反光衣…

Java垃圾回收机制深度解析:从理论到实践的全方位指南

Java垃圾回收(GC)是Java虚拟机(JVM)的核心功能&#xff0c;它自动管理内存分配与回收&#xff0c;避免了C/C中常见的内存泄漏问题。本文将深入剖析Java垃圾回收的工作原理、算法实现、收集器类型及调优策略&#xff0c;助你全面掌握JVM内存管理的精髓。 一、垃圾回收基础概念 …

实验设计与分析(第6版,Montgomery著,傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题。主要涉及方差分析。 YieldDesign <-expand.grid(A gl(3, 1, labels c("-", "0","…

Vue内置组件Teleport和Suspense

一. Vue内置组件Teleport 认识Teleport( teleport&#xff1a;允许我们把组件的模板渲染到特定的元素上) 1.1. 在组件化开发中&#xff0c;我们封装一个组件A&#xff0c;在另外一个组件B中使用 组件A中template的元素&#xff0c;会被挂载到组件B中template的某个位置&#xf…

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信

研究背景&#xff1a;日常生活中&#xff0c;健康人依靠手完成对物体的操作。对于手部截肢患者&#xff0c;手部的缺失导致他们难以有效地操作物体&#xff0c;进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿&#xf…

Ansys Zemax | 手机镜头设计 - 第 4 部分:用 LS-DYNA 进行冲击性能分析

附件下载 联系工作人员获取附件 该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用 Ansys Mechanical 和 LS - DY…

windows可视化粘贴使用剪贴板

复制 ctrl c可视化粘贴 win v选择要粘贴的内容

【QT】认识QT

文章目录 1. 认识Qt2. 创建QT项目3. 认识对象树4. 其它4.1 窗口坐标系4.2 快捷键 1. 认识Qt 什么是QT Qt 是⼀个跨平台的C图形用户界⾯应用程序框架。 它为应用程序开发者提供了建立艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt为开发者提供…

OpenCV CUDA模块特征检测------角点检测的接口createMinEigenValCorner()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建一个 基于最小特征值&#xff08;Minimum Eigenvalue&#xff09;的角点响应计算对象&#xff0c;这是另一种经典的角点检测方法&…

Java高级 | (二十二)快速应用开发框架——Spring Boot

一、使用IDEA搭建SpringBoot项目 二、创建控制器类 1、先运行项目。 如果配置正常&#xff0c;ldea运行界面如下&#xff0c;表示启动正常。 2、创建控制器类 鼠标右击controller包&#xff0c;点击new->Java Class,在弹出的对话框中输入“HelloController”并按回车健&a…