У меня есть несколько сотен полигональных слоев, и мне нужно было знать, какие из них перекрываются, и затенять перекрывающуюся область темнее / ярче, как на тепловой карте. Я пробовал свойство: "_ctx.globalCompositeOperation = 'multiply" ", но это не совсем работает, так как он применяется к каждому слою, а не только к перекрывающимся.
Я не уверен, где Начните с того, какие формулы использовать для исследования чего-то подобного. Я обнаружил, что некоторые библиотеки обрабатывают это как: http://fabricjs.com/intersection, он встроен.
У меня также есть скрипка: https://jsfiddle.net/v6swarb7/2/
const _canvas = document.getElementById('canvas');
const _ctx = canvas.getContext("2d");
const poly1 = [[172.87066184227245, 40.37854538483082], [172.87066184227245, 66.87696924040097], [13.880126229942462, 66.87696924040097], [13.880126229942462, 106.62460502375617], [119.87381413113218, 106.62460502375617], [119.87381413113218, 80.12618116818604], [146.37223798670232, 80.12618116818604], [146.37223798670232, 133.12302699905362], [186.11987377005755, 133.12302699905362], [186.11987377005755, 40.37854538483082], [172.87066184227245, 40.37854538483082]];
const poly2 = [[13.880126229942462, 66.87696924040097], [13.880126229942462, 106.62460502375617], [119.87381413113218, 106.62460502375617], [119.87381413113218, 66.87696924040097], [13.880126229942462, 66.87696924040097]];
_ctx.beginPath();
/* _ctx.globalCompositeOperation = 'multiply'; */
poly1.map((val, i) => {
_ctx.lineTo(
val[0], val[1]
)
_ctx.stroke();
});
_ctx.closePath();
_ctx.beginPath();
poly2.map(val => {
// this fill would be dynamic, and get gradually darker the more that overlap.
_ctx.fillStyle = 'red';
_ctx.lineTo(
val[0], val[1]
)
_ctx.fill();
_ctx.stroke();
});
_ctx.closePath();