根据方位计算x和y

时间:2019-06-04 10:18:21

标签: javascript math rotation geometry trigonometry

我有一个屏幕,我想根据角度计算下一个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 个答案:

答案 0 :(得分:5)

图:

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);
}