使用Gnuplot绘制带孔多边形

使用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 结果如下: 我知道我可以重新排列顶点,以隐藏外圈和内圈之间的连接线(实际上是多边形边界)。但是我会处理机器生成的数据,我更喜欢最小化数据预处理的数量 在其他一些绘图程序中,我们可以通过将缠绕规则更改为,在多

有没有一种方法可以使用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
结果如下:

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

在其他一些绘图程序中,我们可以通过将缠绕规则更改为,在多边形内绘制孔。但我在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,因此这仍然是您可以接受的解决方案

假设:

  • 外部曲线闭合(起点=终点)
  • 外部曲线没有重复的点
程序:

  • 检查数据,当再次找到第一个x和y值时,外部结构完成,内部结构开始(行索引存储在
    idx0
  • 当内部结构开始时,它寻找到外部结构的起点/终点的最小距离(
    x0,y0
    )(行索引存储在
    idx1
  • 数据被绘制到一个数据块
    $Hollow
    :首先是外部原样,然后是内部从
    idx1
    开始到结束,然后是内部从(
    idx0+2
    )开始到
    idx1
  • 在下面的示例中,首先绘制红线以说明中心的空多边形。使用gnuplot 5.0.0进行测试。 对于填充曲线中的多个孔,您可能希望使用一个相当一般但相当长的解决方案进行检查

    代码:

    ### 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