Javascript 笛卡尔坐标中的饼图

Javascript 笛卡尔坐标中的饼图,javascript,math,Javascript,Math,下面是使用众所周知的公式在笛卡尔坐标系中生成“填充”圆(圆盘)的代码: (x-j)2+(y-k)2=r2 其中j&k是中心坐标,r是半径 它工作得很好,但现在我只想生成一个扇区,一个磁盘饼图,但仍然使用笛卡尔坐标。关于如何做到这一点有什么线索吗 for(var scanx=x-radius; scanx<x+radius; scanx+=1) { // out of extend if(scanx<0 || scanx&

下面是使用众所周知的公式在笛卡尔坐标系中生成“填充”圆(圆盘)的代码:

(x-j)2+(y-k)2=r2

其中j&k是中心坐标,r是半径

它工作得很好,但现在我只想生成一个扇区,一个磁盘饼图,但仍然使用笛卡尔坐标。关于如何做到这一点有什么线索吗

    for(var scanx=x-radius; scanx<x+radius; scanx+=1) {            
        // out of extend
        if(scanx<0 || scanx>params.width){
            continue;
        }
        for(var scany=y-radius; scany<y+radius; scany+=1) {

            if(scany<0 || scany>params.height) {
              continue;
            }                  

            var dist = Math.sqrt(Math.pow((scanx-x), 2)+Math.pow((scany-y), 2));

            if(dist > radius) {
                continue;
            } else {
                var v = data - params.step * Math.pow(dist, degree);
                var id = scanx+scany*params.width;
                if(value[id]){
                   value[id] = Math.max(value[id], v); 
                } else {
                    value[id] = v;
                }
            }
        }
    }    

对于(var scanx=x-radius;scanx您可以使用画布:

var canvas = document.getElementById('canvas'),
    ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
ctx.lineTo(x, y);
ctx.closePath();
ctx.fill();

通过定义要输出的x轴和y轴的截面,可以绘制曲线的一段

因此,如果要打印圆的第一个象限,可以将循环的“x”限制在
0
x+半径之间,将循环的“y”限制在
0
y+半径之间

如果您正在根据起始角度
θ1
和最终角度
θ2
查找输出,则需要使用以下公式将其从极坐标转换为笛卡尔坐标:

x1 = r × cos( θ1 ); y1 = r × sin( θ1 ); 
x2 = r × cos( θ2 ); y2 = r × sin( θ2 );
然后使用值x1、x2作为循环边界的x,使用y1和y2作为循环边界的y

使用此方法的一个警告:


如果弧距大于45度,则需要将弧距从起点到最近的轴分成若干段,并获得最大坐标值。或者,您可以循环角度步长,并从上面的极笛卡尔坐标转换打印出x-y坐标。

非主题:计算平方根很慢。最好计算
半径*ra在循环之前DIU,并在每次迭代时将其与
scanx*(scanx-2*x)+x*x+scany*(scany-2*y)+y*y
(=
dist*dist
)进行比较。还要注意
x*x
Math.pow(x,2)快
,因为函数调用很慢。您可以随时询问wolfram alpha:此外,与其循环使用无用的值,不如将循环改进为
(var scanx=Math.max(x-radius,0),直到lx=Math.min(x+radius,params.width);scanx