Функция Loop добавляет неточные значения к переменным, а массив не определяется при трассировке кода. Как исправить? - PullRequest
1 голос
/ 02 ноября 2019

Я сделал имитацию движения снаряда в ACS3, и одна из функций включает создание многомерного массива, который отображает время в зависимости от высоты шара, учитывая входной угол и скорость.

Когда я проследил значенияпеременная 't' должна иметь приращения 0,1, однако в некоторых случаях она дает мне приблизительные значения (например, вместо 0,8 она дает 0,7999999 ...). Кроме того, значение массива равно «undefined».

Я не знаю, что еще можно попробовать, потому что, если переменная в цикле равна t = t + 0.1;, то она не должнапоказать приблизительные значения.

Я также попытался добавить скорость * Math.sin (угол / (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 ...) вместе с вычисленным значением позиции вместо «неопределенного» (которое основано на уравнении SUVAT). Таким образом, ожидаемые результаты будут выглядеть следующим образом:

0,1

(расчетная позиция в момент времени 0,1)

0,2

(расчетная позиция в момент времени 0,2)

0,3

(расчетная позиция в момент времени 0,3)

... и продолжается до тех пор, пока переменная 't' не станет больше, чем вычисленная 'Время'.

Вместо этого я получаю:

0.1

undefined

0.2

undefined

0.30000000000000004 // Нижняя строка ... чтоиметь дело с этим?

undefined // Или с этим?

0.4

undefined

0.5

undefined

0,6

не определено

0,7

не определено

0,7999999999999999

не определено

0,8999999999999999

не определено

и т.д ...

1 Ответ

0 голосов
/ 03 ноября 2019
  • Когда я отслеживал значения, переменная '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 #1, либо на Door #2, но компилятор потерпит неудачу, если попытаетесь проверить на Door #0.8.

(2)
В языках программирования целое число представляет собой целое число (используйте Number или Float или Long для дробей).

Ваш код 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, тем дольше заморозка.

...