Gnuplot 和谢尔宾斯基三角

Gnuplot and Sierpinksi Triangle

问题:

我有一个代码,希望可以生成一个 Sierpinski 三角形,我想知道如何将您读取的数据文件输出到 gnuplot 中?我从未使用过 gnuplot,我正在尝试使用它。另外,如果那不可能,我应该如何修改我的代码以绘制我的三角形以便我可以看到它?

代码解释:

我正在尝试生成从点 (0,0) 开始的 Sierpinski 三角形,下一步有 0.33 的概率在当前点和 (0,2) 之间.下一步有 0.33 的概率在当前点和 (1,sqrt3) 的中间。下一步有 0.33 的概率在当前点和 (0,0) 之间的中间点。

代码:

import java.util.Random;

public class SierpinskiTriangle {
    public static void main(String[] args) {
        //int N = Integer.parseInt(args[0]); // number of points
        int N = 5000;
        double sqrt3 = Math.sqrt(3);
        double x = 0.0, y = 0.0; //plots

        //need to draw triangle boundary      
  
        // triangle rules
        for (int i = 0; i < N; i++) {
            double r = Math.random();
            double x0, y0;
            if (r < 1/3) {
                x0 = 0.0; y0 = 0.0;
            } else if (r < 2/3) {
                x0 = 0.0; y0 = 2.0; 
            } else {
                x0 = 1.0; y0 = sqrt3;
            }
            x = (x0 + x) / 2;
            y = (y0 + y) / 2;         
        }
    }   
}

首先,你的代码有几个问题:

  • 整数除法导致仅考虑第三个选项,因为 1/3 = 0 和 2/3 = 0。使用 1./3。和 2./3.相反。
  • 您已经为最后一个选项交换了坐标,x0 = 1.0; y0 = sqrt3; 应该是 x0 = sqrt3; y0 = 1.0;

将点输出到名为 data 的文件(我在循环中使用 System.out.println("" + x + " " + y);)后,您可以在 gnuplot 中执行以下操作:

set size ratio -1
plot "data" u 2:1 pt 7 ps 0.3

要监控三角形是如何逐点创建的,您可以使用带暂停的循环:

set xrange [0:2]
set yrange [0:1.8]
do for [i=0:4999] {
plot "data" u 2:1 every ::::i pt 7 ps 0.3
pause 0.1
}

或者您可以使用一系列 png 文件创建动画 gif:

set term pngcairo
do for [i=0:4999] {
set output "".i.".png"
plot "data" u 2:1 every ::::i pt 7 ps 0.3
}

预计上面的速度很慢。您可以跳过某些帧以使其更快。然后在 gnuplot 之外执行此操作:

convert -delay 10 -loop 0 *.png animation.gif

对于此示例,我使用了 50 点增量并将 -delay 更改为 100: