【OCCT+ImGUI系列】012-Geom2d_AxisPlacement

article/2025/6/14 15:52:09

在这里插入图片描述

Geom2d_AxisPlacement 教学笔记

一、类概述

在这里插入图片描述
Geom2d_AxisPlacement 表示二维几何空间中的一个坐标轴(轴系),由两部分组成:

  • gp_Pnt2d:原点(Location)
  • gp_Dir2d:单位方向向量(Direction)

它是 Geom2d_Geometry 的派生类,可用于表示局部坐标系、图形基准轴、草图中对齐约束等。

二、构造方法

构造方式说明
Geom2d_AxisPlacement(gp_Pnt2d P, gp_Dir2d V)使用原点和单位方向构造坐标轴
Geom2d_AxisPlacement(gp_Ax2d A)gp_Ax2d 转换构造

示例:

Handle(Geom2d_AxisPlacement) axis = new Geom2d_AxisPlacement(gp_Pnt2d(0,0), gp_Dir2d(1,0));

三、常用方法解析

原点与方向操作
方法功能
SetLocation(const gp_Pnt2d& P)设置新原点
SetDirection(const gp_Dir2d& V)设置新方向(自动归一化)
Location()获取当前原点
Direction()获取当前方向
方向翻转
方法功能
Reverse()原地翻转方向向量
Reversed()返回一个反向的新副本(不修改原对象)
坐标轴整体操作
方法功能
SetAxis(const gp_Ax2d& A)设置完整坐标轴信息
Ax2d()返回对应的 gp_Ax2d 对象
Angle(const Handle<Geom2d_AxisPlacement>& Other)计算两个坐标轴方向夹角(单位:弧度,范围 -π 到 π)
Copy()克隆自身副本
Transform(const gp_Trsf2d& T)应用 2D 仿射变换(平移、旋转、镜像等)


四、代码片段示例

1. 设置位置

请添加图片描述

  // 单独设置 X 或 Yif (ImGui::SliderFloat("Set X", &coord[0], -100.0f, 100.0f)) {point2d->SetX(coord[0]);UpdatePoint(context);}if (ImGui::SliderFloat("Set Y", &coord[1], -100.0f, 100.0f)) {point2d->SetY(coord[1]);UpdatePoint(context);}
2. 利用Transform旋转

在这里插入图片描述

    void ApplyRotation(const Handle(AIS_InteractiveContext)& context) {gp_Trsf2d trsf;trsf.SetRotation(gp_Pnt2d(0, 0), rotateAngle * M_PI / 180.0);point2d->Transform(trsf);coord[0] = static_cast<float>(point2d->X());coord[1] = static_cast<float>(point2d->Y());UpdatePoint(context);}

五、总结

特点说明
轻量只包含点和方向向量
操作灵活支持方向翻转、复制、变换、方向角计算等
工程适用性强常用于草图系统、路径定义、投影方向设定等场景

六、代码

#pragma once#include "pch.h"
#include <Geom2d_CartesianPoint.hxx>
#include <Geom2d_Transformation.hxx>
#include <gp_Trsf2d.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <AIS_Shape.hxx>
#include "BaseScene.h"
#include "VisSceneComponents.h"
#include "TutorialWindow.h"class Geom2d012 : public BaseScene, public VisSceneComponents, public TutorialWindow {
public:Geom2d012() { openTutorialWindow(); }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)& context) override {}void sceneInit(const Handle(V3d_View)&, const Handle(AIS_InteractiveContext)& context) override {// 初始化一个二维点point2d = new Geom2d_CartesianPoint(0.0, 0.0);VisualizePoint(context);}void renderTutorialContent(const Handle(AIS_InteractiveContext)& context) override {ImGui::Text("Geom2d_CartesianPoint Controls");// 单独设置 X 或 Yif (ImGui::SliderFloat("Set X", &coord[0], -100.0f, 100.0f)) {point2d->SetX(coord[0]);UpdatePoint(context);}if (ImGui::SliderFloat("Set Y", &coord[1], -100.0f, 100.0f)) {point2d->SetY(coord[1]);UpdatePoint(context);}ImGui::Separator();ImGui::Text("Transformation:");if (ImGui::SliderFloat("Rotate Angle (deg)", &rotateAngle, 0.0f, 360.0f)) {}if (ImGui::Button("Apply Rotation")) {ApplyRotation(context);}if (ImGui::Button("Reset Point")) {point2d->SetCoord(0.0, 0.0);coord[0] = 0.0f;coord[1] = 0.0f;UpdatePoint(context);}ImGui::Separator();ImGui::Text("Current Coordinates:");double x = point2d->X();double y = point2d->Y();ImGui::Text("X: %.2f, Y: %.2f", x, y);}private:Handle(Geom2d_CartesianPoint) point2d;Handle(AIS_Shape) pointAIS;float coord[2] = { 0.0f, 0.0f };float rotateAngle = 45.0f;void VisualizePoint(const Handle(AIS_InteractiveContext)& context) {gp_Pnt p3d(point2d->X(), point2d->Y(), 0.0);TopoDS_Vertex vertex = BRepBuilderAPI_MakeVertex(p3d);pointAIS = new AIS_Shape(vertex);pointAIS->SetColor(Quantity_NOC_RED);context->Display(pointAIS, Standard_False);}void UpdatePoint(const Handle(AIS_InteractiveContext)& context) {gp_Pnt p3d(point2d->X(), point2d->Y(), 0.0);TopoDS_Vertex vertex = BRepBuilderAPI_MakeVertex(p3d);pointAIS->SetShape(vertex);context->Redisplay(pointAIS, Standard_False);}void ApplyRotation(const Handle(AIS_InteractiveContext)& context) {gp_Trsf2d trsf;trsf.SetRotation(gp_Pnt2d(0, 0), rotateAngle * M_PI / 180.0);point2d->Transform(trsf);coord[0] = static_cast<float>(point2d->X());coord[1] = static_cast<float>(point2d->Y());UpdatePoint(context);}
};

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

相关文章

NodeMediaEdge任务管理

NodeMediaEdge任务管理 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 在未使用NodeMediaServer的情况下&#xff0c;或是对部分视频流需要单独推送的需求&#xff0c;也可…

ROS2学习(18)------ROS2 Rviz工具使用说明

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 ROS版本&#xff1a;2 ROS 2 中的 Rviz&#xff08;Robot Visualization&#xff09;是一个强大的三维可视化工具&#xff0c;用于显示来自 ROS 系统的各种传感器数据、路径规划结果、机器人…

安科瑞APD300:多模态融合的智能局放监测新标杆

安科瑞顾强 在电网安全运行的严密链条中&#xff0c;开关柜、环网柜等高压设备如同关键节点&#xff0c;其内部绝缘状态的完好性直接决定着电力系统的整体稳定。局部放电&#xff08;PD&#xff09;作为绝缘劣化的早期、灵敏征兆&#xff0c;若能及时捕捉和精准识别&#xff0…

Office文档图片批量导出工具

软件介绍 本文介绍一款专业的Office文档图片批量导出工具。 软件特点 这款软件能够批量导出Word、Excel和PPT中的图片&#xff0c;采用绿色单文件设计&#xff0c;体积小巧仅344KB。 基本操作流程 使用方法十分简单&#xff1a;直接将Word、Excel或PPT文件拖入软件&#xf…

网络编程(计算机网络基础)

认识网络 1.网络发展史 ARPnetA(阿帕网)->internet(因特网)->移动互联网->物联网 2.局域网与广域网 局域网 概念&#xff1a;的缩写是LAN&#xff08;local area network&#xff09;&#xff0c;顾名思义&#xff0c;是个本地的网络&#xff0c;只能实现小范围短距…

godwork_ AT 5.2 摄影测量空三数据处理软件。

1.平差技术&#xff0c;平差模块不依赖PATB、Bingo等国外技术 2.采用特征匹配&#xff0c;对国内无人机数据具有很强的适应性&#xff0c;对测区大小、形状、重叠度没有严格限制&#xff0c;适用于大偏角影像、大高差地区。 3.对飞行方向没有要求&#xff0c;无需旋转影像等预…

《仿盒马》app开发技术分享-- 个人中心关于逻辑完善(端云一体)

开发准备 上一节我们针对首页的一些静态按钮做了一些功能上的完善&#xff0c;这一节我们要针对已有的功能做一下逻辑完善&#xff0c;经过测试&#xff0c;在一开始的登录中我们登录之后当前页面的状态并不能马上的展示出来&#xff0c;并且缺少退出功能&#xff0c;退出后我…

UniRig:如何在矩池云一站式解决 3D 模型绑定难题

在 3D 动画制作中&#xff0c;绑定&#xff08;Rigging&#xff09;是一个至关重要但复杂耗时的步骤。它包括为 3D 模型创建骨架并分配蒙皮权重&#xff0c;以实现流畅的动画效果。由清华大学与 Tripo 联合开发的 UniRig 框架&#xff0c;为这一难题提供了全新的解决方案。 什…

二分查找和二分答案(基础)

目录 前言 二分的本质 二分的代码实现 二分查找 题目 洛谷 P1571 眼红的Medusa 洛谷 P1102 A-B 数对 洛谷 P1678 烦恼的高考志愿 OpenJudge 01&#xff1a;查找最接近的元素 二分答案 实现 题目 洛谷 P1824 进击的奶牛 洛谷 P1182 数列分段 Section || 洛谷 P128…

三极管和MOS的三种状态命名的区别

前言 还记得大学用MOS做仿真&#xff0c;来进行原理说明时&#xff0c;总是会将三极管和MOS的叫法搞混。本篇文章就重新回顾&#xff0c;加深下印象。 1. 三极管&#xff08;BJT&#xff09;的三个工作状态 BJT 是电流控制型器件&#xff0c;其工作状态由 基极电流 IB​ 和 集…

SKUA-GOCAD入门教程-第八节 线的创建与编辑2

8.1.3根据线创建曲线 (1)从线生成线 这个命令可以将一组曲线合并为一条曲线。每个输入曲线都会成为新曲线内的一个部分。 1、选择 Curve commands > New > Curves 打开对话框。 图1 根据曲线创建曲线 在“name”框中:输入新建线的名称。在“Curves”框中:输入用于…

关于easyx头文件

一、窗口创建 &#xff08;1&#xff09;几种创建方式 #include<easyx.h>//easyx的头文件 #include<iostream> using namespace std;int main() {//创建一个500*500的窗口//参数为&#xff1a;长度&#xff0c;宽度&#xff0c;是否显示黑框&#xff08;无参为不…

基于VLC的Unity视频播放器(四)

上篇文章中提到的问题 播放某个m3u8地址时会嘎掉&#xff0c;想办法解决了一下&#xff0c;很粗暴的&#xff0c;先SetFormat&#xff0c;再Stop&#xff0c;最后再Play&#xff0c;能用…… if (player ! null && player.GetSize() 0) {player.GetSize((w, h) >…

邢台山峰特种橡胶制品有限公司专题报道

在河北任泽经济开发区的现代化厂房里&#xff0c;全自动硫化机正以0.01毫米的精度压制着油封。这里生产的特种橡胶制品&#xff0c;已悄然进入全球90多个国家的工业供应链。作为邢台市橡塑新材料产业集群的企业&#xff0c;邢台山峰特种橡胶制品有限公司用25项专利技术&#xf…

单文件制作工具 7.0.2.3856

【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORkoGbMcUDScW2C5kyqJla8A1?pwdegvq# 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VORkoGbMcUDScW2C5kyqJla8A1?pwdegvq# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/HPQywvPc7iLZu1…

打破 GIS 数据处理瓶颈!GISBox 的九种切片方式

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;数据格式的多样性和复杂性一直是制约高效处理与应用的瓶颈。从倾斜摄影模型到BIM设计图纸&#xff0c;从地形影像到点云数据&#xff0c;每一种数据类型都需要精准且高效的切片处理&#xff0c;以实现流畅的三维可视…

Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满!

Matlab回归预测大合集又更新啦&#xff01;新增2种高斯过程回归预测模型&#xff0c;已更新41个模型&#xff01;性价比拉满&#xff01; 目录 Matlab回归预测大合集又更新啦&#xff01;新增2种高斯过程回归预测模型&#xff0c;已更新41个模型&#xff01;性价比拉满&#xf…

中英混合编码解码全解析

qwen模型分词器怎么映射的:中英混合编码解码全解析 中英文混合编码与解码的过程,本质是 字符编码标准(如 UTF-8)对多语言字符的统一处理 ,核心逻辑围绕“字节序列 ↔ 字符映射”展开 北京智源人工智能研究院中文tokenID qwen模型分词器文件 一、编码阶段:统一转为字节序…

【散刷】二叉树基础OJ题(二)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及刷题记录&#xff0c;使用语言为C。 每道题我会给出LeetCode上的题号&#xff08;如果有题号&#xff09;&#xff0c;题目&#xff0c;以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…

深度学习与特征交叉:揭秘FNN与SNN在点击率预测中的应用

今天&#xff0c;给大家分享一篇关于基于深度神经网络&#xff08;DNNs&#xff09;的特征交叉方法——FNN&#xff08;Factorization-machine supported Neural Network&#xff09;和SNN&#xff08;Sampling-based Neural Network&#xff09;的研究。随着广告点击率预估等领…