Bernd 发表于 2018-3-19 05:51:45

赫尔默特变换

您好,
我想将变换应用于图形(从德国高卢-克鲁格到UTM)。参数为:
比例因子0.9996
旋转0.000006
位移28999941.883,-1729.851
如何构造矩阵来变换图形元素
我尝试了:
平移向量的原点
Point3d Center新建:平移向量的目标
双旋转:以弧度为单位双缩放因子*/
var矩阵=矩阵x3d。位移(新中心-旧中心)
矩阵*=Matrix3d。缩放(scaleFactor,centerNew)
矩阵*=Matrix3d。旋转(旋转,新矢量3D(0,0,1),新中心)
<div>//然后…</div<
实体。TransformBy(矩阵)

显然,这种转换是不正确的(X方向大约13公里,Y方向非常接近)。
有什么想法吗?
**** Hidden Message *****

MickD 发表于 2018-3-19 07:14:48

旋转可能是弧度吗?
此外,在乘法矩阵时,每个变换的顺序非常重要。

Bernd 发表于 2018-3-19 08:19:15

旋转以弧度为单位提供。
我是这么想的,但我不确定以哪种顺序应用参数。当我做三个单独的转换(实体。TransformBy(Matrix3d.Scaling(...)),然后是 TransformBy。(Matrix3d.Rotation(...)), ...)一切都很好,但我想避免这种情况。

MickD 发表于 2018-3-19 16:06:54


我也是这么想的,因为当你把一个位移乘以一个标量时,所有的位移数都会乘以那个标量!
我会按照这个顺序尝试:标量/旋转/位移
如果你必须将它们分开,那么我认为你只需要先处理标量本身。

MickD 发表于 2018-3-19 16:27:41


只是重新考虑一下你的评论。
如果它有效,我看不出它有什么问题,并且有一些关于顺序的评论,它会更容易维护。虽然它可能_seem_技术上更优雅,但我怀疑保存的时钟周期最终会有什么真正的不同

Bernd 发表于 2018-3-19 17:04:32

你当然是对的。尽管如此,我想了解
我必须做些什么
才能在一步中应用转换(我知道我有时会很烦人)。

MickD 发表于 2018-3-19 17:14:18


不!所有的好处
诀窍在于思考每个xform都在做什么,以及生成的数字是什么样子。例如,在centerOld(当前中心?)它会在现场稍微收缩耳鼻喉科,然后你可以使用相同的中心线旋转它,并在现场旋转它,所以我认为数字会很好。现在,您可以沿矢量将其置换为centerNew,该矢量再次仅平移(缩放)每个三维轴的编号<矩阵中每个轴的所有数字实际上都是应用于每个轴的单位向量的缩放器

Bernd 发表于 2018-3-19 17:24:30

Ooookay - 我看到
我想我之前尝试过缩放*旋转*位移的组合,但我明天会再试一次 - 感谢您的耐心(不是开玩笑)。

MickD 发表于 2018-3-19 17:29:41

Ooookay -我明白了
我认为我以前尝试过缩放*旋转*位移的组合,但我明天会再试一次-感谢您的耐心(不是开玩笑)。

请记住使用正确的中心!(即当前的“旧”版本)
干杯。

MickD 发表于 2018-3-20 13:37:41

要了解真正的情况,请查看这个链接,它讨论了矩阵乘法的性质,并特别考虑了非交换性质,A*B!=B*A和结合性质(A*B)*C=A*(B*C)
现在考虑一下,你要用矩阵S、R和T来缩放、旋转、平移一个点P
将其作为3个独立的运算来运行,相当于((P*S)*R)*T,因此预先计算S*R*T的组合矩阵,然后将P乘以该矩阵也是一样的。
页: [1] 2
查看完整版本: 赫尔默特变换