【问题标题】:Implement ripple effect in C given an array of pixels给定像素数组,在 C 中实现波纹效果
【发布时间】:2011-09-10 21:55:25
【问题描述】:

我必须在像素数组上实现涟漪效果。每个像素都是一个代表 ARGB 颜色的 32 位整数。有人对如何开始有任何建议吗?

【问题讨论】:

  • 您是否想到了特定的涟漪效应,或者只是“看起来像涟漪的东西”?您的目标是动画效果还是静止图像?
  • 静止图像...只是想要从特定的起始像素 (r,c) 辐射出涟漪效果。

标签: c image ripple


【解决方案1】:

一般来说,涟漪效应是图像的某种失真,其中失真量以“波浪”模式从一个点到另一个点变化。所以第一个任务是创建一个“深度映射”,为每个像素生成一个数字。直观地说,深度图将表示原始像素上方波纹水面的高度。实验的起点可以是

#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);
}

当您拥有深度图(如果您只想将相同的波纹应用于许多不同的图像,则可以预先计算),您有多种选择来处理它:

  • 根据像素的深度使每个像素变亮或变暗
  • 将深度图沿对角线移动几个像素,并根据移动后的地图和未移动的地图之间的差异变亮或变暗。
  • 将图像中的每个像素稍微移动一个向量,该向量与每个像素的深度与其(例如)东、南相邻像素的深度之间的差异成正比。为了获得视觉上令人愉悦的结果,可能需要进行一些平滑或过采样,尤其是当您的基础图像包含清晰的轴平行边缘时。

您可能需要对这些组合和变体进行一些实验,才能大致了解您对所需效果的心理图景。

【讨论】:

  • 感谢您提供的信息,伙计...非常感谢。我试试看!
  • 嗨,亨宁。我在这里迟到了,但我希望你能告诉我,是否可以在给定一个插槽的情况下获得二维数组的相邻(周围)插槽?我不太确定这个过程是如何被调用的,因此我不知道用什么术语来谷歌。提前致谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 2015-02-08
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2017-05-01
相关资源
最近更新 更多