【问题标题】:Draw line start from the center of each sector in donut chart?从圆环图中每个扇区的中心开始画线?
【发布时间】:2014-07-03 02:20:36
【问题描述】:

我需要你的帮助,我有以下我用画布绘制的圆环图

这是我用来绘制它的代码

    <canvas id="chart" width="500" height="500" style="background-color:black">  </canvas>

    <script type="text/javascript">

        var canvas  = document.getElementById("chart");
        var chart = canvas.getContext("2d");

        function drawdountChart(canvas)
        {

            this.x , this.y , this.radius , this.lineWidth , this.strockStyle , this.from , this.to = null;
            this.set = function( x, y, radius, from, to, lineWidth, strockStyle)
            {
                this.x = x;
                this.y = y;
                this.radius = radius;
                this.from=from;
                this.to= to;
                this.lineWidth = lineWidth;
                this.strockStyle = strockStyle; 
            }

            this.draw = function(data)
            {
                canvas.beginPath();
                canvas.lineWidth = this.lineWidth;
                canvas.strokeStyle = this.strockStyle;
                canvas.arc(this.x , this.y , this.radius , this.from , this.to);
                canvas.stroke();
                var numberOfParts = data.numberOfParts;
                var parts = data.parts.pt;
                var colors = data.colors.cs;
                var artPercentage = null;
                var beginFrom = 0;
               for(var i = 0; i<numberOfParts; i++)
               {
                percentage= parts[i]/this.radius;
                canvas.beginPath();
                canvas.lineWidth=30;
                canvas.strokeStyle = colors[i];
                canvas.arc(this.x , this.y ,this.radius , beginFrom , (Math.PI*2*percentage)+beginFrom); 
                beginFrom = (Math.PI*2*percentage)+beginFrom;
                canvas.stroke();
               }
            }
        }
        var data = 
            {
                numberOfParts: 4,
                parts:{"pt": [10, 25, 40, 25]},
                colors:{"cs": ["red", "green", "blue", "yellow" ]}, 
                comments:{coms:["comment1", "comment2", "comment3", "comment4" ]}
            };

        var drawDount = new drawdountChart(chart);
        drawDount.set(150, 150, 100, 0, Math.PI*2, 30, "#FFF");
        drawDount.draw(data);



    </script>


</body>

可以注意到起始位置是(150X150),半径是100

我需要从每个扇区的中心开始画一条线,但我不知道该怎么做,正确的数学方程是什么???

【问题讨论】:

    标签: javascript html math canvas


    【解决方案1】:

    演示:http://jsfiddle.net/m1erickson/Phfx4/

    您可以像这样计算从 radianAngle1 到 radianAngle2 的弧的中心点:

    var midAngle = (radianAngle2 - radianAngle1)/2;
    
    var x = centerX + radius * Math.cos( midAngle );
    
    var y = centerY + radius * Math.sin( midAngle );
    

    这就是如何从每条弧线的中心到中点画线:

    var PI2=Math.PI*2;
    accumPt=0;
    for(var i=0;i<data.parts.pt.length;i++){
        var pt=data.parts.pt[i];
        var midPt=accumPt+pt/2;
        var midAngle=PI2*midPt/100;
        console.log(i,pt,midPt);
        accumPt+=pt;
        var x=150+100*Math.cos(midAngle);
        var y=150+100*Math.sin(midAngle);
        chart.save();
        chart.beginPath();
        chart.moveTo(150,150);
        chart.lineTo(x,y);
        chart.lineWidth=3;
        chart.strokeStyle="black";
        chart.stroke();
        chart.restore();
    }
    

    这是示例代码和演示

    var canvas = document.getElementById("canvas");
    var chart = canvas.getContext("2d");
    
    function drawdountChart(canvas) {
    
        this.x, this.y, this.radius, this.lineWidth, this.strockStyle, this.from, this.to = null;
        this.set = function (x, y, radius, from, to, lineWidth, strockStyle) {
            this.x = x;
            this.y = y;
            this.radius = radius;
            this.from = from;
            this.to = to;
            this.lineWidth = lineWidth;
            this.strockStyle = strockStyle;
        }
    
        this.draw = function (data) {
            canvas.beginPath();
            canvas.lineWidth = this.lineWidth;
            canvas.strokeStyle = this.strockStyle;
            canvas.arc(this.x, this.y, this.radius, this.from, this.to);
            canvas.stroke();
            var numberOfParts = data.numberOfParts;
            var parts = data.parts.pt;
            var colors = data.colors.cs;
            var artPercentage = null;
            var beginFrom = 0;
            for (var i = 0; i < numberOfParts; i++) {
                percentage = parts[i] / this.radius;
                canvas.beginPath();
                canvas.lineWidth = 30;
                canvas.strokeStyle = colors[i];
                canvas.arc(this.x, this.y, this.radius, beginFrom, (Math.PI * 2 * percentage) + beginFrom);
                beginFrom = (Math.PI * 2 * percentage) + beginFrom;
                canvas.stroke();
            }
        }
    }
    var data = {
        numberOfParts: 4,
        parts: {
            "pt": [10, 25, 40, 25]
        },
        colors: {
            "cs": ["red", "green", "blue", "yellow"]
        },
        comments: {
            coms: ["comment1", "comment2", "comment3", "comment4"]
        }
    };
    
    var drawDount = new drawdountChart(chart);
    drawDount.set(150, 150, 100, 0, Math.PI * 2, 30, "#FFF");
    drawDount.draw(data);
    
    
    var PI2 = Math.PI * 2;
    accumPt = 0;
    for (var i = 0; i < data.parts.pt.length; i++) {
        var pt = data.parts.pt[i];
        var midPt = accumPt + pt / 2;
        var midAngle = PI2 * midPt / 100;
        console.log(i, pt, midPt);
        accumPt += pt;
        var x = 150 + 100 * Math.cos(midAngle);
        var y = 150 + 100 * Math.sin(midAngle);
        chart.save();
        chart.beginPath();
        chart.moveTo(150, 150);
        chart.lineTo(x, y);
        chart.lineWidth = 3;
        chart.strokeStyle = "black";
        chart.stroke();
        chart.restore();
    }
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
    <h4>Lines from center to arc midpoints.</h4>
    <canvas id="canvas" width=300 height=300></canvas>

    【讨论】:

    • thanx 但我需要将它们从每个扇区的中心绘制到圆外
    • 没问题,只需将半径(目前为100)调整为更大以满足您的设计需要:EG:var x=150+140*Math.cos(midAngle); var y=150+140*Math.sin(midAngle);
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多