首页 文章

将坐标从一个空间转换为另一个空间

提问于
浏览
1

我似乎在这里遇到了一些数学失败...我需要将(x,y)点从一个坐标空间转换为另一个坐标空间 - 不是从极地到笛卡尔或任何类型的...从一个绑定到另一个 . 即,对于落在左下角(-100,-100)和右上角(100,100)的矩形中的特定(x,y),我需要找出该点在左下方的矩形中的位置(0 ,0)和右上角(500,500) .

我觉得这只是简单的数学,但我有一点时间做对了...

它是用java编写的一个小型计算机图形程序 . 基本上有一个更改的剪辑窗口,该剪辑窗口需要填充整个视图窗口 . 剪辑和视图的初始值由上述矩形按此顺序给出 . 但是,剪辑可以更改为例如左下角(-80,-65)和右上角(75,65)的矩形 . 然后我需要将落在该矩形内的点转换为落在视图窗口内的点(左下角(0,0),右上角(500,500))

这就是我现在所拥有的:

public int normalizeX(float x) {
    float clipWidth = clipRight - clipLeft;
    int viewWidth = viewRight - viewLeft;
    x += 100; //Get x into range [0, 200] instead of [-100, 100]
    //First convert x to value within clip width, then "scale" to viewport width
    return (int)(((clipWidth*x)/200) * (viewWidth/clipWidth));
}

public int normalizeY(float y) {
    float clipHeight = clipTop - clipBottom;
    int viewHeight = viewTop - viewBottom;
    y += 100; //Get y into range [0, 200] instead of [-100, 100]
    //First convert y to value within clip height, then "scale" to viewport height
    return (int)(((clipHeight*y)/200) * (viewHeight/clipHeight));
}

谢谢你的帮助!

4 回答

  • 0

    假设您的旧边界是 xLoOldxHiOld (在您的示例中分别为-80和75),并且您的新边界是 xLoNewxHiNew (在您的示例中分别为0和500),那么您可以将 xOld 规范化为新坐标像这样的系统:

    xNew = (xOld-xLoOld) / (xHiOld-xLoOld) * (xHiNew-xLoNew) + xLoNew
    

    同样的事情 .

  • 4

    这样的事可能会对你有所帮助 .

    public static float scale(
               float x,
               float old_min, float old_max,
               float new_min, float new_max)
        {
            float old_range = old_max - old_min;
            float new_range = new_max - new_min;
            return new_min + (x - old_min) * new_range / old_range;
        }
    

    您需要在两个维度中缩放坐标 . 我遗漏了其他计算,例如转换为int等 .

    我还建议创建合适的类型,如 RegionRectangle ,以简化您的代码,至少减少此函数的参数数量 .

  • 2

    简单地说:你想要一个将-100映射到0和100到500的变换 . 或者盲目地将范围[-100,100]映射到范围[0,500]:

    [-100, 100] ----> [0, 500]
    

    第一步是将范围[-100,100]转换为[0,200]:

    x ----> x + 100
    

    下一步是将范围[0,200]转换为[0,500]

    x ----> x * 500 / 200 = 2.5 * x
    

    好的,你的转型就读了

    x ----> 2.5 * (x + 100)
    

    同样对于y:

    y ----> 2.5 * (y + 100).
    

    希望这表明,并且您将能够在更复杂的情况下重用逻辑 .

  • 2

    这种光滑而通用的方法是使用仿射变换 . 你将有一个2 x 2矩阵(称之为A),它表征原始字段到第二个字段的“伸展性”,以及表征偏移量的2 x 1矩阵(称之为b) .

    然后,使用x作为(2 x 1)输入,y作为(2 x 1)输出,它只是y = Ax b .

    该技术还可以让你做更多的事情(比如旋转),但那些对你的应用程序来说可能并不重要 .

    http://en.wikipedia.org/wiki/Affine_transformation

相关问题