2014-03-02 149 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

相關問題