如何在画布上画出光滑的椭圆形

San*_*ate 5 javascript css html5 canvas fabricjs

我试图在我的画布中使用ctx.clip属性绘制一个光滑的椭圆.我已完成绘图部分我面临椭圆弧线清晰度的问题.任何人对此有任何想法让我知道吗?这是我的代码.

<canvas id="c" width="400" height="400"></canvas>


var canvas = new fabric.Canvas('c');
var ctx = canvas.getContext('2d');
var cx=180;
var cy=200;
var w=300;
var h=250;
    // Quadratric curves example
    ctx.beginPath();
    var lx = cx - w/2,
        rx = cx + w/2,
        ty = cy - h/2,
        by = cy + h/2;
    var magic = 0.551784;
    var xmagic = magic*w/2;
    var ymagic = h*magic/2;
    ctx.moveTo(cx,ty);
    ctx.bezierCurveTo(cx+xmagic,ty,rx,cy-ymagic,rx,cy);
    ctx.bezierCurveTo(rx,cy+ymagic,cx+xmagic,by,cx,by);
    ctx.bezierCurveTo(cx-xmagic,by,lx,cy+ymagic,lx,cy);
    ctx.bezierCurveTo(lx,cy-ymagic,cx-xmagic,ty,cx,ty);

    ctx.fill();
    ctx.stroke();
    ctx.clip();



var text;
text = new fabric.Text('Honey', {
  fontSize: 50,
  left: 150,
  top: 150,
  lineHeight: 1,
  originX: 'left',
  fontFamily: 'Helvetica',
  fontWeight: 'bold'
});
canvas.add(text);
Run Code Online (Sandbox Code Playgroud)

这是我的小提琴链接

你可以在这里看到这个输出椭圆的线条边界不太清楚. 这是屏幕截图的输出

mar*_*rkE 2

一个问题在于您的显示屏的性质......

由于像素是矩形,并且您正在绘制一条曲线,因此当曲线试图将自身适合矩形空间时,您的结果将出现“锯齿”。

您可以使用视错觉来欺骗眼睛,使其看到锯齿状的椭圆形。

光学技巧:

降低背景颜色和椭圆形颜色之间的对比度。

这不是治愈方法……锯齿仍然存在。

但眼睛识别的对比度较低,并认为椭圆形更光滑。

因此,如果您的设计适应这种风格变化,这种视错觉可能会有所帮助。

这是代码和小提琴:http ://jsfiddle.net/m1erickson/vDWR3/

var cx=180;
var cy=200;
var w=300;
var h=250;

// Start with a less-contrasting background
ctx.fillStyle="#ddd";
ctx.fillRect(0,0,canvas.width,canvas.height);

ctx.beginPath();
var lx = cx - w/2,
    rx = cx + w/2,
    ty = cy - h/2,
    by = cy + h/2;
var magic = 0.551784;
var xmagic = magic*w/2;
var ymagic = h*magic/2;
ctx.moveTo(cx,ty);
ctx.bezierCurveTo(cx+xmagic,ty,rx,cy-ymagic,rx,cy);
ctx.bezierCurveTo(rx,cy+ymagic,cx+xmagic,by,cx,by);
ctx.bezierCurveTo(cx-xmagic,by,lx,cy+ymagic,lx,cy);
ctx.bezierCurveTo(lx,cy-ymagic,cx-xmagic,ty,cx,ty);

ctx.fillStyle="#555";
ctx.strokeStyle=ctx.fillStyle;
ctx.lineWidth=1.5;
ctx.stroke();
Run Code Online (Sandbox Code Playgroud)