使用Gnuplot绘制带孔的多边形

时间:2017-07-05 09:12:47

标签: gnuplot

有没有办法使用Gnuplot 5.0绘制带有filledcurves的洞的多边形?

以下是我的测试数据:

# 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

结果如下:

Filled curve with a hole

我知道我可以重新排序顶点,以便隐藏外环和内环之间的连接线(实际上是多边形边界)。但我会处理机器生成的数据,我宁愿最小化数据预处理量。

在其他一些绘图程序中,我们可以通过将缠绕规则更改为even-odd来在多边形内部绘制孔。但我没有在gnuplot中找到这样的选项。

最后,我不能只用白色绘制“洞”,因为在我的应用程序中我有几种形状可以绘制,而且我想在“洞”后面看到其他形状。

2 个答案:

答案 0 :(得分:0)

为什么不在形状顶部绘制白色的孔? 将您的日期分成

# shape.txt
0 -2
-2 0
0 2
2 0
0 -2

# hole.txt 
-0.5 0.5
-0.5 -0.5
0.5 -0.5
0.5 0.5
-0.5 0.5

然后使用

 plot "shape.txt" u 1:2 w filledcurves, 'hole.txt' u 1:2 w filledcurves lc 'white'

答案 1 :(得分:0)

以下解决方案执行您在问题中已经提到的内容:它以这种方式重新排列内部多边形的点,使外部多边形的端点和内部多边形的起点具有最小距离(因此没有线穿过内部多边形)。它会自动与 gnuplot 一起,所以这对你来说仍然是一个可以接受的解决方案。

假设:

  • 外曲线闭合(起点=终点)
  • 外曲线没有重复点

程序:

  1. 遍历数据,当再次找到第一个 x 和 y 值时,外部结构完成,内部结构开始(行索引存储在 idx0 中)
  2. 当内部结构开始时,它会寻找到外部结构开始/结束点的最小距离(x0,y0)(行索引存储在idx1中)
  3. 将数据绘制到数据块 $Hollow 中:首先是外部原样,然后是内部从 idx1 开始到结束,然后是内部从 (idx0+2) 开始到 { {1}}。

在下面的示例中,首先绘制红线以说明中心的空多边形。使用 gnuplot 5.0.0 测试。 对于填充曲线中的多个孔,您可能需要使用一个相当通用但相当冗长的解决方案来检查 gnuplot: How to draw a filled area with hole?

代码:

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 $Dummy的内容。

$Hollow

$Dummy

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

$Hollow

enter image description here