1

私は円形のセクターを持っています。セクターを徐々にアニメートして完全な円にしたいのですが、どうすれば Rapheal.js で作成できますか。

ところで、私はSVGが初めてで、svg-editorを使用してSVGを使用して形状を描画しています。

これが私のコードです

  var arcPath1 = paper.path("m325.30255,127.93972c33.86002,6.238 52.02301,8.85 90.823,49.616l105.53491,-65.494c-44.84491,-59.9466 -101.70261,-109.25547 -201.98761,-108.83956l5.6297,124.71756z");

arcPath1.attr({
    "fill": "#003a60",
    stroke: 'none'
});

arcPath1.rotate(1.0569896697998047 ,420.6666870117177,90.38764953613116);
arcPath1.node.id= "arch1";

ここに私のコードの例がありますhttp://jsfiddle.net/v2KeV/

完全な円になるようにパスを完成させるアニメーションを作成するにはどうすればよいですか?

注:私が作ったアニメーションは、パスアニメーションをテストするだけです..

4

1 に答える 1

2

まず最初に、円弧セグメントを適切にアニメーション化するには、円弧セグメントをプログラムで生成できる必要があります。この不器用な三角法を考えてみてください。

// arcPath:
// cx, cy are the center point
// inner_radius and outer_radius describe the distance of the arc segment's inner and outer boundaries from the center point.
// starting_radians describes the offset of the segment start;
// arc_radians describes the width of the arg segment.

function arcPath( cx, cy, inner_radius, outer_radius, starting_radians, arc_radians )
{
    var x1 = cx + Math.cos( starting_radians ) * inner_radius;
    var y1 = cy + Math.sin( starting_radians ) * inner_radius;
    var x2 = cx + Math.cos( starting_radians ) * outer_radius;
    var y2 = cy + Math.sin( starting_radians ) * outer_radius;
    var x3 = cx + Math.cos( starting_radians + arc_radians ) * outer_radius;
    var y3 = cy + Math.sin( starting_radians + arc_radians ) * outer_radius;
    var x4 = cx + Math.cos( starting_radians + arc_radians ) * inner_radius;
    var y4 = cy + Math.sin( starting_radians + arc_radians ) * inner_radius;

    var pathstr = "M" + x1 + "," + y1 + " "
                    + "L" + x2 + "," + y2 + " "
                    + "A" + outer_radius + "," + outer_radius + " " + arc_radians + " " + ( arc_radians > Math.PI ? "1" : "0" ) + " 1 " + x3 + "," + y3 + " "
                    + "L" + x4 + "," + y4 + " "
                    + "A" + inner_radius + "," + inner_radius + " " + ( 0 - arc_radians ) + " " + ( arc_radians > Math.PI ? "1" : "0" ) + " 0 " + x1 + "," + y1 + " z";

     return pathstr;                   
}        

より単純な幾何学的構造を使用すると、次のように、部分的な円弧セグメントから円弧セグメント全体へのパスをアニメーション化し、Raphael にリフトを任せることができます。

var arcPath1 = paper.path(arcPath( 150, 150, 75, 125, Math.PI / 2, Math.PI * 0.65 ) )
    .attr({ fill: "#003a60", 'fill-opacity': 0.5, stroke: 'black' });

arcPath1.click(function () 
    {
        arcPath1.animate( { path: arcPath( 150, 150, 75, 125, Math.PI / 2, Math.PI * 2 - 0.0001 ) }, 2000, "<>" );
    });

残念なことに、Raphael はこれに関してまったくひどい仕事をしているため、希望するアーク スイープではなく、交差するアーク セグメントが爆発して完全な円に再形成されてしまいます。したがって、希望どおりに動作させるには、アニメーションを手動で実行する必要があります。

function arcSweep( arc, x, y, inner, outer, angle_offset, from_sweep, to_sweep, duration )
{
    var steps = 100;
    var current_step = 0;
    var intervalID = setInterval( function()
                 {
                     current_step++;
                     if ( current_step >= steps )
                         clearInterval( intervalID );
                     arc.attr( { path: arcPath( x, y, inner, outer, angle_offset, from_sweep + ( ( to_sweep - from_sweep ) * ( current_step / steps ) ) ) } );
                 }, duration / steps );
}

したがって、基本的には、一連の中間円弧を計算し、目標角度に達するまで順番に設定します。アニメーション関数は、ターゲットの終了角度 (Math.PI * 2 であってはなりません。これは、空の円弧セグメントとして計算されるためです!) に加えて、円弧の元のパラメーターをすべて必要とします。円弧セグメントの各インスタンスが独自の変数を追跡できるように、これをクラスに抽象化することが望ましい場合があります。

これは、完成品を示すフィドルです。

于 2012-07-16T18:57:52.993 に答える