javascript - HTML/JS 形状减法

标签 javascript html html5-canvas shapes

在 HTML5/JS 中有没有办法创建一个复合形状,例如,从一个封闭的矩形中减去一个多边形?目的是对复合形状进行不透明填充,但多边形内部是透明的。

最佳答案

当然,您甚至可以使用 fill-rule 来完成此操作而无需合成。

Canvas 支持两种填充规则,默认 non-zero winding以及 even-odd规则(有关详细信息,请参阅链接)。

通过使用后者,在内部扫描每条线并计算交叉点的数量。然后填充奇数和偶数边界之间的线段,在这种情况下,这允许我们将一个多边形封装在另一个多边形中,并且只填充它们之间的空间。

result

使用填充规则的示例代码

var ctx = c.getContext("2d");

// enclosing rectangle
ctx.rect(10, 10, 280, 130);

// some interior shape inside
ctx.rotate(0.2);
ctx.rect(60, 20, 200, 50);

ctx.fill("evenodd");
body {background:#ddd}
<canvas id=c></canvas>

当然,合成也是可能的,但这需要一张“白纸”开始,因为它取决于 alpha channel 。

使用“source-over”合成模式以正常方式绘制第一个形状。然后切换到“destination-out”,这将根据新绘图中的像素删除任何现有的非透明像素。在这种情况下,它将使用新形状在以前的形状上打洞。

使用合成的示例代码

var ctx = c.getContext("2d");

// enclosing rectangle
ctx.fillRect(10, 10, 280, 130);

// some interior shape inside
ctx.rotate(0.2);
ctx.globalCompositeOperation = "destination-out";  // will "punch-out" background
ctx.fillRect(60, 20, 200, 50);
body {background:#ddd}
<canvas id=c></canvas>

关于javascript - HTML/JS 形状减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37614453/

相关文章:

javascript - 居中不是div中的所有内容

javascript - 在表格内创建 Highcharts 饼图图例

javascript - 为什么我的 css/js 下拉菜单在到达末尾之前就隐藏了?

html - 如何编写 html 电子邮件以打印出两个单独的页面?

html - 我应该用什么代替框架?

php - htmlspecialchars 输出空白

javascript - 为什么 document.getElementById 返回空值?

javascript - 隐藏 HTML 标签上的溢出使浏览器跳转到页面顶部

javascript - 如何在悬停时在 Canvas 元素中制作阴影效果

javascript - 放下图像后如何在 Canvas 中显示图像的宽度,高度和 Angular 值