2015-07-22 73 views
0

我试图将X和Y屏幕坐标转换为-1.0的浮点范围,以1.0。如何将X和Y屏幕坐标转换为-1.0,1.0浮点数? (在C)

(-1,-1为0,0,如果分辨率为640×480,1,1是640,480。0,0是320240 ......的中心。)

我将如何处理这?我做了几次徒劳的尝试,而且我不完全是数学上的倾向。

+3

outx =(X-320)/ 640; outy =(Y-240)/ 480; – Cobusve

+0

@Cobusve或'OUTX =(X-320)/640.0f;' – chux

回答

1

下面是一些C代码

void convert(int X, int Y) 
{ 
    float newx = 2*(X-320.0f)/640.0f; 
    float newy = 2*(Y-240.0f)/480.0f; 

    printf("New x = %f, New y = %f", newx, newy); 
} 

编辑:添加的后缀f,以确保我们不做整数数学!

+0

'f'不是一个有效的整数常量后缀。写'320.f'或'320.0f'。 – cremno

+0

真的吗? C99第6.4.4.2段似乎不同意你的意见。我引用:“一个没有固定长度的浮点常量具有double类型,如果后缀为f或F,则它的类型为float,如果后缀为l或L,则类型为long double。那也编译... – Cobusve

+0

是的。查找浮点数与整数常量之间的差异。你使用了什么编译器? – cremno

0

在X方向:

  1. 屏幕坐标0对应于-1.0
  2. 屏幕坐标640对应于1.0

您可以在转换为一个公式:

浮点坐标鉴于fX,屏幕坐标sX是:

sX = 640*(fX + 1.0)/2.0 

sX = 320*(fX + 1.0) 

同样,假如fY在浮点坐标中,屏幕坐标为sY是:

sY = 480*(fY + 1.0)/2.0 

sY = 240*(fY + 1.0) 

的是逆:

鉴于屏幕坐标sXfX在现实坐标是:

fX = (sX/320 - 1.0) 

在屏幕鉴于sY坐标,fY在现实坐标是:

fY = (sY/240 - 1.0) 

当转换代码,请确认最后两个方程有1.0。否则,由于整数除法,您将失去准确性。

fX = (1.0*sX/320 - 1.0) 
fY = (1.0*sY/240 - 1.0) 
+0

如果我通过0到我得到640×(0 + 1)/ 2 = 320,OP要求-1 ... – Cobusve

+0

@Cobusve,你正在看错方程。 –

+0

当我看时,只有一个;) – Cobusve

相关问题