(Восстановление вашей проблемы) Ваша первоначальная проблема заключалась в том, что при вызове beginPath()
и stroke()
для каждого сегмента у вас было много перекрывающихся полупрозрачных путей.Ваша новая «проблема» заключается в том, что, создавая все ваши lineTo()
команды как часть одного и того же пути, а затем вызывая stroke()
один раз в конце, любые самопересекающиеся пути, предназначенные пользователем, не показываютвидимое перекрытие.
Ниже приведен пример, показывающий разницу между
- множеством полупрозрачных линий на одном пути и штрихом один раз (вверху слева) по сравнению с

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