4

我是 Perceptron http://perceptron.sourceforge.net的开发人员之一- 用 Ja​​va 编写的独特的视频反馈分形生成器。我想提请您注意这个开源项目,以便您也可以参加 SourceForge 网站上的论坛。

特别是,我有兴趣改进当前的线性几何变换。

Perceptron 生成的始终是由 Julia 分形的片段组成的 IFS 分形。这种组合是在图像转换的两步循环(递归、无限)过程中创建的:

根据 z_new = f(z_old) + constant_c 和线性映射进行变形。

在文件 DoubleBuffer.java 中,我们在 z_new = (x,y) 给出的坐标处从“屏幕”读取像素颜色。

自然,复数 z_new 可以在复平面中的任何位置,但“屏幕”具有严格的物理尺寸。所需的坐标已适当地缩放到屏幕 - 这不是问题。

但是,我们应用了一些看似不必要的规则,例如“取 z_new 的绝对值”,或者“如果 z_new 很大,将其包装起来!”。我们应用这些规则来防止读取不存在的屏幕外像素。相反,我们重新读取了一些像素。这导致了惊人的 IFS 分形。

我想知道在哪里可以学习更多类似的“线性几何变换”,它们以有趣的方式包装数组(矩阵)、创建切片、旋转、通过赋予它们各种形状的边缘、模拟镜子的变换等来塑造矩阵中的数据。

为了说明,请参阅此代码。

public int interface_getColor(int x, int y) {
 /**
  * Only positive x and y at the screen can be read to obtain
  * the color.  */

 x ^= x >> 31;   // absolute values only; no choice but to disregard negative z_new
 y ^= y >> 31;

 x >>= 8;    //divide by 256
 y >>= 8;

 /**
  * The reflection transformation to put the off-screen z_new
  * points back within the screen. Although x = x % W and y =
  * y % H would suffice, it is more interesting like this...        */

  x = (x / W & 1) == 0 ? x % W : W_ONE - x % W;   // if x/W is even then x =... else x=...
  y = (y / H & 1) == 0 ? y % H : H_ONE - y % H;   

 /**
  * Since the screen is a one-dimensional array of length
  * W*H, the index of any element is i(x,y) = x + W * y.  */

  return buffer.getElem(x + W * y);
}

正如您所看到的,按位运算符是速度所必需的,而经典的数组包装提供了比任何人都希望从 IFS 分形中看到的更多奇迹。用定义文件中的方程式替换这个硬编码块会很好,并且需要模板建议。

4

0 回答 0