【发布时间】:2014-03-03 03:16:32
【问题描述】:
以下是使用众所周知的公式在笛卡尔坐标中生成“实心”圆(圆盘)的代码:
(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;
}
}
}
}
【问题讨论】:
-
题外话:计算平方根很慢。最好在循环之前计算
radius*radius,并在每次迭代时将其与scanx*(scanx-2*x)+x*x+scany*(scany-2*y)+y*y(=dist*dist) 进行比较。还要注意x*x比Math.pow(x,2)快,因为函数调用很慢。 -
您可以随时询问 wolfram alpha:wolframalpha.com/input/?i=parametric+equation+of+arc
-
此外,与其循环遍历无用的值,不如将循环改进为
for(var scanx=Math.max(x-radius,0), untilx=Math.min(x+radius,params.width); scanx<untilx; ++scanx),并摆脱if(scanx<0 || scanx>params.width)
标签: javascript math