如何在两个不同的2D坐标系之间转换?


10

我正在尝试将一个坐标系从一个坐标系转换为另一个坐标系,以便可以在图像上绘制它。

基本上,目标坐标系如下:

X range: 0 to 1066
Y range: 0 to 1600

(仅是我要绘制的标准图像,尺寸为1066 x 1600)

我尝试在图像上绘制的位置实际上具有完全相同的大小,但是坐标系不同。所有坐标的跨度为1066x1600。

但是一个坐标示例将是:

(111.33f, 1408.41f)
(-212.87f, 1225.16f)

该坐标系的范围是:

X range: -533.333 to 533.333
Y range: 533.333 to 2133.333

我觉得这是一个非常简单的数学运算,但是由于某种原因我没有理解。

如何将提供的坐标转换为第一个坐标系?


3
如果两个坐标系具有相同的基本向量,则可以简单地使用比例因子。如果它们没有相同的基本向量,则必须进行基本更改
塔拉多

Answers:


7

您可以标准化第一个值,这将为您提供[0,1]范围内的值。您可以将其视为X百分比,该百分比将值映射到最小值和最大值之间。然后,通过查看目标系统中X百分比的值,可以找到该百分比在目标坐标系中的位置。我将使用Java代码作为示例语言,但是我确信这些概念足够清晰,可以转换为任何语言。

因此规范化:

public static float normalize(float value, float min, float max) {
    return Math.abs((value - min) / (max - min));
}

使用您的示例,您将输入:

xPercent = normalize(x,0,1066);

然后找到它在目标系统中的位置。用类似的东西

destX = xPercent*(Math.abs(max-min)) + min;

或使用您的值:

destX = xPercent*(Math.abs(533.33--533.33)) + -533.33;

因此,例如,如果x值为1000,则可以将其映射到目标坐标系到467.29

或者,如果坐标系始终相同,则可以预先计算它们之间的比率。

所以:

xRatio = (Math.abs(srcMax-srcMin))/(Math.abs(destMax-destMin));

destX = x*xRatio+destMin;

为什么选择Java(C#)?他没有要求Java代码:)
kravemir,2012年

6
举个例子。它不需要按原样使用,并且这个概念很清楚。
MichaelHouse

但是如果我这样做:destX = xPercent *(Math.abs(533.33--533.33))+ -533.33; 我总是得到一个负值,结果坐标系刚好是0-1066,我应该切换所有坐标吗?
Geesu 2012年

切换到其他位置,就像在其他帖子中一样,我仍然得到dump.tanaris4.com/sota.png,也许我完全遇到了另一个问题(与C#和绘图有关)。谢谢你们!
Geesu

知道了,由于某种原因我不得不做xPercent = 1.0f-xPercent
Geesu

4

这是简单的数学运算:

res = ( src - src_min ) / ( src_max - src_min ) * ( res_max - res_min ) + res_min

src-源坐标系

res-结果协调系统

编辑-数学解释

( src - src_min ) / ( src_max - src_min )将其转换为从零开始且与源坐标系长度相等的坐标系(0.0, src_max - src_min )。然后缩放值以坐标系(0.0, 1.0)

* ( res_max - res_min ) 它将值缩放为从零开始的坐标系,结果坐标系的长度 (0.0, dst_max - dst_min)

+ res_min 将值转换为结果坐标系 (dst_min, dst_max)


我也以为这样,但是显示不正确:dump.tanaris4.com/sota.png 最终坐标应该到达白色圆圈底部的位置
Geesu 2012年

1
这根本不能解释它们的数学原理,为什么不呢?:)
MichaelHouse

@ Byte56对我来说足以理解某些公式,特别是如果它仅使用算术运算,但我为需要它的人添加了解释:)
kravemir 2012年

1
@Geesu然后,您可能正在做其他不好的事情(渲染矩阵?)。
克拉韦米尔

2
感谢您进行更新。我通常认为最好给出一个答案来解释原因。否则,您只是给出此问题的答案,而不是如何解决此问题类似问题。这是“给男人一条鱼,一条男人一条鱼”的东西。
MichaelHouse

3

二维坐标转换的基本公式(在代数中,不涉及旋转)为:

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

给定TargetCoordinate(T1,T2)中的两个点与SourceCoordinate(S1,S2)中的两个点相对应,TranslateFactorScalingFactor通过求解得到:

T1 = TranslateFactor + ScalingFactor*S1
T2 = TranslateFactor + ScalingFactor*S2

结果:

TranslateFactor = (T2*S1 - T1*S2) / (S1 - S2)
ScalingFactor   = (T2 - T1) / (S2 - S1)

您的情况,对于x坐标

S1 = 0    -> T1 = -533.333
S2 = 1066 -> T2 = 53.333

因此,

TranslateFactor = -533.333
ScalingFactor   = 1.000625
=> TargetCoordinate = (-533.333) + (1.000625)*SourceCoordinate

y坐标遵循相同的步骤


S1和S2不能具有导致被零除的相同x / y坐标。
zwcloud '16

0

做一些假设:

  • 为了方便和强大,您(最终)对矩阵实现感兴趣。和
  • 您熟悉齐次坐标。

然后问题迁移到:对于我的基数更改,同质转换矩阵是什么?

为了回答这个问题,我们首先需要对三个子问题的答案:

  1. 我的原籍搬到哪里了?
  2. 我的X轴发生了什么?令(M11,M12)为点的坐标
  3. 我的Y轴发生了什么?

将这些问题的答案定义如下:

  1. (M31,M32)是原始坐标系下新原点的坐标。
  2. (M11,M12)是原始坐标系中新单位x矢量的坐标。
  3. (M21,M22)是原始坐标系中新单位y矢量的坐标。

则同质变换矩阵为:

( M11, M12,  0 )
( M21, M22,  0 )
( M31, M32,  1 )

我的约定是点由行向量表示,这是正常的计算机图形约定;数学家和物理学家经常使用oppsoite。


坐标系可以用这样的矩阵描述:M11 = Xaxis.X,M12 = Xaxis.Y,M21 = Yaxis.X,M22 = Yaxis.Y,M31 =原点X,M32 =原点Y。给定的坐标系统矩阵A和坐标系统矩阵B,P * A *逆(B),其中P是一个点,如甲坐标的表示中,得到的点的表示形式B.坐标
吉姆巴尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.