0

Tomer による d3jsを使用したカスタム ゲージ( https://gist.github.com/1499279 ) をいじっています。彼のコードでは、アニメーション化するポインターの乱数を生成するために呼び出します。ポインターが再レンダリングされないように変更しました。updateGauges() gauges[key].redraw(30 + 50 * Math.random() - 30 * Math.random());gauges[key].redraw(80);

初期ロード中、ポインターは、アーチ型の軌道 (実際のゲージの動作のように時計回り) でアニメーション化するのではなく、目的地に到達するための最短経路をたどります。パラメーターとして 80 が渡されると、ポインターは 0 から反時計回りにアニメーション化されます。代わりに、常にアーチ型の軌跡をたどる必要があります。

何を変更/追加する必要があると思いますか?

*ソルン更新:

this.drawPointer = function(value)
{
    var delta = this.config.range / 13;
    var n=value/2;

    var head = this.valueToPoint(n, 0.85);
    var head1 = this.valueToPoint(n - delta, 0.12);
    var head2 = this.valueToPoint(n + delta, 0.12);

    var headlast = this.valueToPoint(value, 0.85);
    var head1last = this.valueToPoint(value - delta, 0.12);
    var head2last = this.valueToPoint(value + delta, 0.12);

    var tailValue = n -  (this.config.range * (1/(270/360)) / 2);
    var tail = this.valueToPoint(tailValue, 0.28);
    var tail1 = this.valueToPoint(tailValue - delta, 0.12);
    var tail2 = this.valueToPoint(tailValue + delta, 0.12);

    var tailValuelast = value -  (this.config.range * (1/(270/360)) / 2);
    var taillast = this.valueToPoint(tailValuelast, 0.28);
    var tail1last = this.valueToPoint(tailValuelast - delta, 0.12);
    var tail2last = this.valueToPoint(tailValuelast + delta, 0.12);


    var data = [head, head1, tail2, tail, tail1, head2, head];

    var line = d3.svg.line()
                        .x(function(d) { return d.x })
                        .y(function(d) { return d.y })
                        .interpolate("basis");


    var pointerContainer = this.body.select(".pointerContainer");   

    var pointer = pointerContainer.selectAll("path").data([data])                                       

    pointer.enter()
            .append("svg:path")
                .attr("d", line)
                .style("fill", "#dc3912")
                .style("stroke", "#c63310")
                .style("fill-opacity", 0.7)

    pointer.transition()
                .attr("d", line) 
                .each("end", function () {      
                if (value!=0) {

                        var head = headlast;
                        var head1 = head1last;
                        var head2 = head2last;

                        var tailValue = tailValuelast;
                        var tail = taillast;
                        var tail1 = tail1last;
                        var tail2 = tail2last;

                        var data = [head, head1, tail2, tail, tail1, head2, head];

                        var line = d3.svg.line()
                                        .x(function(d) { return d.x })
                                        .y(function(d) { return d.y })
                                        .interpolate("basis");

                        var pointer = pointerContainer.selectAll("path").data([data])                                       

                        pointer.enter()
                            .append("svg:path")
                                .attr("d", line)
                                .style("fill", "#dc3912")
                                .style("stroke", "#c63310")
                                .style("fill-opacity", 0.7)

                        pointer.transition()
                                .attr("d", line) 
                                .ease("bounce")
                                .duration(600); 
                            }
                }
                )
                .duration(200);

    var fontSize = Math.round(this.config.size / 10);
    pointerContainer.selectAll("text")
                        .data([value])
                            .text(Math.round(value))
                        .enter()
                            .append("svg:text")
                                .attr("x", this.config.cx)
                                .attr("y", this.config.size - this.config.cy / 4 - fontSize)                        
                                .attr("dy", fontSize / 2)
                                .attr("text-anchor", "middle")
                                .text(Math.round(value))
                                .style("font-size", fontSize + "px")
                                .style("fill", "#000")
                                .style("stroke-width", "0px");
}

よろしく、
Viswesh

4

1 に答える 1

0

私もD3は初めてですが、私の謙虚な理解は次のとおりです(間違っている場合は修正してください):

var line = d3.svg.line()
    .x(function(d) { return d.x })
    .y(function(d) { return d.y })
    .interpolate("basis");

ここで、補間は単に x と y の値を現在の値から目標値に変更します。

あなたの場合、y値は現在の値から変更する必要があります->最高点(100)->ターゲット値に。

私が考えることができる解決策の1つは、コントロールポイントを追加することです。

于 2012-11-17T02:33:21.753 に答える