下面是產生在使用公知的公式笛卡爾座標的 「填充」 圓(盤)的代碼:餡餅在笛卡爾座標系
(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;
}
}
}
}
題外話:計算平方根很慢。在循環前更好地計算'半徑*半徑',並將其與'scanx *(scanx-2 * x)+ x * x + scany *(scany-2 * y)+ y * y'(='dist * dist ')在每次迭代。另請注意'x * x'比'Math.pow(x,2)'快,因爲函數調用很慢。 – Oriol
你總是可以問一下wolfram alpha:http://www.wolframalpha.com/input/?i=parametric+equation+of+arc –
此外,而不是循環通過無用的值,更好地改善你的循環爲'for(var scanx = Math.max(x-radius,0),直到x = Math.min(x + radius,params.width); scanx params.width) ' –
Oriol