我是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分形中看到的更令人惊讶。用定义文件中的方程替换这个硬编码块会很好,并且需要一个模板建议。