使用Gnuplot绘制带孔多边形
有没有一种方法可以使用Gnuplot 5.0来绘制一个带有使用Gnuplot绘制带孔多边形,gnuplot,Gnuplot,有没有一种方法可以使用Gnuplot 5.0来绘制一个带有填充曲线的孔的多边形 以下是我的测试数据: # Outer ring 0 -2 -2 0 0 2 2 0 0 -2 # Inner ring -0.5 0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 -0.5 0.5 结果如下: 我知道我可以重新排列顶点,以隐藏外圈和内圈之间的连接线(实际上是多边形边界)。但是我会处理机器生成的数据,我更喜欢最小化数据预处理的数量 在其他一些绘图程序中,我们可以通过将缠绕规则更改为,在多
填充曲线的孔的多边形
以下是我的测试数据:
# Outer ring
0 -2
-2 0
0 2
2 0
0 -2
# Inner ring
-0.5 0.5
-0.5 -0.5
0.5 -0.5
0.5 0.5
-0.5 0.5
结果如下:
我知道我可以重新排列顶点,以隐藏外圈和内圈之间的连接线(实际上是多边形边界)。但是我会处理机器生成的数据,我更喜欢最小化数据预处理的数量
在其他一些绘图程序中,我们可以通过将缠绕规则更改为,在多边形内绘制孔。但我在gnuplot中没有找到这样的选项
最后,我不能只画白色的“洞”,因为在我的应用程序中,我有几个形状要画,我想看到“洞”后面的其他形状。为什么不在形状的顶部画白色的洞呢? 把你的约会分为
# shape.txt
0 -2
-2 0
0 2
2 0
0 -2
及
然后使用
plot "shape.txt" u 1:2 w filledcurves, 'hole.txt' u 1:2 w filledcurves lc 'white'
以下解决方案实现了您在问题中提到的功能:它以这样一种方式重新排列内部多边形的点,即外部多边形的端点和内部多边形的起点之间的距离最小(因此没有穿过内部多边形的直线)。它只会自动使用gnuplot,因此这仍然是您可以接受的解决方案 假设:
- 外部曲线闭合(起点=终点)
- 外部曲线没有重复的点
idx0
)x0,y0
)(行索引存储在idx1
)$Hollow
:首先是外部原样,然后是内部从idx1
开始到结束,然后是内部从(idx0+2
)开始到idx1
### draw hollow polygon
reset session
$Data <<EOD
# Outer ring
0 -2
-2 0
0 2
2 0
0 -2
# Inner ring
-0.5 0.5
-0.5 -0.5
0.5 -0.5
0.5 0.5
-0.5 0.5
EOD
Distance(x0,y0,x1,y1) = sqrt((x1-x0)**2 + (y1-y0)**2)
GetIdxs(colX,colY) = LastOuter==1 ? ( d1=Distance(x0,y0,column(colX),column(colY)), \
d0==d0 ? (d1<dmin ? (idx1=column(0), dmin=d1) : 0) : \
(idx1=column(0),dmin=d1), d0=d1, LastOuter) : \
column(0)==0 ? (d0=d1=dmin=NaN,x0=column(colX),y0=column(colY)) : \
column(colX)==x0 && column(colY)==y0 && LastOuter==0 ? \
(idx0=column(0),x0=column(colX),y0=column(colY),LastOuter=1 ) \
: LastOuter
set table $Dummy
plot LastOuter=0 $Data u 1:2:(GetIdxs(1,2)):(d1) w table
set table $Hollow
plot $Data u 1:2 every ::::idx0 w table
plot $Data u 1:2 every ::idx1 w table
plot $Data u 1:2 every ::idx0+2::idx1 w table
unset table
plot for [i=-5:5] -x+i/5.lw 2 lc "red" notitle, \
$Hollow u 1:2 w filledcurves lc 1
### end of code
$Hollow
0 -2
-2 0
0 2
2 0
0 -2
-0.5 -0.5
0.5 -0.5
0.5 0.5
-0.5 0.5
-0.5 -0.5
。。。我没有提到我想看到这个后面的其他形状。我两年前有过同样的问题,但没有看到你的问题。我想没有简单的解决办法。这里有一个非常冗长的解决方案,但是,这可能对gnuplot 5.0不起作用,因为它正在索引数据集。
0 -2 -2 nan
-2 0 0 nan
0 2 0 nan
2 0 0 nan
0 -2 1 nan
-0.5 0.5 1 2.54951
-0.5 -0.5 1 1.58114
0.5 -0.5 1 1.58114
0.5 0.5 1 2.54951
-0.5 0.5 1 2.54951
0 -2
-2 0
0 2
2 0
0 -2
-0.5 -0.5
0.5 -0.5
0.5 0.5
-0.5 0.5
-0.5 -0.5