c++ - 在笛卡尔坐标和屏幕坐标之间转换

标签 c++ algorithm math coordinates coordinate-systems

对于我的游戏,我需要在两个坐标系之间转换的函数。好吧,这主要是数学问题,但我需要的是 C++ 代码来完成它,以及如何解决我的问题的一些解释。

屏幕坐标:

a) 左上角为 0,0

b) 没有负值

c) right += x(x值越大,越靠右的点)

d) 底部 +=y

笛卡尔二维坐标:

a) 中点是 (0, 0)

b) 确实存在负值

c) 右 += x

d) bottom -= y(y越少,越往下是point)

我需要一种简单的方法来从一个系统转换到另一个系统,反之亦然。为此,(我认为)我需要一些知识,例如笛卡尔坐标中的 (0, 0) [屏幕坐标的左上角] 在哪里。

但是有一个问题,笛卡尔坐标系中的某些点转换为屏幕坐标系后,在屏幕坐标系中的位置可能是负数,这是无稽之谈。我不能将屏幕坐标的左上角放在 (-inifity, +infinity) 笛卡尔坐标中...

我该如何解决这个问题?我能想到的唯一解决方案是将屏幕 (0, 0) 放在笛卡尔 (0, 0) 中,并且只使用笛卡尔系统的四分之一,但在那种情况下使用笛卡尔系统是没有意义的......

我敢肯定有一些方法可以将屏幕坐标转换为笛卡尔坐标,反之亦然,但我在考虑负值时做错了。

最佳答案

从笛卡尔坐标转换为屏幕坐标的基本算法是

screenX = cartX + screen_width/2
screenY = screen_height/2 - cartY

但是正如您提到的,笛卡尔空间是无限的,而您的屏幕空间不是。这可以通过更改屏幕空间和笛卡尔空间之间的分辨率轻松解决。上述算法使得笛卡尔空间中的 1 个单位 = 屏幕空间中的 1 个单位/像素。如果允许其他比例,您可以“缩小”或缩小屏幕空间以覆盖所有必要的笛卡尔空间。

这会将上述算法更改为

screenX = zoom_factor*cartX + screen_width/2
screenY = screen_height/2 - zoom_factor*cartY

现在您可以通过修改缩放系数来处理负的(或过大的)screenX 和 screenY,直到所有笛卡尔坐标都适合屏幕。

您也可以允许坐标空间的平移,也就是说,允许笛卡尔空间的中心偏离屏幕中心。这也有助于让您的 zoom_factor 保持尽可能紧,但也适合在笛卡尔空间原点周围不均匀分布的数据。

这会将算法更改为

screenX = zoom_factor*cartX + screen_width/2 + offsetX
screenY = screen_height/2 - zoom_factor*cartY + offsetY

关于c++ - 在笛卡尔坐标和屏幕坐标之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42241601/

相关文章:

c++ - 接收大量 (r) UDP 流量时 CPU 负载高 (Windows)

c++ - Cmake 未使用 "target_link_directory"正确添加目录

c++ - 使用 Boost Graph Library 将 boost 动态属性写入文件

java - 使用 radix-26 将名称转换为 key

algorithm - 找到每个总和为给定值的四元组

Javas Math.sin() 始终产生 NaN

c++ - Any Time 函数保证调用返回不同的值

algorithm - 没有相等的 n 长度子序列的最长二进制序列

javascript - 如何计算 Canvas 中旋转形状的橡皮筋坐标 - javascript

math - 在 Gmail 邮件的正文上运行 Javascript