【OCCT+ImGUI系列】012-Geom2d_AxisPlacement

news2025/6/7 9:46:28

在这里插入图片描述

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 或 Y
  if (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 或 Y
        if (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.coloradmin.cn/o/2397885.html

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

相关文章

【C++高并发内存池篇】性能卷王养成记:C++ 定长内存池,让内存分配快到飞起!

&#x1f4dd;本篇摘要 在本篇将介绍C定长内存池的概念及实现问题&#xff0c;引入内存池技术&#xff0c;通过实现一个简单的定长内存池部分&#xff0c;体会奥妙所在&#xff0c;进而为之后实现整体的内存池做铺垫&#xff01; &#x1f3e0;欢迎拜访&#x1f3e0;&#xff…

mac下通过anaconda安装Python

本次分享mac下通过anaconda安装Python、Jupyter Notebook、R。 anaconda安装 点击&#x1f449;https://www.anaconda.com/download&#xff0c; 点击Mac系统安装包&#xff0c; 选择Mac芯片&#xff1a;苹果芯片 or intel芯片&#xff0c; 选择苹果芯片图形界面安装&#x…

微软PowerBI考试 PL300-Power BI 入门

Power BI 入门 上篇更新了微软PowerBI考试 PL-300学习指南&#xff0c;今天分享PowerBI入门学习内容。 简介 Microsoft Power BI 是一个完整的报表解决方案&#xff0c;通过开发工具和联机平台提供数据准备、数据可视化、分发和管理。 Power BI 可以从使用单个数据源的简单…

逻辑回归知识点

一、逻辑回归概念 逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计方法&#xff0c;尤其适用于二分类问题。 注意: 尽管名称中有"回归"二字&#xff0c;但它实际上是一种分类算法。 解决二分类的问题。 API&#xff1a;sklearn.linear_model.Logis…

Ubuntu22.04 安装 CUDA12.8

1.下载CUDA 由于我装完 Ubuntu22.04 后就自动带了最新的显卡驱动&#xff0c;就没有再去配置驱动。 先查看驱动能支持的CUDA最高版本&#xff0c;这里显示可支持到12.8。 nvidia-smi在CUDA的 说明文档 可查看CUDA对应的驱动版本要求。 在 CUDA Toolkit Archive 查找需要的 …

Android的uid~package~pid的关系

UID &#xff1a; Linux 系统级用户标识&#xff0c;Android 中每个应用安装时分配唯一 UID&#xff08;如 1000&#xff09;。 Package&#xff1a; Android 应用包名(例如android)&#xff0c;一个 UID 可关联多个 Package&#xff08;共享 UID 场景如android:sharedUserI…

20250530-C#知识:万物之父Object

C#知识&#xff1a;万物之父Object Object类&#xff08;即object&#xff09;是所有类的基类&#xff0c;这里面的方法还是需要好好了解一下。 1、Object类 是顶级父类&#xff0c;其他类默认都是Object类的子类&#xff08;自定义类也会默认继承Object类&#xff09;可以用O…

多元素纳米颗粒:开启能源催化新纪元

在能源转型的浪潮中&#xff0c;纳米催化剂正成为推动能源技术突破的关键力量。多元素纳米颗粒&#xff08;Polyelemental Nanoparticles&#xff09;凭借其独特的元素协同效应&#xff0c;展现出在能源催化领域的巨大潜力。然而&#xff0c;合成这些复杂体系的纳米颗粒面临着诸…

分布式锁优化:使用Lua脚本保证释放锁的原子性问题

分布式锁优化&#xff08;二&#xff09;&#xff1a;使用Lua脚本保证释放锁的原子性问题 &#x1f4bb;黑马视频链接&#xff1a;Lua脚本解决多条命令原子性问题 在上一章节视频实现了一个可用的Redis分布式锁&#xff0c;采用SET NX EX命令实现互斥和过期自动释放机制&…

电脑wifi显示已禁用怎么点都无法启用

一、重启路由器与电脑 有时候&#xff0c;简单的重启可以解决很多小故障。试着先断开电源让路由器休息一会儿再接通&#xff1b;对于电脑&#xff0c;则可选择重启系统看看情况是否有改善。 二、检查驱动程序 无线网卡驱动程序的问题也是导致WiFi无法启用的常见原因之一。我…

【FPGA开发】Ubuntu16.04环境下配置Vivado2018.3—附软件包

文章目录 环境介绍关键步骤记录安装虚拟机及镜像安装vivadolicense导入 环境介绍 vivado&#xff1a;2018.3 虚拟机&#xff1a;vmware 16 pro 镜像&#xff1a;Ubuntu16.04 64位 所有相关软件压缩包&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/fd2730b46b20 提取码…

vue-seamless-scroll 结束从头开始,加延时后滚动

今天遇到一个大屏需求&#xff1a; 1️⃣初始进入页面停留5秒&#xff0c;然后开始滚动 2️⃣最后一条数据出现在最后一行时候暂停5秒&#xff0c;然后返回1️⃣ 依次循环&#xff0c;发现vue-seamless-scroll的方法 ScrollEnd是监测最后一条数据消失在第一行才回调&#xff…

0-EATSA-GNN:基于图节点分类师生机制的边缘感知和两阶段注意力增强图神经网络(code)

code:https://github.com/afofanah/EATSA-GNN. 文章目录 Abstract1. Introduction1.1.动态图场景1.2.EATSA-GNN框架的背景化2. Background2.1.GNN边缘感知挑战2.2.GNN的可解释性问题2.3.EATSA-GNN可解释性3. Related worksAbstract 图神经网络(GNNs)从根本上改变了我们处理和…

配置前端控制器

一、DispatcherServlet 详解 在使用 Spring MVC 框架构建 Web 应用时&#xff0c;DispatcherServlet是整个请求处理流程的核心。本文将深入解析DispatcherServlet的作用、工作原理及其在 Spring MVC 架构中的关键地位。 1.DispatcherServlet 是什么&#xff1f; DispatcherS…

lua注意事项

感觉是lua的一大坑啊&#xff0c;它还不如函数内部就局部变量呢 注意函数等内部&#xff0c;全部给加上local得了

Git的三种合并方式

在 Gitee&#xff08;码云&#xff09;中合并分支主要有三种方式&#xff1a;​普通合并&#xff08;Merge Commit&#xff09;、压缩合并&#xff08;Squash Merge&#xff09;​和变基合并&#xff08;Rebase Merge&#xff09;​。每种方式适用于不同的场景&#xff0c;各有…

从零到一:我的技术博客导航(持续更新)

作者&#xff1a;冰茶 最后更新&#xff1a;2025年6月3日 本文收录了我的C#编程学习心得与技术探索&#xff0c;将持续更新 前言 作为一名.NET开发者&#xff0c;C#语言的学习与探索一直是我技术成长的核心路径。本文集整理了我在C#学习过程中的思考与实践&#xff0c;希望能够…

SpringBoot整合Flowable【08】- 前后端如何交互

引子 在第02篇中&#xff0c;我通过 Flowable-UI 绘制了一个简单的绩效流程&#xff0c;并在后续章节中基于这个流程演示了 Flowable 的各种API调用。然而&#xff0c;在实际业务场景中&#xff0c;如果要求前端将用户绘制的流程文件发送给后端再进行解析处理&#xff0c;这种…

【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN

【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN 目录 【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、…

深入了解MCP基础与架构

一、引言 在人工智能技术以指数级速度渗透各行业领域的今天&#xff0c;我们正站在一个关键的技术拐点。当ChatGPT月活突破亿级、Gemini Pro实现多模态实时交互、Claude 3.5 Sonnet突破百万上下文长度&#xff0c;这些里程碑事件背后&#xff0c;一个崭新的大门逐步打开&#…