下面是产生在使用公知的公式笛卡尔坐标的 “填充” 圆(盘)的代码:馅饼在笛卡尔坐标系
(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