GOOGLE ADS

понедельник, 25 апреля 2022 г.

Создание маскирующего слоя в p5js

Я хотел бы нарисовать шаблон, а затем только чтобы этот шаблон «проявлялся» там, где он перекрывается с формой, которую я указываю. Подобно тому, как слой маски работает в Photoshop. Кто-нибудь знает, как я могу подойти к этому?


Решение проблемы

Это должно использовать 4-этапный процесс:

  • создайте свою маску с помощью beginShape()/endShape и beginContour()/endContour() в середине для отображаемой области. Вы делаете это на буфере.

    function setup() {
    createCanvas(400, 400);
    background(30)
    fill(200,50,60)
    msk = createGraphics(width,height)
    pattern = createGraphics(width,height)
    pixelDensity(1)
    msk.beginShape();
    // Exterior part of shape, clockwise winding
    msk.vertex(0, 0);
    msk.vertex(400, 0);
    msk.vertex(400, 400);
    msk.vertex(0, 400);
    // Interior part of shape, counter-clockwise winding
    msk.beginContour();
    msk.vertex(20, 20);
    msk.vertex(50, 220);
    msk.vertex(120, 380);
    msk.vertex(370, 320);
    msk.vertex(240, 160);
    msk.vertex(350, 40);
    msk.endContour();
    msk.endShape(CLOSE);
    mPixs = msk.loadPixels()
    }


  • Затем создайте другой буфер для шаблона

    for (let c=0; c<9; c++) {
    for (let r=0; r<9; r++) {
    pattern.circle(width/8*c,height/8*r,40)
    }
    }


  • Теперь загрузите пиксели из маски и используйте альфа-значение каждого пикселя на альфа-уровне каждого соответствующего пикселя в шаблоне.

    pattern.loadPixels()
    msk.loadPixels()
    for (let i=0; i < pattern.pixels.length; i+=4){
    pattern.pixels[i+3] = msk.pixels[i+3]
    }
    pattern.updatePixels()


  • Наконец, просто добавьте полученный буфер на основной холст с помощьюimage(pattern,0,0)


  • Взгляните на этот рабочий пример, тщательно написанный специально для вас!:D


    let msk, pattern, mPixs
    function setup() {
    createCanvas(400, 400);
    background(30)
    fill(200,50,60)
    msk = createGraphics(width,height)
    pattern = createGraphics(width,height)
    pixelDensity(1)
    msk.beginShape();
    // Exterior part of shape, clockwise winding
    msk.vertex(0, 0);
    msk.vertex(400, 0);
    msk.vertex(400, 400);
    msk.vertex(0, 400);
    // Interior part of shape, counter-clockwise winding
    msk.beginContour();
    msk.vertex(20, 20);
    msk.vertex(50, 220);
    msk.vertex(120, 380);
    msk.vertex(370, 320);
    msk.vertex(240, 160);
    msk.vertex(350, 40);
    msk.endContour();
    msk.endShape(CLOSE);
    mPixs = msk.loadPixels()
    }
    function draw() {

    for (let c=0; c<9; c++) {
    for (let r=0; r<9; r++) {
    pattern.circle(width/8*c,height/8*r,40)
    }
    }
    for (let c=0; c<9; c++) {
    for (let r=0; r<9; r++) {
    let xo=random(-5,5), yo=random(-5,5)
    circle(width/8*c+xo,height/8*r+yo,50)
    }
    }
    pattern.loadPixels()
    msk.loadPixels()
    for (let i=0; i < pattern.pixels.length; i+=4){
    pattern.pixels[i+3] = msk.pixels[i+3]
    }
    pattern.updatePixels()
    image(pattern,0,0)
    }

    html, body {
    margin: 0;
    padding: 0;
    }
    canvas {
    display: block;
    }

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/addons/p5.sound.min.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
    <meta charset="utf-8" />
    </head>
    <body>
    <main>
    </main>
    <script src="sketch.js"></script>
    </body>
    </html>

    Комментариев нет:

    Отправить комментарий

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...