Как сделать отверстие в многоугольнике с помощью CreateJS?

#javascript #canvas #createjs

#javascript #холст #createjs

Вопрос:

введите описание изображения здесь

Как вы можете видеть на прикрепленном изображении, он имеет ромб с эллипсом внутри, который почти прозрачный.

Но это всего лишь изображение.

Как я могу создать это с помощью createjs?

Более подробное описание проблемы:

То, что вы видите на картинке, не совсем то, что мне нужно. В идеале моя задача — сделать из этого ромба два треугольника с эллипсом внутри.

Эллипс должен создавать некоторую прозрачность в треугольнике, чтобы все элементы, которые будут находиться под этим треугольником, были видны насквозь.

Моя реализация:

Я делаю треугольник в соответствии с этим примером: (благодаря этой скрипке)

 (createjs.Graphics.Polygon = function(x, y, points) {
    this.x = x;
    this.y = y;
    this.points = points;
}).prototype.exec = function(ctx) {
    // Start at the end to simplify loop
    var end = this.points[this.points.length - 1];
    ctx.moveTo(end.x, end.y);
    this.points.forEach(function(point) {
        ctx.lineTo(point.x, point.y);
    });
};
createjs.Graphics.prototype.drawPolygon = function(x, y, args) {
    var points = [];
    if (Array.isArray(args)) {
        args.forEach(function(point) {
            point = Array.isArray(point) ? {x:point[0], y:point[1]} : point;
            points.push(point);
        });
    } else {
        args = Array.prototype.slice.call(arguments).slice(2);
        var px = null;
        args.forEach(function(val) {
            if (px === null) {
                px = val;
            } else {
                points.push({x: px, y: val});
                px = null;
            }
        });
    }
    return this.append(new createjs.Graphics.Polygon(x, y, points));
};


stage = new createjs.Stage("demoCanvas");
poly1 = new createjs.Shape();
poly1.graphics.beginFill("Red").drawPolygon(0,0,10,10,10,40,40,30,60,5,30,0);
poly1.x = 10;
poly1.y = 10;
stage.addChild(poly1);
stage.update();
 

(если есть более удобный или даже правильный способ сделать треугольник, и это поможет в решении моей проблемы, я с радостью приму ваше решение).

Далее я просто накладываю эллипс, нарисованный с помощью DrawEllipse, поверх этого треугольника.

Я понимаю, что, возможно, я делаю что-то не так, и именно поэтому я здесь.

Любая помощь будет принята!

Ответ №1:

Я предполагаю, что вы используете графический API для рисования своего контента. Если это так, вам просто нужно убедиться, что «отверстие» рисуется с обратной намоткой. Это просто означает, что фигуру нужно рисовать в обратном направлении.

Например, метод Canvas2D rect рисует по часовой стрелке, поэтому для вычитания из них инструкции нужно рисовать в другом направлении.

 var s = new createjs.Shape();
s.graphics.beginFill("red")
    .drawRect(0,0,300,300) // Draw a square

    // Then draw a smaller square
    .moveTo(100,100) // Top left
    .lineTo(100,200) // Bottom left
    .lineTo(200,200) // Bottom right
    .lineTo(200,100) // Top right
    .lineTo(100,100) // Top left
    .closePath();    // Optional if you are done
 

У drawEllipse него есть anticlockwise параметр, который также выполняет трюк. Вот пример jsfiddle, который на самом деле рисует его другим способом (сначала небольшой вырез), но с тем же результатом.

Обновить

Для того, чтобы фигура «вырезала» другую, она должна быть частью того же экземпляра graphics и частью тех же инструкций path . Если вы closePath() выполняете какие-либо инструкции по рисованию, любые новые инструкции рисуются поверх этого, не вырезая его. Использование отдельных экземпляров формы делает это автоматически.

Используя обновленный код, я добавил простой drawEllipse() вызов с использованием намотки по часовой стрелке по умолчанию, и он вырезал круг: https://jsfiddle.net/lannymcnie/yd25h8se / — Обратите внимание, что я увеличил масштаб координат выше x10, чтобы сделать их более заметными.

Приветствия,

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

1. Привет. На этой странице в документации я не могу найти anticlockwise параметр.

2. Я добавил некоторую дополнительную информацию о моей проблеме в разделе вопросов.

3. Добавлено еще несколько деталей с использованием вашего примера кода.

4. Это работает, но как я могу установить regX, regY и другие реквизиты для этого эллипса?

5. Эллипсы в EaselJS имеют четыре свойства createjs.com/docs/easeljs/classes /… (похоже, API исключает направление). В regX/regY основном это верхний левый угол фигуры. Вы не можете поместить отдельную точку регистрации в подмножество инструкций, но вы можете сместить x / y для компенсации. Что-то еще, что вы можете сделать, это сохранить ссылку на команду ellipse и просто обновить ее реквизиты. Вот пример: jsfiddle.net/lannymcnie/yd25h8se/7 … Если вы хотите повернуть или исказить его, вам понадобится более сложное решение.