当前位置: 首页 > 知识库问答 >
问题:

笛卡尔坐标和屏幕坐标之间的转换

宁鹏程
2023-03-14

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

屏幕坐标:

a)左上角是0,0

b)无负值

c) 右=x(x值越大,右侧点越多)

d) 底部=y

笛卡尔二维坐标:

a) 中点为(0,0)

b)减去值确实存在

c)右=x

d)底部-=y(y越少,底部越点)

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

然而,有一个问题是,对于笛卡尔坐标中的某个点,在将其转换为屏幕坐标后,屏幕坐标中的位置可能为负,这是胡说八道。我无法将屏幕坐标的左上角置于笛卡尔坐标系中。。。

我怎么解决这个问题?我能想到的唯一解决方案是将屏幕(0,0)放在笛卡尔(0,0)中,并且只使用笛卡尔系统的IV/4,但在这种情况下使用笛卡尔系统是没有意义的...

我确信有很多方法可以将屏幕坐标转换为笛卡尔坐标,反之亦然,但我的想法中有一些错误,那就是负值。

共有3个答案

宿楚青
2023-03-14

你需要知道屏幕的宽度和高度。

然后你可以做:

cartX =   screenX - (width / 2);
cartY = -(screenY - (height / 2));

和:

screenX =  cartX + (width / 2);
screenY = -cartY + (height / 2);
富凯旋
2023-03-14

您必须知道屏幕的大小才能转换

转换为笛卡尔坐标:

cartesianx = screenx - screenwidth / 2;
cartesiany = -screeny + screenheight / 2;

转换为屏幕:

screenx = cartesianx + screenwidth / 2;
screeny = -cartesiany + screenheight / 2;

对于屏幕值为负值的情况:我不担心这一点,此内容将被简单地剪裁,以便用户看不到。如果这是一个问题,我将添加一些约束,以防止笛卡尔坐标过大。另一种解决方案是,因为边不能是/-无穷大,所以可以缩放坐标(例如,1个像素=10个笛卡尔坐标),我们称之为缩放因子(scalefactor)。现在方程式为:

使用比例因子转换为笛卡尔坐标:

cartesianx = scalefactor*screenx - screenwidth / 2;
cartesiany = -scalefactor*screeny + screenheight / 2;

转换为具有比例因子的屏幕:

screenx = (cartesianx + screenwidth / 2) / scalefactor;
screeny = (-cartesiany + screenheight / 2) / scalefactor;
长孙淳
2023-03-14

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

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

现在,通过修改缩放因子来处理负(或过大)屏幕X和屏幕Y,直到所有笛卡尔坐标都适合屏幕。

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

这会将算法更改为

screenX = zoom_factor*cartX + screen_width/2 + offsetX
screenY = screen_height/2 - zoom_factor*cartY + offsetY
 类似资料:
  • 我正在尝试将球坐标转换为笛卡尔坐标,以绘制一个简单的三维金字塔。 下面是获取金字塔四个主要角的代码,具体取决于极角yrad和方位角xrad以及顶点坐标x和y: 方位角轴似乎工作正常,但问题是,在操纵极轴角时,当它们越过天顶或底部时,左右会互换,如图所示(选择顶部的mp4以更平滑地播放):http://gyazo.com/4a245713c232893960863cf4ea4186f6 怎么了?

  • 我试图将图像从极坐标转换为笛卡尔坐标,但在应用公式后,我得到了浮点坐标(r和teta),我不知道如何使用x和y的浮点来表示空间中的点。可能有一种方法可以将它们转换为整数,并仍然保留分布,但我不知道如何。我知道OpenCV中有像warpPolar这样的函数,但我想自己实现它。任何想法都会有帮助:) 这是我的代码:

  • 我正在尝试将极坐标的图像转换为笛卡尔坐标。 将图像转换为极坐标的示例显式执行-想要一个光滑的矩阵方法 我原以为使用上述方法是小菜一碟,但事实并非如此!!如果有人发现我的代码有错误,请告诉我! 我发现非常奇怪的是,当我改变phi时,它会做出根本性的改变,而不是以我期望的方式! 干杯

  • 我想知道是否有人帮助我理解如何将顶部图像转换为底部图像。以下链接中提供了这些图像。顶部图像采用笛卡尔坐标。底部图像是极坐标中的转换图像

  • 遵循笛卡尔网格的轴被称为“笛卡尔轴”。直角坐标轴用于折线图、条形图和气泡图。 Chart.js 中默认包含四个笛卡尔坐标轴。 linear logarithmic category time 所有包含笛卡尔轴的图表都支持多种通用选项。 名称 类型 默认值 描述 type String 图表类型 position String 轴在图表中的位置。可用的值有: 'top', 'left', 'bott

  • 我知道这个问题已经被回答了很多次,但是我不知道我做的是好是坏。 我得到了一个带有缺陷位置和图像ID的文件。图像大小为96*96。起源是(48,48) 由此计算R和T 然后,我为每个图像创建大小为96×96的空矩阵,对于图像1(例如),我在每个坐标(R,T)处赋值0 当我绘制矩阵时,我的结果很奇怪。。我错过了什么重要的事情吗?