Патч Matplotlib с отверстиями

Следующий код работает. Проблема в том, что я точно не знаю, почему это работает. Код рисует патч круга (используя PathPatch) с вырезом треугольника из центра. Я предполагаю, что внутренний треугольник вырезается, потому что он нарисован по часовой стрелке, а внешний круг – против часовой стрелки. Треугольник не получил бы вырез, если бы направление не было отменено. Я не нашел ничего в документации о применяемом правиле. Так почему это работает?

from matplotlib import pyplot from matplotlib.path import Path from matplotlib.patches import PathPatch import numpy # # draw a triangle within a circle using PathPatch # phi = numpy.linspace(0, 2*numpy.pi, 100) circle = 4 * numpy.exp(1j * phi) circleV = [[p.real, p.imag] for p in circle] phi = numpy.linspace(0, 2*numpy.pi, 4) triangle = 2 * numpy.exp(1j * phi) triangleV = [[p.real, p.imag] for p in triangle] circleC = [Path.LINETO for p in circleV] circleC[0] = Path.MOVETO triangleC = [Path.LINETO for p in triangleV] triangleC[0] = Path.MOVETO vertices = [] vertices.extend(circleV) vertices.extend(triangleV[::-1]) codes = [] codes.extend(circleC) codes.extend(triangleC) path = Path(vertices, codes) patch = PathPatch(path, facecolor="#aa6677") fig, ax = pyplot.subplots() ax.add_patch(patch) ax.set_xlim([-5, 5]) ax.set_ylim([-5, 5]) ax.set_aspect(1.0) pyplot.show() 

Теперь, как более сложный пример, пятиугольник является вырезом из основного круга, а маленькие круги также вырезаны из основного круга, которые частично пересекают пятиугольник. Если маленькие круги нарисованы по часовой стрелке, они заполняются там, где они пересекают пятиугольник и не заполняются там, где они нет. Это согласуется с приведенным выше правилом. Однако, если они тянутся против часовой стрелки, они полностью заполняются, что не согласуется с приведенным выше правилом.

 from matplotlib import pyplot from matplotlib.path import Path from matplotlib.patches import PathPatch import numpy clockwise_inner_circles = True # # draw a pentagon within a circle using PathPatch # phi = numpy.linspace(0, 2*numpy.pi, 100) circle = 4 * numpy.exp(1j * phi) circleV = [[p.real, p.imag] for p in circle] phi = numpy.linspace(0, 2*numpy.pi, 6) triangle = 2 * numpy.exp(1j * phi) triangleV = [[p.real, p.imag] for p in triangle] circleC = [Path.LINETO for p in circleV] circleC[0] = Path.MOVETO triangleC = [Path.LINETO for p in triangleV] triangleC[0] = Path.MOVETO vertices = [] vertices.extend(circleV) vertices.extend(triangleV[::-1]) codes = [] codes.extend(circleC) codes.extend(triangleC) # # draw circles in a circular pattern # phi = numpy.linspace(0, 2*numpy.pi, 100) for theta in 2*numpy.pi*numpy.arange(5)/5: circle = 2*numpy.exp(1j*theta) + 0.5*numpy.exp(1j*phi) circleV = [[p.real, p.imag] for p in circle] circleC = [Path.LINETO for p in circleV] circleC[0] = Path.MOVETO if clockwise_inner_circles: vertices.extend(circleV[::-1]) else: vertices.extend(circleV[::1]) codes.extend(circleC) path = Path(vertices, codes) patch = PathPatch(path, facecolor="#aa6677") fig, ax = pyplot.subplots() ax.add_patch(patch) ax.set_xlim([-5, 5]) ax.set_ylim([-5, 5]) ax.set_aspect(1.0) pyplot.show()