如何使用 CreateJs 在多边形中打洞?
How to make a hole in a polygon with CreateJs?
正如您在附图中看到的那样,它有一个菱形,里面的椭圆几乎是透明的。
但这只是一张图片。
如何使用 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 绘制的椭圆叠加在这个三角形上。
我知道我可能做错了什么,这就是我来这里的原因。
我们会接受任何帮助!
我假设您正在使用图形 API 来绘制您的内容。如果是这样,您只需要确保“孔”以反向 缠绕 绘制。这只是意味着形状需要在相反的方向绘制。
比如Canvas2Drect方法是顺时针绘制的,所以要减去它们,指令需要反方向绘制
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 以上放大到让它更显眼。
干杯,
正如您在附图中看到的那样,它有一个菱形,里面的椭圆几乎是透明的。
但这只是一张图片。
如何使用 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 绘制的椭圆叠加在这个三角形上。
我知道我可能做错了什么,这就是我来这里的原因。
我们会接受任何帮助!
我假设您正在使用图形 API 来绘制您的内容。如果是这样,您只需要确保“孔”以反向 缠绕 绘制。这只是意味着形状需要在相反的方向绘制。
比如Canvas2Drect方法是顺时针绘制的,所以要减去它们,指令需要反方向绘制
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 以上放大到让它更显眼。
干杯,