Gnuplot和Sierpinksi Triangle
题:
我有一个代码,希望有一个Sierpinski三角形,我想知道如何输出你读入gnuplot的数据文件? 我从来没有使用过gnuplot,我正试着玩它。 此外,如果那是不可能的,我应该如何修改我的代码以绘制我的三角形,以便我可以看到它?
代码说明:
我试图生成从点(0,0)
开始的Sierpinski三角形,并且有0.33
概率,下一步将在当前点和(0,2)
。 下一步将在当前点和(1,sqrt3)
之间的中间值为0.33
。 下一步将在当前点和(0,0)
之间的中间值为0.33
。
码:
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 = 1.0; y0 = sqrt3;
应该是x0 = sqrt3; y0 = 1.0;
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: