Рассчитать х и у на основе подшипника - PullRequest
2 голосов
/ 04 июня 2019

У меня есть экран, на котором я хотел бы рассчитать следующие x и y на основе угла. Первый шаг - этот пример начинается с шага 1. Как я могу рассчитать следующий шаг, в котором я хочу увеличить движение вперед на 120, а боковой шаг должен входить и выходить примерно из 60.

enter image description here

Пожалуйста, имейте в виду, что отправной точкой может быть x = 100, y = 100 с углом 180, поэтому шаги должны будут идти вверх по оси y.

Я попробовал следующий Javascript, но шаги, похоже, запутались:

this.startingFootPrintX = Math.floor(Math.random() * 1000) + 20; //Random number between 20 and 1000
this.startingFootPrintY = Math.floor(Math.random() * 560) + 20; //Random number between 20 and 560
this.startingAngle = Math.floor(Math.random() * 340) + 20; //Random number between 20 and 340

startFootSteps();

startFootSteps(){
console.log(this.startingFootPrintX);
console.log(this.startingFootPrintY);

this.startingFootPrintX = Math.round(Math.cos(this.startingAngle * Math.PI / 180) * 120 + this.startingFootPrintX);
this.startingFootPrintY = Math.round(Math.sin(this.startingAngle * Math.PI / 180) * 60 + this.startingFootPrintY);

setInterval(function () {
startFootSteps();
}, 3000);
}

1 Ответ

5 голосов
/ 04 июня 2019

Диаграмма:

enter image description here

Направление шага (черная линия) определяется как (cos θ, sin θ). Направление смещения шага (маленькие синие линии) задается как (sin θ, -cos θ)

Повторяемость позиции задается:

enter image description here

s определяет, на какой стороне черной линии находится следующий след, т. Е. -1 для левой ноги и +1 для правой.

Если вы знаете начальную позицию c0 и начальную ногу s0, решение в закрытой форме задается как:

enter image description here

Это чередует обе ноги для каждого шага.

В вашем примере диаграммы параметры w = 60, d = 120, θ = 40°, c0 = (96, 438), s0 = -1 (начиная с левой ноги).


ОБНОВЛЕНИЕ: фрагмент кода JavaScript

this.startingPosX = Math.floor(Math.random() * 1000) + 20;
this.startingPosY = Math.floor(Math.random() * 560) + 20;
this.startingAngle = Math.floor(Math.random() * 340) + 20;
this.startingFoot = 1 - 2 * Math.round(Math.random());   // select which foot to start with
this.stepSize = 120;
this.stepWidth = 60;

footsteps(0);

footsteps(n) {
    // should actually pre-calculate these outside but oh well
    let a = this.startingAngle * Math.PI / 180;
    let c = Math.cos(a), s = Math.sin(a);

    // current foot
    let d = this.startingFoot * (1 - 2 * (n % 2));

    // apply equations
    this.footprintX = Math.round(   
        this.startingPosX +             // initial
        this.stepSize * n * c +         // step
        this.stepWidth * 0.5 * d * s    // foot offset
    );
    this.footprintY = Math.round(
        this.startingPosY +             // initial
        this.stepSize * n * s -         // step
        this.stepWidth * 0.5 * d * c    // foot offset
    );

    // draw the foot here
    console.log(this.footprintX);
    console.log(this.footprintY);

    // increment the step counter for the next call
    setInterval(function() { footsteps(n+1); }, 3000);
}
...