1

raphael js の中心にある円弧を描くスレッドから、必要な正確な円弧アニメーションを取得しました

ただし、この円弧の別のインスタンスが反時計回りに描かれる必要がありますが、これは時計回りにしか見えません。この円弧を反時計回りに描画してアニメートすることは可能ですか?

回答された質問のコード スニペット:

// Custom Arc Attribute, position x&y, value portion of total, total value, Radius
var archtype = Raphael("canvas", 200, 100);
archtype.customAttributes.arc = function (xloc, yloc, value, total, R) {
    var alpha = 360 / total * value,
        a = (90 - alpha) * Math.PI / 180,
        x = xloc + R * Math.cos(a),
        y = yloc - R * Math.sin(a),
        path;
    if (total == value) {
        path = [
            ["M", xloc, yloc - R],
            ["A", R, R, 0, 1, 1, xloc - 0.01, yloc - R]
        ];
    } else {
        path = [
            ["M", xloc, yloc - R],
            ["A", R, R, 0, +(alpha > 180), 1, x, y]
        ];
    }
    return {
        path: path
    };
};

//make an arc at 50,50 with a radius of 30 that grows from 0 to 40 of 100 with a bounce
var my_arc = archtype.path().attr({
    "stroke": "#f00",
    "stroke-width": 14,
    arc: [50, 50, 0, 100, 30]
});

my_arc.animate({
    arc: [50, 50, 40, 100, 30]
}, 1500, "bounce");
4

4 に答える 4

3

Kevin が言ったように、sweep_flag セットが必要で、いくつかの変数を反転する必要があります。これが反時計回りの最終的なコードです。

paper.customAttributes.arc = function (xloc, yloc, value, total, R) {
var alpha = 360 / total * value, 
    a = (90 - alpha) * Math.PI / 180, 
    x = xloc - R * Math.cos(a), 
    y = yloc - R * Math.sin(a),
    path;
    console.log(x);
if (total == value) {
    path = [
        ["M", xloc, yloc - R],
        ["A", R, R, 0, 1, 1, xloc - 0.01, yloc - R]
    ];
} else {
    path = [
        ["M", xloc, yloc - R],
        ["A", R, R, 0, +(alpha > 180), 0, x, y]
    ];
}
return {
    path: path
};
};
于 2013-03-04T10:04:42.990 に答える
0

あなたの質問への答えは、svg1.1仕様の楕円弧に関するw3cドキュメントに埋もれています。あなたが探していたのはスイープフラグでした.1(全体で使用しています)は時計回りのアークになり、0は反時計回りのアークになります。数か月前にこの質問に出くわしたとき、RaphaelJS.com で質問に答えられるものが何も見つからず、非常に腹が立ちました。

これはいくつかの方法で実装できますが、おそらく次のような方法が最も簡単な方法です。

archtype.customAttributes.arc = function (xloc, yloc, value, total, R, sweep_flag ) {
    sweep_flag = sweep_flag || 1;
    var alpha = 360 / total * value,
        a = (90 - alpha) * Math.PI / 180,
        x = xloc + R * Math.cos(a),
        y = yloc - R * Math.sin(a),
        path;
    if (total == value) {
        path = [
            ["M", xloc, yloc - R],
            ["A", R, R, 0, 1, sweep_flag, xloc - 0.01, yloc - R]
        ];
    } else {
        path = [
            ["M", xloc, yloc - R],
            ["A", R, R, 0, +(alpha > 180), sweep_flag, x, y]
        ];
    }
    return {
        path: path
    };
};

これを使用すると、オプションの 6 番目のパラメーターを使用して円弧の方向を制御できるはずです。

于 2012-08-20T17:29:45.200 に答える
0

これを使用すると、負の数をvalueパラメーターに渡すことができます。

r.ca.arc = function(centerX, centerY, value, total, radius){
    var
        angle = value / total * 359.99,
        absAngle = Math.abs(angle),
        a = Math.PI / 180 * (90 - angle),
        x = centerX + radius * Math.cos(a),
        y = centerY - radius * Math.sin(a),
        sweep = +(value >= 0),
        path;

        path = [
            ['M', centerX, centerY - radius],
            ['A', radius, radius, 0, +(absAngle > 180), sweep, x, y]
        ];

        return { 'path': path };
};
于 2013-08-24T11:25:36.303 に答える
0

円弧自体を反時計回りにする方法はわかりませんでしたが、このトピックの CSS を使用して SVG 自体をミラーリングすることができました。

于 2012-08-19T20:10:10.773 に答える