我必须对像素数组实现涟漪效应。每个像素是32位整数,表示ARGB颜色。有没有人对如何开始有任何建议?
答案 0 :(得分:3)
通常,纹波效应是图像的某种失真,其中失真量以“波浪”图案从一点到另一点变化。因此,第一项任务是创建一个“深度映射”,为每个像素生成一个数字。直观地,深度图将表示原始像素上方的波纹水面的高度。实验的起点可能是
#define X_CENTER 100 // x pixel position of center
#define Y_CENTER 100 // y pixel position of center
#define RADIUS 70 // approximate radius of circular wave train, in pixels
#define WAVELENGTH 10 // wavelength of ripples, in pixels
#define TRAINWIDTH 3.4 // approximate width of wave train, in wavelengths
#define SUPERPHASE 1.5 // phase vel. / group vel. (irrelevant for stills)
// returns a number from -1.0 to 1.0
double depth(int x, int y) {
double dx = x - X_CENTER ; // or int, if the center coords are ints
double dy = y - Y_CENTER ;
double r = (sqrt(dx*dx+dy*dy)-RADIUS)/WAVELENGTH ;
double k = r - (1-SUPERPHASE)*RADIUS/WAVELENGTH ;
double a = 1 / (1.0 + (r/TRAINWIDTH)*(r/TRAINWIDTH));
return a * sin(k*2*PI);
}
如果您有深度贴图(可以预先计算,如果您想要的是将相同的纹波应用于许多不同的图像),您可以使用各种选项来处理它:
可能需要进行一些实验,将这些组合和变体用于近似您对所需效果的心理描述。