Math 改变坐标系统

Math 改变坐标系统,math,geometry,c++-cli,gdi+,gdi,Math,Geometry,C++ Cli,Gdi+,Gdi,(来源:) 我需要使用system::Drawing::Drawing2D(即GDI+)从上面显示的XY坐标系切换到X'Y'坐标系。这就是我的想法: float rotation = // +90 below is because AB is the new vertical... Math::Atan2(pB.Y - pA.Y, pB.X - pA.X) * 180.0 / Math::PI + 90.0f; Matrix m; m.Transl


(来源:)

我需要使用system::Drawing::Drawing2D(即GDI+)从上面显示的XY坐标系切换到X'Y'坐标系。这就是我的想法:

float rotation =                    // +90 below is because AB is the new vertical...
    Math::Atan2(pB.Y - pA.Y, pB.X - pA.X) * 180.0 / Math::PI + 90.0f;

Matrix m;
m.Translate(pA.X, pA.Y);
m.Rotate(rotation);
m.Invert();

array<PointF> points = gcnew array<PointF>{ pC };
m.TransformPoints(points);
下面的浮动旋转=//+90是因为AB是新的垂直。。。 数学::Atan2(pB.Y-pA.Y,pB.X-pA.X)*180.0/数学::PI+90.0f; 矩阵m; m、 翻译(pA.X,pA.Y); m、 旋转(旋转); m、 倒置(); 数组点=gcnew数组{pC}; m、 转换点(点);
有没有一种方法可以在最小化舍入误差的同时做到这一点?我能在这里避免调用
Atan2
(或其他逆三角函数)吗?

我不熟悉gdi+,但原则上,您可以在不使用逆触发或运算符反转的情况下执行此操作。(我说“运算符反转”而不是“矩阵反转”,因为这个矩阵在我看来不像矩阵。)

首先,您应该能够通过更改定义运算符的方式来避免矩阵反转。这是一个盲目的尝试:

Matrix m;
m.Rotate(-rotation);
m.Translate(-pA.X, -pA.Y);
对于旋转本身,通常的方法是使用如下矩阵:

cos(theta)  -sin(theta)
sin(theta)   cos(theta)
你用atan(y/x)计算θ。但是如果你想要的是正反两个,你可以将x和y归一化并直接使用它们:

x  -y
y   x

不需要atan。事实上,根本就没有三叉戟

我不熟悉gdi+,但原则上,您可以在不使用反转触发器或运算符反转的情况下执行此操作。(我说“运算符反转”而不是“矩阵反转”,因为这个矩阵在我看来不像矩阵。)

首先,您应该能够通过更改定义运算符的方式来避免矩阵反转。这是一个盲目的尝试:

Matrix m;
m.Rotate(-rotation);
m.Translate(-pA.X, -pA.Y);
对于旋转本身,通常的方法是使用如下矩阵:

cos(theta)  -sin(theta)
sin(theta)   cos(theta)
你用atan(y/x)计算θ。但是如果你想要的是正反两个,你可以将x和y归一化并直接使用它们:

x  -y
y   x

不需要atan。事实上,根本就没有三叉戟

@Rowland,你现在看到图像了吗?我现在可以——你看到的舍入误差有多大?没什么大不了的。我还没有看到实际值。但当我放大某些角时,相邻的矩形显示它们之间的小重叠或间隙。嗯,这可以通过改变或避免旋转计算来最小化。这可能是你如何渲染的人工制品?我在地理信息系统中也看到过类似的情况,两个多边形共享一条边,但由于渲染对角线时使用的算法,会出现小间隙。@罗兰,你现在看到图像了吗?我现在可以——你看到的舍入误差有多大?没什么大不了的。我还没有看到实际值。但当我放大某些角时,相邻的矩形显示它们之间的小重叠或间隙。嗯,这可以通过改变或避免旋转计算来最小化。这可能是你如何渲染的人工制品?我在地理信息系统中也看到过类似的情况,两个多边形共享一条边,但由于渲染对角线时使用的算法,会出现小间隙。我想你的意思是“规格化”(pB pA),而不是“规格化x和y”。@Beta,但“规格化x和y”是间接三角,不是吗?@Vulcan:No;如果
v=(pB-pA)
,只需将
v.x
v.y
除以v的长度(
v.length=sqrt(v.x^2+v.y^2)
)@BlueRaja-Danny pflughoft:是的,我说话不小心,我应该说“normalize(pB-pA)”或“normalize
[xy]
”之类的话。谢谢。答案被接受。然而,我正在用平方根运算(计算长度)替换trig函数,这同样昂贵。有可能避免平方根吗?我想你的意思是规范化(pB pA),而不是规范化x和y。@Beta,但是规范化x和y是间接触发,不是吗?@Vulcan:No;如果
v=(pB-pA)
,只需将
v.x
v.y
除以v的长度(
v.length=sqrt(v.x^2+v.y^2)
)@BlueRaja-Danny pflughoft:是的,我说话不小心,我应该说“normalize(pB-pA)”或“normalize
[xy]
”之类的话。谢谢。答案被接受。然而,我正在用平方根运算(计算长度)替换trig函数,这同样昂贵。可以避免平方根吗?