处理中的创意编程|设置 1(随机游走器)
洛伦兹系统是一个常微分方程组,由美国数学家和气象学家 Edward Norton Lorenz 于 1963 年左右首先研究。它以对某些参数值和初始条件具有混沌解而著称。它源自地球大气对流的简化模型。它也自然出现在激光和发电机模型中。洛伦兹吸引子是洛伦兹系统的一组混沌解,绘制时类似于蝴蝶或八字形。下图出现在自然杂志 2000 年 8 月 31 日,第 949 页,是 Ian Stewart 撰写的题为“洛伦兹吸引子存在”的文章的一部分。
洛伦兹吸引器系统最常表示为 3 个耦合非线性微分方程 –
在上述方程组中,“a”有时称为普朗特数,“b”称为瑞利数。一组常用的常数是 a = 10, b = 28, c = 8 / 3。另一个是 a = 28, b = 46.92, c = 4。
Java微分方程的示例实现:-
int i = 0;
double x0, y0, z0, x1, y1, z1;
double h = 0.01, a = 10.0, b = 28.0, c = 8.0 / 3.0;
x0 = 0.1;
y0 = 0;
z0 = 0;
for (i = 0; i < N; i++) {
x1 = x0 + h * a * (y0 - x0);
y1 = y0 + h * (x0 * (b - z0) - y0);
z1 = z0 + h * (x0 * y0 - c * z0);
x0 = x1;
y0 = y1;
z0 = z1;
// Printing the coordinates
if (i > 100)
System.out.println(i + " " + x0 + " " + y0 + " " + z0);
}
我们将尝试在Processing Java可视化地实现上述逻辑。由于我们将在 3d 中绘制点,我们需要使用 3d 渲染器。我们将在以下实现中使用 OPENGL 渲染器,但也可以使用 P3D 渲染器。我们还需要使用一个名为 PeasyCam 的外部处理库,它可以帮助我们为 3d 环境工作流程创建交互式相机对象。可以使用 Processing IDE 从工具 -> 添加工具 -> 库下载 PeasyCam。
我们还将使用以下函数来表示 Lorenz Attractor 结构-
-
beginShape()
– 开始记录形状的顶点。 -
endShape()
– 停止记录形状的顶点。 -
vertex()
– 此函数用于指定点、线、三角形、四边形和多边形的顶点坐标。它专门用于beginShape()
和endShape()
函数中。
Lorenz Attractor 在处理Java:-
/* FINAL SKETCH FOR LORENZ ATTRACTOR */
import peasy.*; // Importing peasy package
// Initialization
float x = 0.01, y = 0, z = 0;
float a = 10, b = 28, c = 8.0 / 3.0;
// ArrayList of PVector objects to store
// the position vectors of the points to be plotted.
ArrayList points = new ArrayList();
PeasyCam cam; // Declaring PeasyCam object
void setup()
{
// Creating the output window
// and setting up the OPENGL renderer
size(800, 600, OPENGL);
// Initializing the cam object
cam = new PeasyCam(this, 500);
}
void draw()
{
background(0);
// Implementation of the differential equations
float dt = 0.01;
float dx = (a * (y - x)) * dt;
float dy = (x * (b - z) - y) * dt;
float dz = (x * y - c * z) * dt;
x += dx;
y += dy;
z += dz;
// Adding the position vectors to points ArrayList
points.add(new PVector(x, y, z));
translate(0, 0, -80);
scale(5);
stroke(255);
noFill();
// Beginning plotting of points
beginShape();
for (PVector v : points) {
// Adding random color to the structure in each frame
stroke(random(0, 255), random(0, 255), random(0, 255));
vertex(v.x, v.y, v.z); // plotting the vertices
}
endShape(); // Drawing ends
}
输出:-
源材料–
- Daniel Shiffman 的编码训练编码挑战。
- Paul Bourke 的 3D 洛伦兹吸引子。