javascript - 在Javascript Canvas 绘图中,如何消除arc()中的线条?

标签 javascript html canvas geometric-arc

我正在尝试用 Javascript 在 Canvas 上绘制弧线,但我想去掉 Javascript 自动绘制的线。画线的时候,有两个问题: a) fill() 故障 b) 它看起来像一把弓

这是我拥有的和我想要的图像:Arcs 左边是我在 JS 中的,右边是我在 Java 中的。 Java 实现效率相当低,我想使用已有的功能。

以下是相关的JS函数:

function pointAt(center, l, theta){
    return {
        x : Math.sin(theta) * l + center.x,
        y : Math.cos(theta) * l + center.y
    };
}

function drawArc(ctx, center, l, theta, sweep, label, thickness){
    var p0 = pointAt(center, l, theta);
    var p1 = pointAt(center, l + thickness, theta);
    var p2 = pointAt(center, l + thickness, theta + sweep);
    var p3 = pointAt(center, l, theta + sweep);
    ctx.fillStyle = "red";
    drawPoint(ctx, p0);
    ctx.fillStyle = "blue";
    drawPoint(ctx, p1);
    ctx.fillStyle = "green";
    drawPoint(ctx, p2);
    ctx.fillStyle = "yellow";
    drawPoint(ctx, p3);

    ctx.beginPath();
    ctx.moveTo(p0.x, p0.y);
    ctx.lineTo(p1.x, p1.y);
    ctx.arc(center.x, center.y, l + thickness, theta, theta + sweep, false);
    ctx.moveTo(p2.x, p2.y);
    ctx.lineTo(p3.x, p3.y);
    ctx.arc(center.x, center.y, l, theta + sweep, theta, true)
    ctx.closePath();
    ctx.fill();
    ctx.stroke();

    //TODO: draw label!!!
}

function drawPoint(ctx, p){
    ctx.fillRect(p.x - 4, p.y - 4, 8, 8);
}

这是 Java 中的一个有效实现:

       private static void drawArc(Graphics g, Point center, int l, double theta, double sweep, String label, int thickness){
        for (double i = 0; i < thickness; i+=.5) { //hardcoded
            Point last = pointAt(center, l + i, theta);
            for(double t = theta; t < theta + sweep; t+=.01){
                Point cur = pointAt(center, l + i, t);
                g.drawLine(last.x, last.y, cur.x, cur.y);
                last = cur;
            }
        }
        double t = theta + sweep / 2;
        Point p = pointAt(center, l + 15, t);
        int size = g.getFontMetrics().stringWidth(label);
        BufferedImage img = new BufferedImage(size * 2, size * 2, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();
        g2.setColor(Color.RED);
        double rot = (Math.PI / 2 - t);
//      System.out.println(rot / Math.PI + "PI");
        boolean b = true;
        if(rot < -Math.PI / 2){
            rot += Math.PI;
            b = false;
        }
        g2.setTransform(AffineTransform.getRotateInstance(rot, size, size));
        g2.drawString(label, size, size);
        g2.dispose();
        if(!b)
            size *= 1.75; //magic value or hardcoded???
        g.drawImage(img, p.x - size, p.y - size, null);
    }

所以我的问题是: 如何将香蕉变成粗弧线?

最佳答案

只需顺时针绘制外圆弧,然后逆时针绘制内圆弧即可。 Canvas 会自动为您用直线封闭两端。

var c = document.getElementById('c');
var ctx = c.getContext('2d');
ctx.beginPath();
ctx.arc(0,0,50,0,-Math.PI * 0.5, false);
ctx.arc(0,0,25,-Math.PI * 0.5,0, true);
ctx.fillStyle = '#0f0';
ctx.fill();
ctx.strokeStyle = '#0f0';
ctx.stroke();
ctx.closePath();

http://jsfiddle.net/tMEdq/

此外,这里还有一些很好的引用: http://diveintohtml5.ep.io/canvas.html#divingin http://www.nihilogic.dk/labs/canvas_sheet/HTML5_Canvas_Cheat_Sheet.png

关于javascript - 在Javascript Canvas 绘图中,如何消除arc()中的线条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6525483/

相关文章:

javascript - Zurb 基金会 6 : the topbar doesn´t collapse

php - 我得到一个空白的动态 html 表

html - 用于确认、错误和警告消息的语义 HTML

javascript - HTML5 Canvas - 为什么矩形的颜色总是返回黑色?

javascript - 如何使两个 Canvas 元素发生碰撞

javascript - 如何从 $scope.$on 返回一些值到 $scope.$emit

javascript - 使用 jQuery 重置链接的背景颜色

c# - WPF: Canvas 吞噬 MouseDownEvent?

javascript - 在 div 标签中使用 javascript 将 UL 添加到 HTML 时被捕获并出错

javascript - 以 TextArea 背景作为实时计数器的 TextArea 字符限制器