悠悠的棋子

|
| 回复于 2009-9-7 14:59:24
|
#1楼 |
|
为了方便理解,先考虑一维情况下的线性插值
对于一个数列c,我们假设c[a]到c[a+1]之间是线性变化的
那么对于浮点数x(a<=x<a+1),c(x)=c[a+1]*(x-a)+c[a]*(1+a-x);
这个好理解吧?
把这种插值方式扩展到二维情况
对于一个二维数组c,我们假设对于任意一个浮点数i,c(a,i)到c(a+1,i)之间是线性变化的,c(i,b)到c(i,b+1)之间也是线性变化的(a,b都是整数)
那么对于浮点数的坐标(x,y)满足(a<=x<a+1,b<=y<b+1),我们可以先分别求出c(x,b)和c(x,b+1):
c(x,b) = c[a+1][b]*(x-a)+c[a][b]*(1+a-x);
c(x,b+1) = c[a+1][b+1]*(x-a)+c[a][b+1]*(1+a-x);
好,现在已经知道c(x,b)和c(x,b+1)了,而根据假设c(x,b)到c(x,b+1)也是线性变化的,所以:
c(x,y) = c(x,b+1)*(y-b)+c(x,b)*(1+b-y)
这就是双线性插值,不知道我这么讲是否将明白了
我不太明白画板取值是什么意思
如果直接理解成亮度值的话就这么写:
//返回x,y的像素值,c[a][b]表示(a,b)的像素值
int getColor(double x,double y,int[][] c){
int a = (int)x;
int b = (int)y;
double dx = x-a;
double dy = y-b;
return (int)((c[a][b]*(1-dx)+c[a+1][b]*dx)*(1-dy)+(c[a][b+1]*(1-dx)+c[a+1][b+1]*dx)*dy);
}
|
|