Loop函数将不准确的值添加到变量,并且在跟踪代码时未定义数组。如何解决?

问题描述 投票:0回答:1

[我在ACS3中进行了弹丸运动仿真,其中一个功能涉及创建多维数组,该多维数组在给定输入角度和速度的情况下将时间与球的高度相对应绘制。

当我跟踪这些值时,'t'变量应该以0.1为增量,但是,在某些情况下,它为我提供了近似值(例如,不是0.8,而是0.7999999...。)。此外,数组的值为'undefined'。

我不知道还有什么可以尝试的,因为如果循环中的变量是t = t + 0.1 ;,则不应显示任何近似值。

[我也试图添加速度* Math.sin(angle /(180 / Math.PI))而不是vy(y速度分量)。

shoot.addEventListener(MouseEvent.CLICK, Calculate);

function Calculate(event:MouseEvent):void{

var t = 0;
var position:Array = new Array();

var vy = velocity*Math.sin(angle/(180/Math.PI));
var Time = int(((2*vy)/9.81)*100)/100
    time_txt.text = Time;

while (t <= Time){

    position[t]= (vy*t)-4.905*(t*t);
    t = t + 0.1;
    trace(t);
    trace(position[t]);

}

}

我希望控制台打印正确的时间间隔(0.1,0.2,0.3 ...)以及计算出的位置值,而不是'undefined'(这是基于SUVAT方程的)。因此,预期结果将如下所示:

0.1

((在时间0.1处的计算位置)

0.2

((在时间0.2处的计算位置)

0.3

((时间0.3的计算位置)

...一直继续到变量't'大于计算的'时间'。

相反,我得到:

0.1

未定义

0.2

未定义

0.30000000000000004 //底线是...这是怎么回事?

未定义//还是这个?

0.4

未定义

0.5

未定义

0.6

未定义

0.7

未定义

0.7999999999999999

未定义

0.8999999999999999

未定义

等...

arrays loops actionscript-3 actionscript undefined
1个回答
0
投票
  • 当我追踪这些值时,“ t”变量应该具有0.1的增量,但是,在某些情况下,它为我提供了近似值(例如,代替了0.8,它给了我0.7999999。 ..)。
  • 此外,数组的值为undefined

这里是一个可测试的示例代码,可能有助于解决您的问题。它在做什么吗?

function Calculate(event:MouseEvent):void { var velocity :int = 4; //temp for testing var angle :int = 45; //temp for testing var t :Number = 0; var position :Array = new Array(); var pos_idx :int = 0; //your position within the array var vy = velocity*Math.sin(angle/(180/Math.PI)); //var Time = int(((2*vy)/9.81)*100)/100 var Time :Number = 6.5; //temp small value for testing time_txt.text = Time; while(t <= Time) { position[ pos_idx ] = (vy * t) - 4.905 * (t * t); trace("position[" + pos_idx + "]: " + position[ pos_idx ] ); t += 0.1; t = Number( t.toFixed(3) ); //rounding down the fraction part trace("t is: " + t); pos_idx += 1; //add +1 for next position within array } }

关于您的问题:

((1)数组位置为“ undefined”的问题是因为数组的位置是整数而不是分数。数组表示“事物组”(thing1,thing2,thing3等),因此,例如,如果您的事物是门,那么您可以查看Door #1Door #2,但是如果尝试检查Door #0.8,则编译器将失败]。

((2)在编程语言中,整数是整数(对于小数,请使用NumberFloatLong)。

您的代码var Time :int = int( ((2*vy)/9.81) * 100) / 100;的结果可能为

(例如:当angle为45时),因为((2*vy)/9.81) * 100) / 100;的结果为0.5766416156465218,但是如果将其强制转换为int,则现在忽略小数部分,因此将其四舍五入为0的结果。

((3)

PS:在运行很长时间的While循环中使用轨迹时要小心。如果必须在每个循环中报告一个trace,这可能会暂时冻结您的应用程序。 Time越大,冻结时间越长。
© www.soinside.com 2019 - 2024. All rights reserved.