使用for循环递增值时计算n的值

时间:2014-05-01 00:41:36

标签: algorithm flash function math for-loop

首先,抱歉标题不好。我不太确定如何标题这个主题,所以请随时根据需要进行修改。

我在给定尺寸的舞台上画X环。为了给这种深度感,每个环向屏幕边界的宽度稍宽:

enter image description here

最大的圆环应该与舞台的最大尺寸一样宽(请注意,在图片中我绘制了3个在舞台边界外绘制的额外圆环)。它也应该是最小环的两倍宽。有戒指我指的是2个红色圆圈之间的空间。

在计算了_innerRadius,这是最小环的宽度之后,我正在使用

绘制它们
const RINGS:Number = 10;    //the amount of rings, note we will draw 3 extra rings to fill the screen
const DEPTH:Number = 7; //the amount of size difference between rings to create depth effect

var radius:Number = 0;
for (var i:uint = 0; i < RINGS + 3; i++) {
    radius += _innerRadius + _innerRadius * ((i*DEPTH) / (RINGS - 1));
    _graphics.lineStyle(1, 0xFF0000, 1);
    _graphics.drawCircle(0, 0, radius * .5);
}

底部的一个滑块从0到100,是绿色环的半径的百分比,从最小环到最大环。

我尝试在最小半径和最大半径之间进行练习,如果DEPTH值为1则可以正常工作。但是我不希望环之间的距离为了深度幻觉而相同。< / p>

现在我一直试图弄清楚这几个小时,但似乎我遇到了一堵墙......似乎我需要某种非线性公式。我怎样才能计算出基于的半径滑块百分比值?有效地用于从最小的红圈到最大的红圈之间或之间的任何地方?

谢谢!

[编辑] 这是我对_innerRadius

的计算示例
//lets calculate _innerRadius for 10 rings
//inner ring width =         X + 0/9 * X;
//ring 1 width =         X + 1/9 * X;
//ring 2 width =         X + 2/9 * X
//ring 3 width =         X + 3/9 * X 
//ring 4 width =         X + 4/9 * X 
//ring 5 width =         X + 5/9 * X
//ring 6 width =         X + 6/9 * X
//ring 8 width =         X + 7/9 * X
//ring 9 width =         X + 8/9 * X
//ring 10 width =        X + 9/9 * X

//extent = Math.max(stage.stageWidth, stage.stageHeight);
//now we should solve extent = X + (X + 0/9 * X) + (X + 1/9 * X) + (X + 2/9 * X) + (X + 3/9 * X) + (X + 4/9 * X) + (X + 5/9 * X) + (X + 6/9 * X) + (X + 7/9 * X) + (X + 8/9 * X) + (X + 9/9 * X);
//lets add all X's
//extent = 10 * X + 45/9 * X
//extent = 15 * X;
//now reverse to solve for _innerRadius
//_innerRadius = extent / 15;

1 个答案:

答案 0 :(得分:1)

绘图算法的工作方式,您的半径为:

r[i + 1] = r[i] + (1 + i*a)*r0

其中adepth / (rings - 1)的常量。这导致:

r0
r1 = r0 + (1 + a)*r0 = (2 + a)*r0
r2 = r1 + (1 + 2*a)*r0 = (3 + 3*a)*r0
r3 = r2 + (1 + 3*a)*r0 = (4 + 6*a)*r0
     ...
rn = (1 + n + a * sum(1 ... n))*r0
   = (1 + n + a * n*(n - 1) / 2)*r0

因为您希望响铃n - 1与您的外半径相对应(让我们暂时忘记三个额外的响铃),您会得到:

r[n - 1] = (n + (n - 1)*(n - 2) / 2)*r0
       a = 2 * (extent / r0 - n) / (n - 1) / (n - 2)

然后你可以绘制戒指:

for (var i = 0; i < rings; i++) {
    r = (1 + i + 0.5 * a * (i - 1)*i) * r0;
    // draw circle with radius r
}

在计算a时,您必须至少有三个响铃才能将除数除以零。另请注意,对于所有组合,这不会产生良好的结果:如果外圈和内圈的比率小于圈数,则会得到负a并且深度效果会反转。

创建深度效果的另一种可能更简单的方法是使每个圆的半径为前一个的常数倍:

r[i + 1] = r[i] * c

r[i] = r0 * Math.pow(c, i)

并像这样绘制它们:

c = Math.pow(extent / r0, 1 / (rings - 1))

r = r0
for (var i = 0; i < rings; i++) {
    // draw circle with radius r        
    r *= c;
}

这将创造一个积极的&#34;只要半径比为正,就会产生深度效应。 (当然,只要有一个以上的戒指。)