Как нарисовать на canvas только часть картинки

149
13 ноября 2018, 16:10

есть 2 картинки и canvas, первая картинка рисуется полностью на весь canvas.
А вторую нужно показывать по частям, при чём не кругами или квадратами, а полигонами. Грубо говоря нужно сделать подсветку части картинки при наведении на неё, и обратное. (данная задача уже выполнена в плагине mapster для jquery, но мне нужно сделать без jquery, а библиотека без него не работает)

функция для определения в попадания точки в полигон есть

function isPointInPoly(poly, pt){
    for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
        ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))
        && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
        && (c = !c);
    return c;
}

и вот так я получаю полигоны на которые нужно реагировать:

var tmp2 = [],tmp,i,n,areas = document.getElementsByTagName('area'), len = areas.length, coords = [];
//в массиве areas все элементы по тегу area, len - его длина, coords - массив результата.
//идём по массиву areas и в массив tmp2 забиваем координаты, после этого забиваем 
//этот набор координат, как единое целое в массив результат coords - т.е. там 
//в итоге массив полигонов представленный точками
for (n = 0; n < len; n++) {
    tmp = areas[n].coords.split(',');
    for (i=0;i<tmp.length-1;i+=2)tmp2.push({x: tmp[i], y: tmp[i+1]});
    coords.push(tmp2);
    tmp2=[];
}
areas =[];

(результат в массиве - coords)

мапа в коде из которой получаем координаты

<map name="map1">
<area shape="poly" coords="16,107,68,107,68,159,16,159" alt="один" href="">
...
</map> 
Answer 1

В общем нашел решение(там есть описание на английском)
для себя же я сократил код так (по скольку мне не нужно делать обводку):

//пример параметра poly - [{x:2,y:2},{x:10,y:10},{x:50,y:50}]
//img2 - картинка которую хотим нарисовать
function drawpart(poly){
    var i=0;
    ctx.save();
    ctx.beginPath();
    ctx.moveTo(poly[0].x, poly[0].y);
    for(i =1;i<poly.length;i++)
    {
        ctx.lineTo(poly[i].x, poly[i].y);
    }
    ctx.clip(); 
    ctx.drawImage(img2, 0, 0);
    ctx.restore();
}

всё отлично, только та функция для определения попадания точки в полигон работает не правильно.. буду рад ссылкам

READ ALSO
Node.js MySQL unknown column in field list

Node.js MySQL unknown column in field list

Консоль выдает ошибку unknown column 'Tomas' in 'field list'

177
Как объединить строки в SQL

Как объединить строки в SQL

Как задавая запрос в базу данный, соединить две строчки в одну, те

161
Запрос на удаления

Запрос на удаления

Есть список категорий и у каждой категории есть потомки(они хранится в одной таблице Group(id, name, parent_id) и у каждого потомка есть в другой таблице...

149