如何在不使用数据和函数的情况下绘制一些图形? (乌龟模拟)
How to draw some graph without using data and function? (turtle analog)
有什么方法可以制作如下图这样的图表吗?在 Gnuplot 中,有任何像 "lineTo , moveTo , arc, ... etc" 这样的命令吗?
如果我想制作这样的图片
为了制作这张照片我应该做什么?
在海龟图形中,只需要一些代码
repeat 36 [rt 10 repeat 2 [fd 100 rt 90]]
您可以使用 gnuplot 做类似的事情。当然,gnuplot 需要知道直线起点和终点的坐标,因此您必须以某种方式计算它们。类似于下面的代码:您将坐标写入数据块并绘制它 with vectors
,同时检查 help vectors
。使用 gnuplot 5.2.8 创建的图表。
代码:
### vector plot similar to turtle graphics
reset session
set size square
set angle degrees
x0 = 0
y0 = 0
a0 = 0
r0 = 10
set print $Data
do for [i=1:36] {
a0 = a0 - 10
do for [j=1:2] {
print sprintf("%g %g %g %g",x0,y0,x0=x0+r0*cos(a0),y0=y0+r0*sin(a0))
a0 = a0 - 90
}
}
set print
plot $Data u 1:2:(-):(-) w vectors nohead notitle
### end of code
结果:
加法:
顺便说一句:这个乌龟图形命令真的不能简化为吗?
repeat 36 [fd 100 rt 110]
是的,如@Friedrich 所示,无需数据块即可完成。
这是我的第一个镜头的修改版本,没有取模 %
。第五列,即(x0=x0+r*cos(a),y0=y0+r*sin(a),a=a-110)
,不用于绘图,仅用于计算。
代码:
### vector plot similar to turtle graphics
reset session
set size square
set angle degrees
set xrange[-2:12]
set yrange[-10:4]
r = 10
set samples 36
plot a=x0=y0=0 '+' u (x0):(y0):(r*cos(a)):(r*sin(a)): \
(x0=x0+r*cos(a),y0=y0+r*sin(a),a=a-110) w vec nohead not
### end of code
结果:(类似于上图)
这是一个类似于@theozh 的版本,没有数据块
set size square
set angle degrees
r = 10
pl a=x=y=0, [i=1:2*36+1:1] '+' us (a=a-int(i)%2*10-90, x=x+r*cos(a)) : (y=y+r*sin(a)) w l t ""
int(i)%2
模拟第二个循环计数器以交替减去 10。
使用极坐标的简短解决方案:
我刚刚注意到组合 polar
模式和特殊文件名 '+'
的一个很好的行为。随着@theozh 使用 vec
的更新解决方案,它简化为
set size square
set angle degrees
set polar
pl a=0, [i=1:36:1] '+' us (a=a+110):(1):(100):(0) w vec nohead
因此,海龟片段几乎可以直接翻译。
再短一点,同样的情节可以用
完成
set sample 36
pl '+' us ([=11=]*10):(1):(100):(0) w vec nohead
有什么方法可以制作如下图这样的图表吗?在 Gnuplot 中,有任何像 "lineTo , moveTo , arc, ... etc" 这样的命令吗?
如果我想制作这样的图片
为了制作这张照片我应该做什么? 在海龟图形中,只需要一些代码
repeat 36 [rt 10 repeat 2 [fd 100 rt 90]]
您可以使用 gnuplot 做类似的事情。当然,gnuplot 需要知道直线起点和终点的坐标,因此您必须以某种方式计算它们。类似于下面的代码:您将坐标写入数据块并绘制它 with vectors
,同时检查 help vectors
。使用 gnuplot 5.2.8 创建的图表。
代码:
### vector plot similar to turtle graphics
reset session
set size square
set angle degrees
x0 = 0
y0 = 0
a0 = 0
r0 = 10
set print $Data
do for [i=1:36] {
a0 = a0 - 10
do for [j=1:2] {
print sprintf("%g %g %g %g",x0,y0,x0=x0+r0*cos(a0),y0=y0+r0*sin(a0))
a0 = a0 - 90
}
}
set print
plot $Data u 1:2:(-):(-) w vectors nohead notitle
### end of code
结果:
加法:
顺便说一句:这个乌龟图形命令真的不能简化为吗?
repeat 36 [fd 100 rt 110]
是的,如@Friedrich 所示,无需数据块即可完成。
这是我的第一个镜头的修改版本,没有取模 %
。第五列,即(x0=x0+r*cos(a),y0=y0+r*sin(a),a=a-110)
,不用于绘图,仅用于计算。
代码:
### vector plot similar to turtle graphics
reset session
set size square
set angle degrees
set xrange[-2:12]
set yrange[-10:4]
r = 10
set samples 36
plot a=x0=y0=0 '+' u (x0):(y0):(r*cos(a)):(r*sin(a)): \
(x0=x0+r*cos(a),y0=y0+r*sin(a),a=a-110) w vec nohead not
### end of code
结果:(类似于上图)
这是一个类似于@theozh 的版本,没有数据块
set size square
set angle degrees
r = 10
pl a=x=y=0, [i=1:2*36+1:1] '+' us (a=a-int(i)%2*10-90, x=x+r*cos(a)) : (y=y+r*sin(a)) w l t ""
int(i)%2
模拟第二个循环计数器以交替减去 10。
使用极坐标的简短解决方案:
我刚刚注意到组合 polar
模式和特殊文件名 '+'
的一个很好的行为。随着@theozh 使用 vec
的更新解决方案,它简化为
set size square
set angle degrees
set polar
pl a=0, [i=1:36:1] '+' us (a=a+110):(1):(100):(0) w vec nohead
因此,海龟片段几乎可以直接翻译。
再短一点,同样的情节可以用
完成set sample 36
pl '+' us ([=11=]*10):(1):(100):(0) w vec nohead