Open CASCADE学习|一个点的坐标变换

news2024/12/24 21:14:33

gp_Trsf 类是 Open CASCADE Technology (OCCT) 软件库中的一个核心类,用于表示和操作三维空间中的变换。以下是该类的一些关键成员和方法的介绍:

成员变量:

scale: Standard_Real 类型,表示变换的缩放因子。

shape: gp_TrsfForm 类型,定义变换的形式,如平移、旋转等。

matrix: gp_Mat 类型,是一个 3x3 矩阵,表示变换的矢量部分,包括缩放。

loc: gp_XYZ 类型,表示变换的平移部分。

方法:

gp_Trsf(): 构造函数,创建一个默认的变换(通常是单位变换)。

SetMirror(const gp_Pnt& theP): 设置关于点的对称变换。

SetRotation(const gp_Ax1& theA1, const Standard_Real theAng): 设置绕轴线的旋转变换。

SetRotation(const gp_Quaternion& theR):设置使用四元数定义的旋转变换。

SetRotationPart(const gp_Quaternion& theR): 替换变换的旋转部分。

SetScale(const gp_Pnt& theP, const Standard_Real theS): 设置缩放变换。

SetDisplacement(const gp_Ax3& theFromSystem1, const gp_Ax3& theToSystem2): 设置从一个坐标系统到另一个坐标系统的变换。

SetTransformation(const gp_Ax3& theFromSystem1, const gp_Ax3& theToSystem2): 设置两个坐标系统之间的变换。

SetTransformation(const gp_Quaternion& R, const gp_Vec& theT): 通过指定的旋转和位移直接设置变换。

SetTranslation(const gp_Vec& theV): 设置向量平移变换。

SetTranslation(const gp_Pnt& theP1, const gp_Pnt& theP2): 设置通过两个点确定的向量平移变换。

SetTranslationPart(const gp_Vec& theV):替换变换的平移部分。

SetScaleFactor(const Standard_Real theS): 修改缩放因子。

SetValues(...): 直接设置变换矩阵的系数。

IsNegative(): 检查变换的行列式是否为负。

Form(): 获取变换的形式。

ScaleFactor(): 获取缩放因子。

TranslationPart(): 获取平移部分。

GetRotation(gp_XYZ& theAxis, Standard_Real& theAngle): 获取旋转轴和角度。

GetRotation(): 获取表示旋转部分的四元数。

VectorialPart(): 获取变换的矢量部分。

HVectorialPart(): 获取变换的齐次矢量部分。

Value(const Standard_Integer theRow, const Standard_Integer theCol): 获取变换矩阵的元素。

Invert(): 求变换的逆。

Inverted(): 返回变换的逆。

Multiplied(const gp_Trsf& theT): 与另一个变换相乘。

operator *(const gp_Trsf& theT): 重载乘法运算符。

Multiply(const gp_Trsf& theT): 将当前变换与另一个变换相乘。

PreMultiply(const gp_Trsf& theT): 将另一个变换与当前变换相乘。

Power(const Standard_Integer theN): 对变换进行求幂操作。

Powered(const Standard_Integer theN): 返回变换的幂。

Transforms(Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ): 应用变换到一个点。

Transforms(gp_XYZ& theCoord): 应用变换到一个 gp_XYZ 对象。

GetMat4(NCollection_Mat4<T>& theMat): 将变换转换为 4x4 矩阵。

DumpJson(Standard_OStream& theOStream, Standard_Integer theDepth): 将变换内容输出为 JSON 格式。

InitFromJson(const Standard_SStream& theSStream, Standard_Integer& theStreamPos): 从 JSON流初始化变换。

#include <BRepBuilderAPI_MakeVertex.hxx>
#include <TopoDS_Vertex.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS.hxx>
​
int main(int argc, char* argv[])
{
    gp_Mat M;
    gp_Vec V;
    gp_Trsf dv;//默认是恒等变换
    gp_Trsf myTrsf;//默认是恒等变换
    gp_Pnt p0(3,4, 5);//待变换的点
    dv.SetValues(1, 0, 0, 1,
        0, 1, 0, 2,
        0, 0, 1, 3);//平移变换
​
    dv.Multiply(myTrsf);//变换矩阵相乘
    //通过API进行坐标变换
    TopoDS_Shape out = BRepBuilderAPI_Transform(BRepBuilderAPI_MakeVertex(p0), dv, Standard_True); //copy
    TopoDS_Vertex anVertex = TopoDS::Vertex(out);
    gp_Pnt p1 = BRep_Tool::Pnt(anVertex);
    //通过公式进行坐标变换
    Standard_Real x = p0.X() * dv.Value(1, 1) + p0.Y() * dv.Value(1, 2) + p0.Z() * dv.Value(1, 3) + dv.Value(1, 4);
    Standard_Real y = p0.X() * dv.Value(2, 1) + p0.Y() * dv.Value(2, 2) + p0.Z() * dv.Value(2, 3) + dv.Value(2, 4);
    Standard_Real z = p0.X() * dv.Value(3, 1) + p0.Y() * dv.Value(3, 2) + p0.Z() * dv.Value(3, 3) + dv.Value(3, 4);
    //打印坐标变换结果
    std::cout <<  "x=" << x <<"  " << "y=" << y << "  " << "z=" << z << "  " << std::endl;
    std::cout << "p1.X()=" << p1.X() << "  " << "p1.Y()=" << p1.Y() << "  " << "p1.Z()=" << p1.Z() << "  " << std::endl;
    return 0;
}
​

x=4y=6  z=8

p1.X()=4p1.Y()=6  p1.Z()=8

以下代码首先创建了一个三维点,然后创建了一个 gp_Trsf 变换对象,并分别设置了旋转、平移和缩放变换。每次变换后,代码都打印出变换后的点的坐标。

#include <gp_Trsf.hxx>
#include <gp_Pnt.hxx>
#include <gp_Ax1.hxx>
​
int main() {
    // 创建一个点
    gp_Pnt point(1.0, 2.0, 3.0);
    std::cout << "Original point: " << point.X() << ", " << point.Y() << ", " << point.Z() << std::endl;
​
    // 创建一个变换对象
    gp_Trsf transformation;
​
    // 设置一个旋转变换,绕 Z 轴旋转 PI/2 弧度(90 度)
    gp_Ax1 axis(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1));
    transformation.SetRotation(axis, M_PI / 2);
​
    // 应用变换到点
    gp_Pnt transformedPoint = point.Transformed(transformation);
    std::cout << "Transformed point after rotation: " << transformedPoint.X() << ", "
        << transformedPoint.Y() << ", " << transformedPoint.Z() << std::endl;
​
    // 设置一个平移变换,沿着 X 轴移动 5 个单位
    transformation.SetTranslation(gp_Vec(5, 0, 0));
​
    // 再次应用变换到点
    transformedPoint = point.Transformed(transformation);
    std::cout << "Transformed point after translation: " << transformedPoint.X() << ", "
        << transformedPoint.Y() << ", " << transformedPoint.Z() << std::endl;
​
    // 设置一个缩放变换,缩放因子为 2,中心为点 (1, 1, 1)
    gp_Pnt scaleCenter(1, 1, 1);
    transformation.SetScale(scaleCenter, 2.0);
​
    // 应用变换到点
    transformedPoint = point.Transformed(transformation);
    std::cout << "Transformed point after scaling: " << transformedPoint.X() << ", "
        << transformedPoint.Y() << ", " << transformedPoint.Z() << std::endl;
​
    return 0;
}
​

Original point: 1, 2, 3

Transformed point after rotation: -2, 1, 3

Transformed point after translation: 6, 2, 3

Transformed point after scaling: 1, 3, 5

       

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

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

相关文章

有哪些人工智能/数据分析领域可以考取的证书?

一、TensorFlow谷歌开发者认证 TensorFlow面向学生、开发者、数据科学家等人群&#xff0c;帮助他们展示自己在用 TensorFlow 构建、训练模型的过程中所学到的实用机器学习技能。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; TensorFlow 的产品总监 …

12.6.1 实验5:IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

在VSCode中调试其他软件执行的python文件

在VSCode中调试其他软件执行的python文件 0. 实际场景 我有一段python代码想在Metashape中运行&#xff0c;但是又想在中间某一步停下来查看变量值。由于Metashape的python环境不容易在vscode中配置&#xff0c;所以直接用vscode调试单个文件的方式无法实现这个想法。还好&am…

hanoi塔

hanoi塔问题&#xff1a; 1.规则&#xff1a;一次移动一个盘子&#xff0c;小盘子压大盘子上面&#xff0c;有A、B、C三个柱子&#xff0c;A是起始放盘子的柱子&#xff0c;B是中间可以借助的柱子&#xff0c;C是最后放盘子的位置 2.简单思路&#xff1a; 如果有1个盘子&…

2024高级卫生职称考试报名时间汇总

20地报名时间汇总&#xff0c;其他时间安排见图 上海&#xff1a;4.23-5.24 黑龙江&#xff1a;4.23-5.24 陕西&#xff1a;4.23-5.24 重庆&#xff1a;4.23-5.24 浙江&#xff1a;4.23-5.24 20地报名时间汇总 甘肃&#xff1a;4.23-5.24 江西&#xff1a;4.28-5.10 河北&#…

locust2.0+教程:016 - 结合ssh压测shell命令

简介&#xff1a;Locust是一个Python编写的开源性能测试工具&#xff0c;它可以通过编写Python代码来模拟用户行为并进行压力测试。虽然Locust本身不直接支持对shell或者SSH进行压测&#xff0c;但可以编写自定义的插件或者使用第三方库来实现这样的功能。如果想要通过SSH进行压…

03-JAVA设计模式-备忘录模式

备忘录模式 什么是备忘录模式 Java中的备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便以后可以将对象恢复到原先保存的状态…

迪拜之行回顾:CESS 的 DePIN 创新之旅

迪拜最近是一个关键热词&#xff0c;成为了一系列 Web3 和加密活动的中心&#xff0c;吸引了行业领导者、创新者和爱好者&#xff0c;探索区块链和去中心化技术的最新发展。从 4 月中旬&#xff0c;一系列行业会议和活动陆续举行&#xff0c;吸引了一众与会者。然而暴雨积水又成…

iframe实现pdf预览,并使用pdf.js修改内嵌标题,解决乱码问题

项目中遇到文件预览功能,并且需要可以打印文件.下插件对于内网来说有点麻烦,正好iframe预览比较简单,且自带下载打印等功能按钮. 问题在于左上方的文件名乱码,网上找了一圈没有看到解决的,要么就是要收费要会员(ztmgs),要么直接说这东西改不了. 使用: 1.引入 PDF.js 库&…

OpenCV实现霍夫变换

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 如何实现边缘检测器 下一篇 :OpenCV 实现霍夫圆变换 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 HoughLines()和 HoughLinesP()检测图像中的线条。…

云赛道---人工智能概述(重点总结)决赛准备

1、人工智能的一个比较流行的定义&#xff0c;也是该领域较早的定义&#xff0c;是由约翰 麦卡锡&#xff08; John McCarthy| &#xff09;在 1956 年的达特矛斯会议&#xff08; Dartmouth Conference &#xff09;上提出的&#xff1a;人工 智能就是要让机器的行为看起来…

书生·浦语 大模型(学习笔记-5)XTuner 微调 LLM:1.8B、多模态、Agent

目录 一&#xff1a;两种微调 二、数据的一生 三、微调方案 四、XTuner 五、InternLM2 1.8B模型&#xff08;相关知识&#xff09; 一&#xff1a;两种微调 增量与训练和指令微调的区别 二、数据的一生 原始数据转换为标准格式数据 添加对话模板&#xff0c;直接调用即可…

【Ajax-异步刷新技术】什么是Ajax之续章 !

文章目录 Ajax第五章1、layui的后台布局2、layui的数据表格1、在jsp页面中编写table2、在页面中引入文件3、编写代码4、参照文档修改表格属性 **3、最终效果** 第六章1、继续第五章内容1、layui组件2、添加数据3、查看数据4、修改数据5、删除数据 2、批量删除核心 3、数据表格重…

C++ 核心编程 - 内存分区模型

文章目录 1.1 程序运行前1.2 程序运行后1.3 new 操作符 C 程序在执行时&#xff0c;将内存大致划分为 4个区域&#xff1a; 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理&#xff1b;全局区&#xff1a;存放全局变量和静态变量以及常量&#xff1…

新媒体运营-----短视频运营-----PR视频剪辑----软件基础

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1.1 PR软件重置与初始化设置1.2 新建项目及序列设置1.3 PR工作区的管理方法1.4 导入4K超高清视频并与ME配合工作1…

Unity 按下Play键后,Scene View里面一切正常,但是Game View中什么都没有 -- Camera Clear Flags的设置

问题如下所示。 最先遇到这个问题是我想用Unity开发一个VR 360-degree Image Viewer。在Scene View中可以看到球体&#xff0c;但是Game View什么都看不到。最后找到的原因是&#xff0c;我使用的shader是Skybox/Panorama&#xff0c; 需要把Main Camera的Clear Flags设置成Do…

FPGA实现AXI4总线的读写_如何写axi4逻辑

FPGA实现AXI4总线的读写_如何写axi4逻辑 一、AXI4 接口描述 通道信号源信号描述全局信号aclk主机全局时钟aresetn主机全局复位&#xff0c;低有效写通道地址与控制信号通道M_AXI_WR_awid[3:0]主机写地址ID&#xff0c;用来标志一组写信号M_AXI_WR_awaddr[31:0]主机写地址&…

mongodb使用debezium

前置 服务器上需要安装jdk11 jdk下载地址 kafka安装 官网下载地址 安装教程 debezium 安装 运行 Debezium 连接器需要 Java 11 或更高版本 Debezium 并不是一个独立的软件&#xff0c;而是很多个 Kafka 连接器的总称。这些 Kafka 连接器分别对应不同的数据库&#xff0c;…

6、ES单机设置用户名密码、集群设置用户名密码、es-head登录、如何去掉密码

目录 一、ES单节点密码配置1、修改配置文件2、 重启es服务3&#xff0c;执行修改密码命令4、访问服务 二、ES集群密码配置1、确定主节点2、生成elastic-stack-ca.p123、生成elastic-certificates.p124、修改配置文件并重启集群5、进行密码配置6、验证 三、es-head登录增加密码的…

串口调速小车1

1. 让小车动起来 智能小车1-智能小车的初认识_void motor-CSDN博客 接线 B-1A -- PB0 B-1B -- PB1 A-1A -- PB2 A-1B -- PB10 CubeMx 1.常规配置 SYS->Debug->Serial Wire RCC->High Speed Clock(HSE)->Crystal/Ceramic Resonator 时钟树HSE、PLLCLK打开…