【问题标题】:Calculating value for n when incrementing a value using a for loop使用 for 循环递增值时计算 n 的值
【发布时间】:2014-05-01 00:41:36
【问题描述】:

首先,抱歉标题不好。我不确定如何为这个主题命名,因此请随时在必要时对其进行修改。

我在我的舞台内绘制了给定尺寸的 X 环。为了给它一些深度感,朝向屏幕边界的每个环都稍微宽一些:

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

在计算出最小环的宽度 _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,则效果很好。但是,为了产生深度错觉,我不希望环之间的距离相同。

现在我已经尝试解决这个问题几个小时了,但似乎我碰壁了..似乎我需要某种非线性公式在这里..我将如何计算基于滑块百分比值?对从最小到最大的红色圆圈之间或红色圆圈之间的任何位置有效吗?

谢谢!

[编辑] 这是我的 _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;

【问题讨论】:

    标签: algorithm flash function math for-loop


    【解决方案1】:

    你的绘图算法的工作方式,你的半径是:

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

    其中a 是一个常量depth / (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;
    }
    

    只要半径比率为正,这将产生“正”的深度效果。 (当然,只要有不止一个环。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2016-12-22
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多