【问题标题】:How to make a hole in a polygon with CreateJs?如何使用 CreateJs 在多边形上打洞?
【发布时间】:2021-04-20 13:07:52
【问题描述】:

正如您在附图中看到的那样,它有菱形,里面有椭圆,几乎是透明的。

但这只是一张图片。

如何使用 createjs 创建它?

更详细的问题描述:

你在图片中看到的并不是我所需要的。 理想情况下,我的任务是用这个菱形制作两个三角形,里面有一个椭圆。

椭圆应该在三角形中创建某种透明度,以便该三角形下方的所有元素都可以看到。

我的实现:

我根据这个例子做一个三角形: (感谢fiddle

(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 绘制的椭圆覆盖在这个三角形的顶部。

我知道我可能做错了什么,这就是我在这里的原因。

任何帮助都会被接受!

【问题讨论】:

    标签: javascript canvas createjs


    【解决方案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 sample,实际上是以另一种方式绘制的(首先是小切口),但结果相同。

    更新

    为了让形状“切出”另一个形状,它必须是同一图形实例的一部分,并且是同一路径指令的一部分。如果您在任何绘图指令之后closePath(),则任何新指令都将在此之上绘制而不会将其删除。使用单独的形状实例会自动执行此操作。

    使用更新后的代码,我添加了一个简单的drawEllipse() 调用,使用默认的顺时针缠绕,它切出了圆圈:https://jsfiddle.net/lannymcnie/yd25h8se/ -- 请注意,我将坐标从 x10 放大以使其更明显。

    干杯,

    【讨论】:

    • 嗨。在文档中的这个page 上,我找不到anticlockwise 参数。
    • 我在问题部分添加了一些关于我的问题的附加信息。
    • 使用您的代码示例添加了更多详细信息。
    • 它工作正常,但是,我怎样才能将 regX、regY 和其他道具设置为这个椭圆?
    • EaselJS 中的椭圆有四个属性 createjs.com/docs/easeljs/classes/…(看起来 API 不包括方向)。 regX/regY 基本上是形状的左上角。您不能在指令的子集上放置单独的注册点,但您可以偏移 x/y 以进行补偿。您可以做的其他事情是存储对 ellipse 命令的引用并仅更新其道具。这是一个示例:jsfiddle.net/lannymcnie/yd25h8se/7 ... 如果您想旋转或倾斜它,您将需要一个更复杂的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多