Вращение точки вокруг начала координат в 2D сходится к 0 - PullRequest
0 голосов
/ 01 декабря 2018

Следующий код написан для поворота точки вокруг начала координат в 2D.Однако вместо того, чтобы идти по кругу, он продолжает сходиться к центру.(изначально работал на Three.js) Этот код работает абсолютно правильно.(Я делал это на других платформах и даже запустил численное моделирование в листе Excel).

Почему это происходит?

<body>
    <div id="vals"></div>
    <script>

        theta = Math.PI / 90.0;
        var x = 1;
        var y = 1;

        var element = document.getElementById("vals");

        var i;
        for (i = 0; i < 10000; i++){
            var r = Math.sqrt( x * x + y * y );
            var para = document.createElement("pre");
            var node = document.createTextNode("x="+x+"     y="+y+"     r="+r);
            para.appendChild(node);
            element.appendChild(para);
            x = (x * Math.cos(theta)) - (y * Math.sin(theta));
            y = (y * Math.cos(theta)) + (x * Math.sin(theta));
        }
    </script>
</body>

ps Я знаю, что если я нормализую значения иумножьте на величину, я бы получил правильный ответ.Однако я хочу знать, почему эта вещь не работает.

1 Ответ

0 голосов
/ 01 декабря 2018

Сначала вы применяете измененное x значение, чтобы получить y.Это просто неправильно.Вместо этого запомните старое значение и используйте его.

     var tempx = x;
     x = (x * Math.cos(theta)) - (y * Math.sin(theta));
     y = (y * Math.cos(theta)) + (tempx * Math.sin(theta));

Второе: повторное использование тех же значений вызывает накопление ошибок, поэтому радиус может сходиться - именно так, как вы видите.Таким образом, более точный подход заключается в сохранении начальных значений и их повороте с использованием текущего угла (не разности углов)

    var x0 = 1;
    var y0 = 1;

        in the loop:
    x = (x0 * Math.cos(theta * i)) - (y0 * Math.sin(theta * i));
    y = (y0 * Math.cos(theta * i)) + (x0 * Math.sin(theta * i));
...