计算位置和范围,百分比等
在很多图形程序中都会见到位置和范围的计算(参考计算机图形学 opengl 第三版,清华大学出版社)
举个例子,要把sin(x)在(0-2pi)的曲线图像画到一个窗口中 (大小为winsize),坐标为笛卡尔坐标-xy (0,0)在窗口左下角
计算方式:
x = x;
y=sin(x);
x的范围是:(0,2pi),y的范围是(-1,1)
接着进行缩放到窗口中:
xPos = winsize.width * (x/2pi);
yPos = winsize.height * ((y+1) / 2) ;
很简单的例子,但是说明了如何缩放到指定范围的通用方式: (注意,当我讲长度时是指最大值和最小值的长度 距离)
位置 = 窗口范围长度最大值 * 百分比 + 平移 (其中百分比的计算方式是: (变量当前值 - 变量最小值)/(变量的范围长度)
不要小看这个公式,在很多问题中都可以用到。
再看个例子,现在要求将 y=sin(x)的图像画到 窗口 偏离屏幕左边 1/3*winsize.width~winsize.width,
偏离窗口下边 1/3*winsize.height ~ winsize.height的位置,那么又该如何计算呢?
步骤多了一步,但是思想是一样的,计算方式如下:(将这种情况转化到上述的情况)
此时 x~(0,2*pi)
y~(-1,1)
要绘制的范围: 1/3*winsize.width~winsize.width , 1/3*winsize.height ~ winsize.height
xPos = 2/3* winsize.width * (x/2pi) + 1/3 * winsize.width
yPos = 2/3*winsize.height*((y+1)/2) + 1/3 * winsize.height;
yPos进行了一些调整,首先让它局限在 (2/3*winsize.height范围内,然后偏移 1/3 *winsize.height的位置。
再看看下一个例子吧,刚刚的x坐标是从0开始的,到2pi,y的值域又恰好处于(-1,1)之间,应该比较容易理解。
现在x的范围不再是0-2pi了,y的值域也不再是 (-1,1)了。
x的范围是 (1/6pi,1/2pi), y的范围是(0.5,1),要求画到窗口 (1/3winsize.width~winsize.width),(1/3winsize.height ~ winsize.height)区域
这样的话仍然按照前面的公式就是:
xPos = 2/3 * winsize.width * ((x - 1/6pi) / (1/2pi-1/6pi)) + 1/3 winsize.width;
yPos = 2/3 * winsize.height * ((y-0.5)/2) + 1/3 winsize.height
(公式还是能用的吧~)
没有晕吧,呵呵;
接着,再举个例子: 假设现在 窗口坐标的原点不是左下角,而是屏幕中心点; x向右递增,y向上递增;
x的范围是 (1/6pi,1/2pi), y的范围是(0.5,1),要求画到窗口 (-1/3winsize.width~winsize.width/2),(-1/3winsize.height ~ winsize.height/2.0)区域
那么还是利用之前的公式:
xPos = (1/2+1/3) * winsize.width * ((x - 1/6pi) / (1/2pi-1/6pi)) - 1/3 winsize.width;
yPos = (1/2+1/3) * winsize.height * ((y-0.5)/2) - 1/3 winsize.height
这样子,够清楚了吧。