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越少,底部越多)

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

但是存在一个问题,笛卡尔坐标中的某个点在转换为屏幕坐标后,屏幕坐标中的位置可能是负数,这是胡说八道。我不能将屏幕坐标的左上角放在 (-inifity, +infinity) 笛卡尔坐标中...

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

我确信有办法将屏幕坐标转换为笛卡尔坐标,反之亦然,但我的想法是用负值做错了。

最佳答案

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

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/14880601/

相关文章:

algorithm - 根据算法创建一组 "coupon codes";无需存储代码

math - 如何为高斯过程(GP)选择合适的内核?

math - 2d线段上的最近点,穿过第三2d线段

c++ - 从给定字符串中查找长度为 k 的所有排列/组合

c++ - 使用枚举使用按位参数组合的最佳实践?

c++ - '...' token 之前的预期类型说明符

C++ std::vector 使用软件事务内存访问

algorithm - 如何使按钮在 GUI 中不可见?

C#数学题: smallest power of 2 bigger than X?

algorithm - OCaml递归解决棋盘拼图上骑士最短路径的堆栈溢出