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

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); //copyTopoDS_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.mzph.cn/web/3810.shtml

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

相关文章

Android11 SystemUI clock plugin 插件入门

插件的编写 参照ExamplePlugin&#xff0c;需要系统签名。 需要先编译以下模块得到jar&#xff0c;引用在项目中。 m SystemUIPluginLibcom.android.systemui.permission.PLUGIN PluginManager.addPluginListener SystemUI 是如何发现 clock plugin 的&#xff1f; Syste…

FDY10蓄电池容量检测仪

FDY10-H说明书2013 08.pdf (book118.com)https://max.book118.com/html/2017/0510/105769526.shtm FDY10用户手册 - 百度文库 (baidu.com)https://wenku.baidu.com/view/22e7fe672d3f5727a5e9856a561252d380eb20ac?aggId28d62908f12d2af90242e62a&frcatalogMain_graph_v10…

ThingsBoard处理设备上报的属性并转换为可读属性

一、前言 二、案例 1、AI生成JSON数据体 2、将json数据体直接通过遥测topic发送查看效果 3、可查看目前整个数据都在一起 ​编辑 4、配置附规则链路 5、对msg的消息值&#xff0c;进行数据的转换&#xff0c;并从新进行赋值。 6、规则链路关联关系 7、再次通过MQTT发送遥…

【数据结构与算法】力扣 459. 重复的子字符串

题目描述 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "aba" 输出: false示例 3: 输入: s "abcabc…

WebGIS

文章目录 GIS的全名是Geographic Information System&#xff0c;中文全名是地理信息系统。 它是在计算机硬、软件系统支持下&#xff0c;对整个或部分地球表层&#xff08;包括大气层&#xff09;空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术…

详解23种设计模式——单例模式

单例模式 | CoderMast编程桅杆单例模式 单例模式是最常用的设计模式之一&#xff0c;他可以保证在整个应用中&#xff0c;某个类只存在一个实例化对象&#xff0c;即全局使用到该类的只有一个对象&#xff0c;这种模式在需要限制某些类的实例数量时非常有用&#xff0c;通常全局…

【GitHub】如何在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰

【GitHub】如何在github上提交PR(Pull Request 写在最前面1. 准备工作1.1 注册 GitHub 账号1.2 了解 Git 基础1.3 找到一个项目 2. 创建你的 PR2.1 Fork 和克隆仓库2.2 创建一个新的分支2.3 进行更改2.4 推送更改到 GitHub2.5 创建 Pull Request 3. 优化你的 PR3.1 保持提交清晰…

基于VMD-CNN-BiLSTM-Attention组合模型时间序列预测

VMD-CNN-BiLSTM-Attention组合模型是一种复杂的神经网络结构&#xff0c;用于时间序列预测。让我逐步解释这个模型的每个组成部分以及它们是如何结合在一起的&#xff1a; VMD&#xff08;Variational Mode Decomposition&#xff09;&#xff1a;VMD是一种信号处理技术&#x…

Python、Django和MySQL框架的开源项目中值得学习和借鉴的项目

在Python、Django和MySQL框架的开源项目中&#xff0c;有很多值得学习和借鉴的项目。这些项目不仅可以帮助你了解如何使用这些技术栈进行开发&#xff0c;还能为你提供实践经验和灵感。以下是一些基于PythonDjangoMySQL框架的开源项目示例&#xff1a; Django博客系统&#xff…

【MySQL】DML

1、DML简介 DML&#xff08;Data Manipulation Language、数据操作语言&#xff09;&#xff0c;用于添加、删除、更新和查询数据库记录&#xff0c;并检查数据完整性。 2. 添加数据 2.1 使用关键字 使用 INSERT 语句向表中插入数据。使用 VALUES语句添加 2.2 使用情况 2.2…

JetBot手势识别实验

实验简介 本实验目的在JetBot智能小车实现手势识别功能&#xff0c;使用板卡为Jetson Nano。通过小车摄像头&#xff0c;识别五个不同的手势&#xff0c;实现小车的运动及灯光控制。 1.数据采集 连接小车板卡的Jupyterlab环境&#xff0c;运行以下代码块&#xff0c;配置数据…

Vitis HLS 学习笔记--C/C++ static 关键字的作用

目录 1. 简介 2. c/c共有性质 3. c独有性质 4. 示例说明 5. static 对于 HLS 工具的影响 6. 总结 1. 简介 在Vitis HLS中&#xff0c;偶尔会用到 static 关键字。考虑到Vitis HLS同时兼容C和C语言&#xff0c;有必要理解这两种语言中static关键字细微差异。本文旨在梳理…

靠近特定对象才可使用法术

实现目标 只有靠近特定creature | gameobject 才能使用特定技能&#xff0c;否则技能无法使用 实现方法 conditions SourceTypeOrReferenceId&#xff1a;17&#xff08;CONDITION_SOURCE_TYPE_SPELL&#xff09;SourceGroup&#xff1a;0SourceEntry&#xff1a;技能ID&am…

Linux cmake 初窥【1】

1.开发背景 linux 下编译程序需要用到对应的 Makefile&#xff0c;用于编译应用程序&#xff0c;但是 Makefile 的语法过于繁杂&#xff0c;甚至有些反人类&#xff0c;所以这里引用了cmake&#xff0c;cmake 其中一个主要功能就是用于生成 Makefile&#xff0c;cmake 的语法更…

常见的css面试题(持续更新,欢迎补充)

目录 1. 什么情况下设置margin会造成margin塌陷? 怎么解决&#xff1f; 2. css的选择器的优先级&#xff0c;怎么判断谁的优先级更高&#xff1f; 总结面试常问的css相关面试题~ 1. 什么情况下设置margin会造成margin塌陷? 怎么解决&#xff1f; 通常遇见margin塌陷&…

AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?

AIGC的概念 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;的概念主要是指人工智能生成内容。 这是一种新的人工智能技术&#xff0c;它利用人工智能模型&#xff0c;根据给定的主题、关键词、格式、风格等条件&#xff0c;自动生成各种类型的文本、图…

Maya vs Blender:制作3D动画首选哪一个?

就 3D 动画而言&#xff0c;有两款3D软件引发了最多的争论&#xff1a;Blender 与 Maya。这两个强大的平台都提供强大的工具集&#xff0c;使动画故事和角色栩栩如生。但作为一名3D动画师&#xff0c;您应该投入时间学习和创作哪一个呢&#xff1f;下面我将从以下六点给您一个清…

SQL优化——全自动SQL审核

文章目录 1、抓出外键没创建索引的表2、抓出需要收集直方图的列3、抓出必须创建索引的列4、抓出SELECT * 的SQL5、抓出有标量子查询的SQL6、抓出带有自定义函数的SQL7、抓出表被多次反复调用SQL8、抓出走了FILTER的SQL9、抓出返回行数较多的嵌套循环SQL10、抓出NL被驱动表走了全…

数据输出(进制、小数位,左对齐右对齐

#include <stdio.h> int main() {int a041; printf("%d\n",a);//33printf("%o\n",a);//41 %o输出八进制&#xff0c;开头不加0printf("%x\n",a);//21 %x输出十六进制&#xff0c;开头不加0Xprintf("%#o\n",a);//…

React学习day01--虚拟DOM的两种创建方式

一、使用js的方式创建虚拟DOM 使用js这种创建虚拟DOM的方式相对jsx来说是繁琐的&#xff0c;如果标签是深层次嵌套&#xff0c;那么书写非常耗时且麻烦。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta …