我有一个屏幕,我想根据角度计算下一个x和y。 第一步是此示例从步骤1开始。 我该如何计算下一个要增加120的脚步,而下一个脚步需要在60左右的范围内编织。
请记住,起点可能是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);
}
答案 0 :(得分:5)
图:
步进方向(黑线)由(cos θ, sin θ)
给出。步距偏移方向(小蓝线)由(sin θ, -cos θ)
位置重复性由下式给出:
s
确定下一个足迹位于黑线的哪一侧,即,左脚为-1,右脚为+1。
如果您知道起始位置c0
和起始脚s0
,则可以通过以下方式给出封闭形式的解决方案:
每步都会在双脚之间交替。
在您的图表示例中,参数为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);
}