2014-03-02 103 views
0

下面是产生在使用公知的公式笛卡尔坐标的 “填充” 圆(盘)的代码:馅饼在笛卡尔坐标系

(X - j)的 +(Y - K) = r

其中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; 
       } 
      } 
     } 
    }  
+0

题外话:计算平方根很慢。在循环前更好地计算'半径*半径',并将其与'scanx *(scanx-2 * x)+ x * x + scany *(scany-2 * y)+ y * y'(='dist * dist ')在每次迭代。另请注意'x * x'比'Math.pow(x,2)'快,因为函数调用很慢。 – Oriol

+0

你总是可以问一下wolfram alpha:http://www.wolframalpha.com/input/?i=parametric+equation+of+arc –

+0

此外,而不是循环通过无用的值,更好地改善你的循环为'for(var scanx = Math.max(x-radius,0),直到x = Math.min(x + radius,params.width); scanx params.width) ' – Oriol

回答

1

您可以通过定义x的部分绘制曲线的一段轴和Y轴要输出。

所以,如果你想打印圆的第一象限,你会限制你的for循环“x”来0x+radius,而你的“Y”的循环来0y+radius之间。

如果您是基于起始角度θ1和最终角度θ2寻找输出,你需要使用翻译那些从极地到笛卡尔坐标:

x1 = r × cos(θ1); y1 = r × sin(θ1); 
x2 = r × cos(θ2); y2 = r × sin(θ2); 

然后使用值X1,X2为你的X for循环边界和y1和y2作为你的y循环边界。

有一点需要注意使用此方法:

如果弧距离超过45度,则需要将它分解成段,从开始到最近的轴和获得最大的坐标值。或者,您可以循环执行角度步骤,并从上面的极坐标笛卡儿转换中打印出x-y坐标。

+0

伟大的工作!多谢 – tony590

0

你可以使用一个帆布:

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(); 

Demo

相关问题