Не удается заполнить замкнутую кривую в PyX (python) - PullRequest
0 голосов
/ 28 мая 2018

Я явно не понимаю, как работают замкнутые кривые и заполнение замкнутых кривых в 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")

Изображение результатов.A picture of the results.

1 Ответ

0 голосов
/ 29 мая 2018

PyX использует модель пути postscript, которая может содержать несколько подпутей в пути.(Подумайте об использовании элемента пути moveto в пути.) При заполнении таких путей происходят такие вещи, как вы наблюдаете.Обратите внимание, что дуга содержит неявный moveto в начале, который для заполнения принимается как lineto, но не для обводки.Вот почему имеет смысл использовать оператор добавления + и оператор соединения <<.Переключение на соединение решает вашу проблему.

(Вы можете использовать

print(p.normpath().normsubpaths)

, чтобы увидеть, что у вас есть несколько нормбутпатов при добавлении путей, даже если arclen не изменяется, как movetoкоманды от одной подсталины к следующей не являются частью длины дуги.)

...