这是一个将世界坐标转换为屏幕坐标的简单问题。
我知道最初的问题是关于圆的,但为了更简单的伪代码和数学示例,我将使用 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 像素的比例矩阵。如果您绘制上述那些像素角,您将保留您的几何图形,而不管您的屏幕尺寸如何。