在正方形和矩形像素坐标之间转换

时间:2010-03-28 22:15:14

标签: iphone math graphics

我是使用变换和这种类型的数学的新手,并且会欣赏解决我的编码问题的方向。我正在用XCode编写iphone,并正在使用CGraphics。

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

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

现在,我在第二个10 x 10英寸屏幕上绘制相同的圆圈,该屏幕为850像素×500像素。在不改变坐标的情况下,相同的圆形表格显示看起来像蛋的东西。

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

s

2 个答案:

答案 0 :(得分: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像素的比例矩阵。如果您绘制上述pixelCorners,无论屏幕尺寸如何,您都将保留几何体。

答案 1 :(得分:0)

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