SVG рисует не совсем один и тот же круг с тем же путем, но другим цветом - PullRequest
0 голосов
/ 07 ноября 2018

Я использую Pycairo, ниже приведен полный фрагмент:

from math import pi
from cairo import PDFSurface, Context, Matrix
WIDTH = 6 * 72
HEIGHT = 4 * 72
s = PDFSurface('example1.pdf', WIDTH, HEIGHT)
c = Context(s)
# Draw a circle
c.save()
c.set_line_width(0)
for i in range(1000): 
    c.arc(1 * 72, 3 * 72, 0.5 * 72, 0, 2 * pi)
    c.set_source_rgb(1.0, 0, 0)
    c.fill()
    c.arc(1 * 72, 3 * 72, 0.5 * 72, 0, 2 * pi)
    c.set_source_rgb(1.0, 1.0, 1.0)
    c.fill()
s.finish()

Я ожидал, что полученный PDF будет пустым. Но есть красный круг, как вы можете видеть. Я знаю, что это вызвано сглаживанием, и тот же вопрос был задан давно здесь: Два абсолютно одинаковых SVG-пути, нарисованные не одинаково Но ответ не объяснил, как сглаживание вызвало этот эффект.

Будет оценено, если кто-нибудь скажет мне , как это произошло.

Спасибо!

1 Ответ

0 голосов
/ 30 ноября 2018

Представьте, что вы хотите нарисовать половину пикселя красным: вы делаете cairo_rectangle(cr, 42, 42, 0.5, 1);, чтобы получить прямоугольник шириной в половину пикселя. Затем вы устанавливаете красный исходный цвет и рисуете это (на белом фоне).

Каков будет ожидаемый результат?

Ну, половина пикселя - белая ((1, 1, 1)), половина - красная ((1, 0, 0)). Таким образом, логичным будет смешать красный и белый, в результате чего получится цвет (1, 0.5, 0.5).

Далее вы хотите нарисовать ту же «половину пикселя» белым цветом. Информация о том, что «левая половина» пикселя красная, а «правая половина» белая, нигде не была сохранена. Итак, у пикселя есть только эта «красновато-белая смесь». Итак, опять же, требуется некоторое смешение: половина (1, 0.5, 0.5) и половина (1, 1, 1) равны (1, 0.75, 0.75), или смесь 1/4 красного и 3/4 белого.

Итак, хотя мы залили ту же самую геометрию сначала красным, а затем белым, красный все еще частично виден.

Какое это имеет отношение к сглаживанию? Круг не идеально вписывается в круговую сетку. Итак, около края вы получите несколько пикселей, которые только частично находятся внутри круга. Сглаживание означает, что сделано нечто подобное тому, что я объяснил выше: цвет фона и цвет заливки круга смешаны. Таким образом, это смешение означает, что некоторые из первых цветов остаются видимыми после того, как круг снова «стерт».

...