Javascript 如何从最后一个半径饰面绘制

Javascript 如何从最后一个半径饰面绘制,javascript,css,d3.js,charts,donut-chart,Javascript,Css,D3.js,Charts,Donut Chart,我需要在绿色半径的继续处绘制 我试图以相同的半径绘制,但是,que值从角度0开始,但我需要从绿色的结束角度开始绘制 <!DOCTYPE html> <head> <meta HTTP-EQUIV="X-UA-COMPATIBLE" CONTENT="IE=EmulateIE9" > <script type="text/javascript" src="scripts/d3.min.js"></script>

我需要在绿色半径的继续处绘制

我试图以相同的半径绘制,但是,que值从角度0开始,但我需要从绿色的结束角度开始绘制

<!DOCTYPE html>
<head>
    <meta HTTP-EQUIV="X-UA-COMPATIBLE" CONTENT="IE=EmulateIE9" >
    <script type="text/javascript" src="scripts/d3.min.js"></script>

    <link type="text/css" rel="stylesheet" href="styles/style.css">

    <style>

        body {
            background-color: #FFFFFF;
        }


        #outer {
            background:#FFFFFF;
            border-radius: 5px;
            color: #000;
        }

        #div2{
            width: 100%;
            height: 200px;
            box-sizing: border-box;
            float: left;

        }

        #div2 .arc {
            stroke-weight: 0.1;
            fill: #16A765;

        }

        #div2 .arc2 {
            stroke-weight: 0.1;
            fill: #777777;

        }
        #div2 .arc3 {
            stroke-weight: 0.1;
            fill: #EE9A00;

        }

        #div2 .arc4 {
            stroke-weight: 0.1;
            fill: #7171C6;

        }


        .radial {
            border-radius: 3px;
            background: #FFFFFF;
            color: #000;
            display: none;

        }


    </style>
</head>

<body>

<div id='outer' style="margin-top:40px; padding:10px">
    <div id="main" style="width:600; height:200px; margin: 0px auto; ">
        <div id="div2"></div>
    </div>
</div>



<script language="JavaScript">



    start();



    function labelFunction(val,min,max) {

    }

    function deselect() {
        div2.attr("class","radial");
    }

    function start() {

        var rp2 = radialProgress(document.getElementById('div2'))
                .diameter(250)

                //verd
                .value(15000)
                //gris
                .value2(30000)
                //taronja
                .value3(15000)
                //blau
                .value4(35000)

                .render();
    }

    function radialProgress(parent) {
    var _data=null,
        _duration= 1000,
        _selection,
        _margin = {top:0, right:0, bottom:0, left:0},
        __width = 300,
        __height = 300,
        _diameter = 150,
        _label="",
        _fontSize=10;

    var _mouseClick;

    var _value  = 0,
        _value2 =0,
        _value3 =0,
        _value4 =0,
        _minValue = 0,
        _maxValue = 86400;

    var  _currentArc= 0, _currentArc2= 0, _currentArc3= 0, _currentArc4=0, _currentValue=0;

    var _arc = d3.svg.arc()
        .startAngle(0 * (Math.PI/180)); //just radians

    var _arc2 = d3.svg.arc()
        .startAngle(0 * (Math.PI/180))
        .endAngle(0); //just radians

    var _arc3 = d3.svg.arc()
        .startAngle(0 * (Math.PI/180))
        .endAngle(0); //just radians


    var _arc4 = d3.svg.arc()
        .startAngle(0 * (Math.PI/180))
        .endAngle(0); //just radians

    _selection=d3.select(parent);


    function component() {

        _selection.each(function (data) {

            // Select the svg element, if it exists.
            var svg = d3.select(this).selectAll("svg").data([data]);
            var enter = svg.enter().append("svg").attr("class","radial-svg").append("g");

            measure();

            svg.attr("width", __width)
               .attr("height", __height);


            var background = enter.append("g").attr("class","component")
                .on("click",onMouseClick);


            _arc.endAngle(360 * (Math.PI/180))

            background.append("rect")
                .attr("class","background")
                .attr("width", _width)
                .attr("height", _height);

            background.append("path")
                .attr("transform", "translate(" + _width/2 + "," + _width/2 + ")")
                .attr("d", _arc);


            _arc.endAngle(_currentArc);

            enter.append("g").attr("class", "arcs");
            var path = svg.select(".arcs").selectAll(".arc").data(data);
            path.enter().append("path")
                .attr("class","arc")
                .attr("transform", "translate(" + _width/2 + "," + _width/2 + ")")
                .attr("d", _arc);


            var path2 = svg.select(".arcs").selectAll(".arc2").data(data);
            path2.enter().append("path")
                .attr("class","arc2")
                .attr("transform", "translate(" + _width/2 + "," + _width/2 + ")")
                .attr("d", _arc2);


            var path3 = svg.select(".arcs").selectAll(".arc3").data(data);
            path3.enter().append("path")
                .attr("class","arc3")
                .attr("transform", "translate(" + _width/2 + "," + _width/2 + ")")
                .attr("d", _arc3);

            var path4 = svg.select(".arcs").selectAll(".arc4").data(data);
            path4.enter().append("path")
                .attr("class","arc4")
                .attr("transform", "translate(" + _width/2 + "," + _width/2 + ")")
                .attr("d", _arc4);


            enter.append("g").attr("class", "labels");
            var label = svg.select(".labels").selectAll(".label").data(data);
            label.enter().append("text")
                .attr("class","label")
                .attr("y",_width/2+_fontSize/3)
                .attr("x",_width/2)
                .attr("width",_width)
                // .attr("x",(3*_fontSize/2))
                .style("font-size",_fontSize+"px")
                .on("click",onMouseClick);

            path.exit().transition().duration(500).attr("x",1000).remove();

            layout(svg);

            function layout(svg) {

                var ratio4=(_value4-_minValue)/(_maxValue-_minValue);
                var ratio3=(_value3-_minValue)/(_maxValue-_minValue);
                var ratio2=(_value2-_minValue)/(_maxValue-_minValue);
                var ratio=(_value-_minValue)/(_maxValue-_minValue);
                var endAngle=Math.min(360*ratio,360);
                endAngle=endAngle * Math.PI/180;

                path.datum(endAngle);
                path.transition().duration(_duration)
                    .attrTween("d", arcTween);



                    path2.datum(Math.min(360*(ratio2),360) * Math.PI/180);
                    path2.transition().delay(_duration).duration(_duration)
                        .attrTween("d", arcTween2);


                    path3.datum(Math.min(360*(ratio3),360) * Math.PI/180);
                    path3.transition().delay(_duration).duration(_duration)
                        .attrTween("d", arcTween3);

                    path4.datum(Math.min(360*(-ratio4),360) * Math.PI/180);
                    path4.transition().delay(_duration).duration(_duration)
                        .attrTween("d", arcTween4);


                label.datum(Math.round(ratio*100));
                label.transition().duration(_duration)
                    .tween("text",labelTween);

            }

        });

        function onMouseClick(d) {
            if (typeof _mouseClick == "function") {
                _mouseClick.call();
            }
        }
    }

    function labelTween(a) {
        var i = d3.interpolate(_currentValue, a);
        _currentValue = i(0);

        return function(t) {
            _currentValue = i(t);
           this.textContent = "";
        }
    }

    function arcTween(a) {
        var i = d3.interpolate(_currentArc, a);

        return function(t) {
            _currentArc=i(t);
            return _arc.endAngle(i(t))();
        };
    }

    function arcTween2(a) {
        var i = d3.interpolate(_currentArc2, a);

        return function(t) {
            return _arc2.endAngle(i(t))();
        };
    }

    function arcTween3(a) {
        var i = d3.interpolate(_currentArc3, a);

        return function(t) {
            return _arc3.endAngle(i(t))();
        };
    }

    function arcTween4(a) {
        var i = d3.interpolate(_currentArc4, a);

        return function(t) {
            return _arc4.endAngle(i(t))();
        };
    }


    function measure() {
        _width=_diameter - _margin.right - _margin.left - _margin.top - _margin.bottom;
        _height=_width;
        _fontSize=_width*.2;

        _arc.outerRadius(_width/2);
        _arc.innerRadius(_width/2 * .70);

        _arc2.outerRadius(_width/2 * .70);
        _arc2.innerRadius(_width/2 * .70 - (_width/2 * .15));

        _arc3.outerRadius(_width/2 * .55);
        _arc3.innerRadius(_width/2 * .55 - (_width/2 * .15));

        _arc4.outerRadius(_width/2 * .99);
        _arc4.innerRadius(_width/2 * .99 - (_width/2 * .0,5));
    }


    component.render = function() {
        measure();
        component();
        return component;
    }

    component.value = function (_) {
        if (!arguments.length) return _value;
        _value = [_];
        _selection.datum([_value]);
        return component;
    }
    component.value2 = function (_) {
        if (!arguments.length) return _value2;
        _value2 = [_];
        _selection.datum([_value2]);
        return component;
    }
    component.value3 = function (_) {
        if (!arguments.length) return _value3;
        _value3 = [_];
        _selection.datum([_value3]);
        return component;
    }
    component.value4 = function (_) {
        if (!arguments.length) return _value4;
        _value4 = [_];
        _selection.datum([_value4]);
        return component;
    }

    component.margin = function(_) {
        if (!arguments.length) return _margin;
        _margin = _;
        return component;
    };

    component.diameter = function(_) {
        if (!arguments.length) return _diameter
        _diameter =  _;
        return component;
    };

    component.minValue = function(_) {
        if (!arguments.length) return _minValue;
        _minValue = _;
        return component;
    };

    component.maxValue = function(_) {
        if (!arguments.length) return _maxValue;
        _maxValue = _;
        return component;
    };

    component.label = function(_) {
        if (!arguments.length) return _label;
        _label = _;
        return component;
    };

    component._duration = function(_) {
        if (!arguments.length) return _duration;
        _duration = _;
        return component;
    };

    component.onClick = function (_) {
        if (!arguments.length) return _mouseClick;
        _mouseClick=_;
        return component;
    }

    return component;

}





</script>

</body>
</html>

身体{
背景色:#FFFFFF;
}
#外{
背景:#FFFFFF;
边界半径:5px;
颜色:#000;
}
#第二组{
宽度:100%;
高度:200px;
框大小:边框框;
浮动:左;
}
#第2部分:弧{
冲程重量:0.1;
填充:#16A765;
}
#第2部分arc2{
冲程重量:0.1;
填充:#777777;
}
#第2.3分部{
冲程重量:0.1;
填写:#EE9A00;
}
#第2部分arc4{
冲程重量:0.1;
填充:#7171C6;
}
.放射状{
边界半径:3px;
背景:#FFFFFF;
颜色:#000;
显示:无;
}
start();
功能标签功能(val、min、max){
}
函数取消选择(){
第2部分:属性(“类”、“放射状”);
}
函数start(){
var rp2=radialProgress(document.getElementById('div2'))
.直径(250)
//佛得角
.价值(15000)
//格里斯
.2(30000)
//塔罗尼亚
.3(15000)
//布劳
.价值4(35000)
.render();
}
函数半径进程(父级){
var_data=null,
_持续时间=1000,
_选择,
_边距={top:0,right:0,bottom:0,left:0},
__宽度=300,
__高度=300,
_直径=150,
_label=“”,
_fontSize=10;
var_鼠标点击;
var_值=0,
_值2=0,
_值3=0,
_值4=0,
_最小值=0,
_最大值=86400;
var _currentArc=0,_currentArc2=0,_currentArc3=0,_currentArc4=0,_currentValue=0;
var_arc=d3.svg.arc()
.startAngle(0*(Math.PI/180));//只有弧度
var_arc2=d3.svg.arc()
.startAngle(0*(数学PI/180))
.endAngle(0);//只有弧度
var_arc3=d3.svg.arc()
.startAngle(0*(数学PI/180))
.endAngle(0);//只有弧度
var_arc4=d3.svg.arc()
.startAngle(0*(数学PI/180))
.endAngle(0);//只有弧度
_选择=d3。选择(父项);
函数组件(){
_选择。每个功能(数据){
//选择svg元素(如果存在)。
var svg=d3.select(this.selectAll(“svg”).data([data]);
var enter=svg.enter().append(“svg”).attr(“class”,“radial svg”).append(“g”);
度量();
属性(“宽度”,“宽度”)
.attr(“高度”和“高度”);
var background=enter.append(“g”).attr(“类”、“组件”)
.on(“单击”,onMouseClick);
_圆弧端角(360*(数学PI/180))
background.append(“rect”)
.attr(“类别”、“背景”)
.attr(“宽度”、\u宽度)
.attr(“高度”、_高度);
background.append(“路径”)
.attr(“转换”、“转换”(“+”宽度/2+”,“+”宽度/2+”)
.attr(“d”,_弧);
_弧端角(_currentArc);
输入.append(“g”).attr(“class”,“arcs”);
var path=svg.select(“.arcs”).selectAll(“.arc”).data(数据);
path.enter().append(“路径”)
.attr(“类”、“弧”)
.attr(“转换”、“转换”(“+”宽度/2+”,“+”宽度/2+”)
.attr(“d”,_弧);
var path2=svg.select(“.arcs”).selectAll(“.arc2”).data(数据);
路径2.enter().append(“路径”)
.attr(“类别”、“arc2”)
.attr(“转换”、“转换”(“+”宽度/2+”,“+”宽度/2+”)
.attr(“d”,_arc2);
var path3=svg.select(“.arcs”).selectAll(“.arc3”).data(数据);
path3.enter().append(“路径”)
.attr(“类别”、“arc3”)
.attr(“转换”、“转换”(“+”宽度/2+”,“+”宽度/2+”)
.attr(“d”,_arc3);
var path4=svg.select(“.arcs”).selectAll(“.arc4”).data(数据);
path4.enter().append(“路径”)
.attr(“类别”、“arc4”)
.attr(“转换”、“转换”(“+”宽度/2+”,“+”宽度/2+”)
.attr(“d”,_arc4);
输入。附加(“g”).attr(“类别”、“标签”);
var label=svg。选择(“.labels”)。选择所有(“.label”)。数据(数据);
label.enter().append(“文本”)
.attr(“类别”、“标签”)
.attr(“y”,_宽度/2+_字体大小/3)
.attr(“x”,_宽度/2)
.attr(“宽度”、\u宽度)
//.attr(“x”,(3*fontSize/2))
.style(“字体大小”,“字体大小+”px”)
.on(“单击”,onMouseClick);
path.exit().transition().duration(500).attr(“x”,1000).remove();
布局(svg);
功能布局(svg){
var比率4=(最大值-minValue)/(最大值-minValue);
var比率3=(\u值3-\u最小值)/(\u最大值-\u最小值);
var比率=(\u value2-\u minValue)/(\u maxValue-\u minValue);
var比率=(\u值-\u最小值)/(\u最大值-\u最小值);
变量端角=数学最小值(360*比率,360);
endAngle=endAngle*Math.PI/180;
路径基准(端角);
path.transition().duration(_duration)
.attrTween(“d”,arcTween);
路径2.基准(数学最小值(360*(比率),360)*数学PI/180);
路径2.transition().delay(\u duration).duration(\u duration)
.attrTween(“d”,Arctween 2);
路径3.基准面(数学最小值(360*(比率),360)*数学PI/180)
_arc4.startAngle(endAngle);//endangle of the green path 
function arcTween4(a) {
    var i = d3.interpolate(_arc4.startAngle()(), a);//start from endangle 

    return function(t) {
        return _arc4.endAngle(i(t))();
    };
}