HTML5 Canvas - самопересечение строк с альфа-каналом

Посмотрите на изображение (извините, новые пользователи не могут напрямую вставлять изображение в пост). Линии нарисованы полупрозрачными цветами (альфа = 0,5). Когда красная линия пересекает саму себя, двойного наложения полупрозрачных цветов не происходит. При этом отделите зеленую линию, наложенную на красную, как следует. Можно сделать вывод, что линии на холсте нарисованы не линейно, как и вся площадь. Я считаю, что это неправильное поведение.

Живая демонстрация: jsfiddle.net/dom1n1k/xb2AY/

Не буду спрашивать, как это исправить :) Вопрос идеологический: как вы относитесь к такому поведению?

  1. Это логично и так и должно быть;
  2. Это не логично, но если это произошло - мы предполагаем эту особенность;
  3. Холсты работают так по технологическим причинам - реализация проще.
  4. Это явный баг, и его должны исправить авторы браузеров.

P.S. Извините за мой плохой английский.


person dom1n1k    schedule 27.09.2011    source источник


Ответы (1)


Отличный вопрос! Автор спецификации (и я) считаю, что ответ таков:

  1. Это логично и так и должно быть;

Давайте рассмотрим причины этого.

Вы не рисуете отдельные линии, когда рисуете красный путь. Вы рисуете весь путь, и весь путь рисуется сразу и обводится одновременно, и цвет пути не может «перекрываться». Это преднамеренно определено спецификацией. Это читает:

Поскольку все подконтуры обведены как один, перекрывающиеся части контуров в операции с одним обводом обрабатываются так, как если бы их объединение было тем, что было нарисовано.

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

Вы должны считать эту функцию хорошей вещью: если бы спецификация Canvas требовала, чтобы каждый подконтур пути вызывал дополнительное наложение, тогда углы каждого пути (где каждая линия соединяется) выглядели бы ужасно! (см. красные соединения здесь для примера того, как будет выглядеть каждый угол)

Поскольку перекрытие путей на крестах также означает, что они будут перекрываться в каждом углу, спецификация решает использовать только объединенный путь при обводке, что сохраняет нормально выглядящие углы как ожидаемое значение по умолчанию (я думаю, что большинство людей ожидает, что они будут смотреть как они делают, а не смотреть как я показал). Если бы линии накладывались на пересечения, а не на каждый угол, это не было бы последовательным правилом, что значительно усложняло бы изучение и работу.

Итак, рассуждение понятно, надеюсь. Спецификация должна дать нам 3 вещи, обычно в следующем порядке: наиболее распространенный ожидаемый результат (углы выглядят так, как они есть), согласованность (если бы мы наложили на пересечения линий, мы также сделали бы это на углах, поэтому мы не должны t сделать это), и легкость понимания.

Хорошая спецификация всегда непротиворечива. Если что-то непротиворечиво, то этому легче научиться, что облегчает понимание, когда вы знаете, почему что-то сделано именно так.

person Simon Sarris    schedule 27.09.2011
comment
Если бы спецификация Canvas требовала, чтобы каждый подконтур пути вызывал дополнительное наложение, тогда углы каждого пути выглядели бы ужасно! - Да, я понимаю. Я думаю, что не должно быть отдельных подпутей. Это один сплошной путь и нормальные углы. Но это не та область, которая заполнена цветом. Это линейный объект. Представьте, как перо рисует на бумаге. Одно непрерывное движение. Его цвет может накладываться сам на себя? - person dom1n1k; 27.09.2011
comment
Вы должны думать об этом с точки зрения построения пути строка за строкой. Когда вы пишете букву L ручкой, вы можете не ожидать какого-либо совпадения. А если написать букву V? Что, если вы напишете очень узкую букву V? Что, если вы напишете букву V настолько узкой, что она будет состоять всего из двух строк друг над другом? Это проблема, что вы называете углом, а что нет. Чтобы сохранить последовательность, они решили относиться ко всему одинаково. - person Simon Sarris; 27.09.2011