算法:用于解析x,y的度数的函数,用于绘制SVG饼图

saz*_*azr 1 html javascript algorithm svg

我正在使用SVG图形绘制饼图.给我一个饼图的度数 - 例如277度 - 和直径 - 例如200px - 我需要绘制一个277度的圆.

使用SVG图形,我需要将277度解析为该圆圈结束的点.

我不是最好的数学,所以我想出了一个公式/ javascript函数,它允许我取一个度数值并拿出ax,y指向圆圈结束的位置.

我的Javascript函数(在底部)会正确地将度数解析为正确的点吗?你能帮助我开发算法以获得度数值的坐标吗?或者也许我可以使用现有的算法,我不知道?

我的算法:(我需要帮助)
所以给出的值是:圆直径:200px,圆形尺寸:277度.

  • 我需要在点0,0周围旋转时277结束的点.
  • 277在第一象限结束,这意味着我需要使用罪(这是正确的吗?)
  • 所以我现在知道的三角形值是:斜边= 100px(半径),角度= 7度(277-270).

    sin(7)= o/100; 0.1219 = o/100; o = 12.2;

  • 因此y点是12.2(对于我的sakes,0,0是左上角所以它的中间y-x = 100-12.2 = 87.8;(这是正确的吗?)

  • 现在确定x pos,我使用cos(这是正确的吗?).

    cos(7)= a/100; a = 99.25;

  • 因此x点为99.25或100-99.25 = 0.75;

所以277度的x,y坐标是0.75,87.8.那是对的吗?

所以在代码中这个算法将是:

function resolveToPoint( deg, diameter )
{
    if ( deg <= 0)
        return 0;

    var x     = 0;
    var y     = 0;
    var angle = 0;
    var rad   = diameter/2;
    var midX  = rad;
    var midY  = rad;

    if (deg <= 90)
        angle = 90 - deg;
    else if (deg <= 180)
        angle = deg - 90;
    else if (deg <= 270)
        angle = deg - 180;
    else if (deg <= 360)
        angle = deg - 270;

    // Q: Will I ALWAYS use cos to determine the x & sin for the x NO MATTER what quadrant the angle is in??
    x = Math.cos(angle) * rad;
    y = Math.sin(angle) * rad;

    if (deg <= 90)
    {
        x = midX + x;
        y = midY - y;
    }
    else if (deg <= 180)
    {
        x = midX + x;
        y = midY + y;
    }
    else if (deg <= 270)
    {
        x = midX - x;
        y = midY + y;
    }
    else if (deg <= 360)
    {
        x = midX - x;
        y = midY - y;
    }

    return {mX: x, mY: y};
}
Run Code Online (Sandbox Code Playgroud)

然后我将在SVG中使用它,如下所示:

function outputPiegraph( point, rad, diameter )
{  
    var svg = '<svg width="%spx" height=""%spx" id='pie' style="background-color: green;">
    <path d="M%spx,%spx L%spx, %spx A%spx,"%spx 1 1,1 %spx,%spx z"
     fill="red" stroke="blue" stroke-width="2" />"
</svg>';


    return sprintf(svg, diameter, diameter, point.mX, point.mY, rad, rad, rad, diameter);
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*dic 6

这是从极坐标到笛卡尔坐标的简单转换:

function resolveToPoint(deg, diameter) {
    var rad = Math.PI * deg / 180;
    var r = diameter / 2;
    return {mX: r * Math.cos(rad), mY: r * Math.sin(rad)};
}
Run Code Online (Sandbox Code Playgroud)

http://en.wikipedia.org/wiki/Polar_coordinates#Converting_between_polar_and_Cartesian_coordinates