应用于IFS分形的线性几何变换

时间:2012-11-21 20:26:13

标签: fractals

我是Perceptron http://perceptron.sourceforge.net的开发人员之一 - 用Java编写的独特的视频反馈分形生成器。我想提请您注意这个开源项目,以便您也可以参与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分形中看到的更令人惊讶。用定义文件中的方程替换这个硬编码块会很好,并且需要一个模板建议。

0 个答案:

没有答案