Uma função reutilizável para recortar imagens em polígonos usando a tela html5

Acho que o título da postagem pode precisar de edição, mas por enquanto não sei onde estão os problemas. Li páginas e respostas a perguntas semelhantes, aqui e em outros lugares. A resposta do One Stack Overflow é especialmente próxima, mas eu não entendo.

Eu quero uma função, desenhar polígonos na tela nas coordenadas desejadas e preenchê-los com alguma imagem de fundo carregada de um arquivo (grande o suficiente para que nenhum mosaico seja necessário). Triângulos seria bom para um teste. Aparentemente, devo usar drawImage e clip e, para dar uma borda ao polígono, posso reutilizar o mesmo caminho para o clipe e o traçado. Também aparentemente eu deveria manter a ordem de

- define path
- save
- clip
- drawImage
- restore
- stroke.

Leia também em algum lugar que basta carregar a imagem uma vez. (Se você quiser que eu cite as fontes de todas essas suposições, procurarei onde as vi. A maioria delas no Stack Overflow)

Caso contrário, o HTML está vazio

<body onload = "main ();"></body>

Primeira abordagem, fingindo que o navegador aguardará o carregamento da imagem:

var ctx, img;
var image_path = 'bg.jpg';

function main () {

    var CANVAS_SIZE = 600;
    var view_field_cnv = document.createElement ('canvas');
    view_field_cnv.width  = CANVAS_SIZE;
    view_field_cnv.height = CANVAS_SIZE;
    view_field_cnv.style.border = "1px solid";
    document.body.appendChild (view_field_cnv);
    ctx = view_field_cnv.getContext ('2d');

    img = document.createElement ('img');
    img.src = image_path;

    place_triangle (0, 0);
    place_triangle (300, 300);
    place_triangle (500, 500);
    place_triangle (0, 0);

}

function place_triangle (x, y) {

    console.log (x, y);

    ctx.beginPath ();
    ctx.moveTo (x + 10, y);
    ctx.lineTo (x + 110, y);
    ctx.lineTo (x + 60, y + 40);
    ctx.closePath ();

    img = document.createElement ('img');
    img.src = image_path;

    ctx.save ();
    ctx.clip ();
    ctx.drawImage (img, x, y);
    ctx.restore ();
    ctx.stroke ();


}

Isso desenha todos os três triângulos, mas nenhuma imagem cortada.

Segunda tentativa, com drawImage dentro de image.onload:

var ctx;
var image_path = 'bg.jpg';

function main () {

    var CANVAS_SIZE = 600;
    var view_field_cnv = document.createElement ('canvas');
    view_field_cnv.width  = CANVAS_SIZE;
    view_field_cnv.height = CANVAS_SIZE;
    view_field_cnv.style.border = "1px solid";
    document.body.appendChild (view_field_cnv);
    ctx = view_field_cnv.getContext ('2d');

    place_triangle (0, 0);
    place_triangle (300, 300);
    place_triangle (500, 500);
    place_triangle (0, 0);

}

function place_triangle (x, y) {

    console.log (x, y);

    var img;

    ctx.beginPath ();
    ctx.moveTo (x + 10, y);
    ctx.lineTo (x + 110, y);
    ctx.lineTo (x + 60, y + 40);
    ctx.closePath ();

    img = document.createElement ('img');
    img.src = image_path;
    img.onload = function () {

        ctx.save ();
        ctx.clip ();
        ctx.drawImage (img, x, y);
        ctx.restore ();
        ctx.stroke ();
    }

}

Este desenha a imagem cortada, mas apenas um triângulo, o último. Apenas comentar sobre salvar e restaurar não ajuda.

Portanto, não entendo carregar imagens, salvar, restaurar e provavelmente um milhão de outras coisas. Onde estão os insetos?

questionAnswers(1)

yourAnswerToTheQuestion