【问题标题】:Converting between square and rectangular pixel co-ordinates在正方形和矩形像素坐标之间转换
【发布时间】:2012-03-16 21:11:51
【问题描述】:

我是使用变换和此类数学的新手,希望能在某些方向上解决我的编码问题。我正在为 iphone 编写 XCode,并且正在使用 CGraphics。

问题: 在 Xcode 中,我想在正方形像素的屏幕上绘制曲线、线条等。 然后将这些点尽可能接近地转换为非方形像素系统。

例如,如果原始坐标系是 500 x 500 像素,显示在 10 x 10 英寸的方形屏幕上,我会使用圆形公式绘制一个圆形。它看起来很圆,一切都很好。

现在,我在 850 x 500 像素的第二个 10 x 10 英寸屏幕上绘制相同的圆圈。在不更改坐标的情况下,相同的圆形公式会显示一些看起来像鸡蛋的东西。

如何在第二个屏幕上以不同的坐标系绘制圆?此外,我需要单独访问一组点 x,y 系统。

s

【问题讨论】:

    标签: iphone math graphics


    【解决方案1】:

    这是一个将世界坐标转换为屏幕坐标的简单问题。

    我知道最初的问题是关于圆的,但为了更简单的伪代码和数学示例,我将使用 square。

    考虑一个简单的示例,您将在世界坐标中绘制一个已建模为一个角在[0, 0] 和对角在[1, 1] 的正方形。您希望在第一个示例屏幕(每个维度上的像素从 0 到 500 延伸)上看到的是像素空间中的一个角在 [0, 0] 和另一个在 [500, 500]

    这是一个简单的矩阵变换,称为scale matrix。简而言之,您需要的比例矩阵将在每个对角线条目上具有相同的比例因子,并且在其他任何地方都为零。写成伪代码(使用*作为matrix-vector multiplication operation),我们可以说:

    worldCorner0 = {0, 0};
    scaleMatrix = {500, 0,
                   0, 500};
    pixelCorner0 = scaleMatrix * worldCorner0;
    
    worldCorner1 = {1, 1};
    pixelCorner1 = scaleMatrix * worldCorner1;
    

    结果将是pixelCorner0 = {0, 0}pixelCorner1 = {500, 500}

    现在,在您的另一个示例中,您有一个非方形屏幕,但您仍想绘制方形而不失真。您仍然需要一个比例矩阵,但如果您想在屏幕上看到整个正方形,您应该继续按屏幕尺寸中的最少 个像素进行缩放。如果您使用较大的数字,则正方形会延伸到可见区域之外(但仍然是正方形)。

    在您的情况下,第二个屏幕在一个维度上的最大范围为 800 像素,在另一个维度上为 500 像素。方便的是,您已经有了一个缩放 500 像素的比例矩阵。如果您绘制上述那些像素角,您将保留您的几何图形,而不管您的屏幕尺寸如何。

    【讨论】:

      【解决方案2】:

      你需要一个仿射变换,一个简单的,只是缩放。请参阅 2D 图形中的示例 部分下的 Wikipedia,并且您需要缩放片段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-17
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多