在 PyX(python)中填充闭合曲线失败
Posted
技术标签:
【中文标题】在 PyX(python)中填充闭合曲线失败【英文标题】:Filling a closed curve in PyX (python) failing 【发布时间】:2018-05-28 16:06:52 【问题描述】:我显然误解了闭合曲线和填充闭合曲线在 PyX 中的工作原理。我正在从四个部分构建一条闭合曲线,但填充失败取决于我如何定义四个曲线之一。下面是一个最小的工作/失败示例和输出。为什么 upArc 的第一个定义有效,而第二个定义无效?
from pyx import *
c = canvas.canvas()
cL = canvas.canvas()
cR = canvas.canvas()
upArc = path.path(path.arc(0,3,1,180,0))
right = path.line(1,3,1,0)
downArc = path.path(path.arcn(0,0,1,0,180))
left = path.line(-1,0,-1,3)
p = upArc+right+downArc<<left
cR.fill(p,[color.rgb.blue])
cR.stroke(p)
upArc = path.path(path.arc(0,0,1,180,0)).transformed(trafo.translate(0,3))
right = path.line(1,3,1,0)
downArc = path.path(path.arcn(0,0,1,0,180))
left = path.line(-1,0,-1,3)
p = upArc+right+downArc<<left
cL.fill(p,[color.rgb.blue])
cL.stroke(p)
c.insert(cL,[trafo.translate(-2,0)])
c.insert(cR,[trafo.translate( 2,0)])
c.writePDFfile("minfail")
结果图片。
【问题讨论】:
您可以使用c.draw(p, [trafo.translate(2, 0), deco.filled([color.rgb.blue]), deco.stroked(])])
在画布c
上描边和填充一个步骤。这样更好,因为路径只会在输出中包含一次。
也谢谢你,@wobsta,我觉得我的代码有多余的重复(在其他地方也是如此);一旦我开始对 PyX 的结构感到更加熟悉,我就必须弄清楚如何正确地做这些事情,而不仅仅是以最小的工作方式。因此,非常欢迎所有在路上的建议和 cmets!
【参考方案1】:
PyX 使用 postscript 路径模型,它可以在一个路径中包含多个子路径。 (考虑在路径中使用路径元素moveto
。)填充此类路径时,会发生您观察到的事情。请注意,弧线的开头包含一个隐含的 moveto,用于填充类似于 lineto,但不是用于抚摸。这就是为什么使用添加运算符+
和连接运算符<<
会有所不同的原因。切换加入可以解决您的问题。
(你可以使用
print(p.normpath().normsubpaths)
看到,在添加路径时,您有多个 normsubpaths,即使 arclen 没有改变,因为从一个 normsubpath 到下一个 normsubpath 的 moveto 命令不是弧长的一部分。)
【讨论】:
谢谢,这让我很沮丧!我显然需要重新阅读 PyX 手册并(再次)研究 postcipt 在底层是如何工作的,但是有了这个,我将能够在深入研究之前完成一些插图。 请注意,在连接路径时,PyX 会自动插入从上一个端点到下一个起点的直线。所以你可以省略创建线条。最后,您应该通过p.append(path.closepath())
关闭路径。填充时,没关系,因为它会自动关闭路径,即每个 normsubpath 分别。这是您观察到的行为的实际原因。然而,抚摸并没有显示最后的结束线......这正是 Postscript 与路径一起工作的方式。
啊,这也应该有助于消除一些冗余,因为我在几个地方都觉得输入x,y = p1.atend()
、a,b = p2.atbegin()
、p3 = path.line(x,y,a,b)
等有点傻。再次感谢您!以上是关于在 PyX(python)中填充闭合曲线失败的主要内容,如果未能解决你的问题,请参考以下文章
python使用matplotlib可视化线图(line plot)自定义颜色填充曲线线条和固定横线之间的区域无论曲线上方或者下方