Формы элементов определены как элементы <area>
внутри элемента <map>
в коде HTML.
Простой ответ на ваш вопрос - добавить что-то вроде этого
if (options.inverseFill) {
context.rect(0,0, canvas.width,canvas.height);
}
после строки context.beginPath();
, затем параметр по умолчанию: inverseFill: true,
, а затем убедитесь, что все области на карте изображения объявлены в одном и том же направлении по часовой стрелке.
Что происходит, так это то, что вы определяете дополнительный подпуть для пути, который определяет темное пятно, и при заполнении перекрывающаяся область (т. Е. Исходное пятно) будет отменяться до тех пор, пока не будут отменены числа обмоток подпути , в результате чего вы получаете желаемое перевернутое поведение.
Все становится намного сложнее, если определения полигонов вашей области могут вращаться в обоих направлениях. Например, если вы сделаете вышеупомянутое для исходной демонстрации MapHilight карты США, только некоторые из состояний будут вести себя правильно, так как их формы определены в правильном направлении по часовой стрелке - остальные остаются темными, поскольку их номера обмоток являются неправильным знаком ,
Если у вас есть полный контроль над определением карты изображения, я бы посоветовал оставить все как есть и просто убедиться, что все области движутся в одном направлении (т. Е. Просто изменить список координат для каждой области, которая не работает).
Если нет, то во время инициализации вам нужно будет предварительно рассчитать для каждой фигуры число обмоток. Скорее всего, это будет связано с просмотром списка точек и суммированием угла между каждыми двумя последовательными сегментами, рассчитанного с использованием atan2. Затем в функции add_shape_to обведите 4 угла холста в правильном направлении.
В любом случае, я надеюсь, что это поможет
Обновление:
извините, я не видел ваш комментарий ранее.
для круглой области в функции add_shape_to замените
} else if(shape == 'circ') {
часть с
} else if(shape == 'circ') {
context.closePath();
context.moveTo(coords[0] + coords[2], coords[1]);
context.arc(coords[0], coords[1], coords[2], 0, Math.PI * 2, true);
context.closePath();
}
Он закрывает подпуть до и после, затем перемещается в правильное место, чтобы избежать неприятной красной линии в верхнем углу, а затем изменяет параметр против часовой стрелки на true
, чтобы соответствовать внешнему прямоугольнику. Изменить по необходимости