在 PyX (python) 中填充闭合曲线失败
Filling a closed curve in PyX (python) failing
我显然误解了闭合曲线和填充闭合曲线在 PyX 中的工作原理。我正在从四个部分构建一条闭合曲线,但填充失败取决于我如何定义四个曲线之一。下面是一个最小的 working/failing 示例和输出。为什么 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")
结果图片。
PyX 使用 postscript 路径模型,它可以在路径中包含多个子路径。 (考虑在路径中使用路径元素 moveto
。)填充此类路径时,会发生您观察到的事情。请注意,弧在开头包含一个隐式 moveto,对于填充,它像 lineto 一样被采用,但不是用于描边。这就是为什么使用添加运算符 +
和连接运算符 <<
会有所不同。切换到加入可以解决您的问题。
(您可以使用
print(p.normpath().normsubpaths)
看到,在添加路径时您有多个 normsubpaths,即使 arclen 没有改变,因为从一个 normsubpath 到下一个 normsubpath 的 moveto 命令不是弧长的一部分。)
我显然误解了闭合曲线和填充闭合曲线在 PyX 中的工作原理。我正在从四个部分构建一条闭合曲线,但填充失败取决于我如何定义四个曲线之一。下面是一个最小的 working/failing 示例和输出。为什么 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")
结果图片。
PyX 使用 postscript 路径模型,它可以在路径中包含多个子路径。 (考虑在路径中使用路径元素 moveto
。)填充此类路径时,会发生您观察到的事情。请注意,弧在开头包含一个隐式 moveto,对于填充,它像 lineto 一样被采用,但不是用于描边。这就是为什么使用添加运算符 +
和连接运算符 <<
会有所不同。切换到加入可以解决您的问题。
(您可以使用
print(p.normpath().normsubpaths)
看到,在添加路径时您有多个 normsubpaths,即使 arclen 没有改变,因为从一个 normsubpath 到下一个 normsubpath 的 moveto 命令不是弧长的一部分。)