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:
问题:
我有一个代码,希望可以生成一个 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: