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