如何在Canvas中制作药丸形状?(基本上是圆角矩形)

Tod*_*nce 2 html canvas

正在玩一个突破性的克隆并想要制作圆角的道具。

有人能指出我正确的方向吗?

谢谢!

650*_*502 7

一个简单的方法是使用quadraticCurveTo平滑角

在此输入图像描述

let roundRect = (ctx, x0, y0, x1, y1, r, color) => {
      var w = x1 - x0;
      var h = y1 - y0;
      if (r > w/2) r = w/2;
      if (r > h/2) r = h/2;
      ctx.beginPath();
      ctx.moveTo(x1 - r, y0);
      ctx.quadraticCurveTo(x1, y0, x1, y0 + r);
      ctx.lineTo(x1, y1-r);
      ctx.quadraticCurveTo(x1, y1, x1 - r, y1);
      ctx.lineTo(x0 + r, y1);
      ctx.quadraticCurveTo(x0, y1, x0, y1 - r);
      ctx.lineTo(x0, y0 + r);
      ctx.quadraticCurveTo(x0, y0, x0 + r, y0);
      ctx.closePath();
      ctx.fillStyle = color;
      ctx.fill();
  },
  ctx = document.getElementById("canvas").getContext("2d");
  
roundRect(ctx, 50, 50, 150, 100, 5, "#F00");
roundRect(ctx, 50, 110, 100, 160, 10, "#00F");
roundRect(ctx, 53, 113, 97, 157, 7, "#0F0");
Run Code Online (Sandbox Code Playgroud)
<canvas id="canvas" width="200" height="180"></canvas>
Run Code Online (Sandbox Code Playgroud)

  • @Phrogz:使用贝塞尔弧使得各向异性舍入变得微不足道,并且四分之一圆和二次贝塞尔弧之间的差异在我看来足够小,在大多数情况下都可以接受。在我看来,Canvas `arc/arcTo` 的设计相当糟糕(我什至在过去发现了浏览器之间的兼容性问题):我通常使用 `arc` 只是为了绘制完整的圆。您对重复项的看法是正确的,但在我看来,贝塞尔二次曲线更适合这种用途。 (2认同)