gpt4 book ai didi

javascript - 如何计算两点之间的 Angular ?

转载 作者:行者123 更新时间:2023-12-04 02:39:47 26 4
gpt4 key购买 nike

我正在尝试用 Javascript 创建一个基于 2d 瓷砖的游戏,我需要能够计算两点之间的 Angular 。我正在使用 atan2 函数来查找两点之间的 Angular ,如下所示:

function getAngleDegrees(fromX, fromY, toX, toY, force360 = true) {
let deltaX = toX - fromX;
let deltaY = toY - fromY;
let radians = Math.atan2(deltaY, deltaX);
let degrees = (radians * 180) / Math.PI;
if (force360) {
while (degrees >= 360) degrees -= 360;
while (degrees < 0) degrees += 360;
}
return degrees;
}

但是,这并没有为我提供正确的结果。我检查了代码中的逻辑或数学错误,但找不到任何错误。无论我向这个函数输入什么点,结果都会偏离很多度。

我创建了一个 JS fiddle 来可视化问题:

https://jsfiddle.net/fa6o7wdy/40/

如果有人知道如何修复我的 Angular 函数以提供正确的结果,请帮助!

编辑:

这是问题的图片:

https://imgur.com/a/OXDCOux

最佳答案

根据您提供的照片样本,为了使用当前的 Math.atan() 函数获得所需的 Angular ,您需要先反转,然后再将 Angular 逆时针旋转 90 度

function getAngleDegrees(fromX,fromY,toX,toY,force360 = true) {
let deltaX = fromX-toX;
let deltaY = fromY-toY; // reverse
let radians = Math.atan2(deltaY, deltaX)
let degrees = (radians * 180) / Math.PI - 90; // rotate
if (force360) {
while (degrees >= 360) degrees -= 360;
while (degrees < 0) degrees += 360;
}
console.log('angle to degree:',{deltaX,deltaY,radians,degrees})
return degrees;
}

或者在不改变 deltaXdeltaY

的情况下简单地向这条线旋转 + 90 度

令度数 = (弧度 * 180)/Math.PI + 90;//旋转

注意:我还没有测试所有可能的边缘情况

const inBlk = document.createElement('i')
, getXY = (p,xy) => Number(p.split('-')[xy==='x'?0:1])
;
for(let i=0;i<100;i++) // build Grid
{
let nI = inBlk.cloneNode()
, u1 = i%10
;
nI.textContent = u1+'-'+(i-u1)/10
grid.appendChild(nI)
}
let points = [ {x:0, y:0, old:null}, {x:0, y:0, old:null}]
, pN = 0
;
grid.onclick=e=>
{
if (!e.target.matches('i')) return

let elm = e.target.textContent
points[pN].x = getXY(elm, 'x')
points[pN].y = getXY(elm, 'y')

if (points[pN].old ) points[pN].old.classList.remove('color_0', 'color_1')

points[pN].old = e.target
points[pN].old.classList.add(`color_${pN}` )

pN = ++pN %2
if (pN==0) angle.textContent = ` angle: ${getAngleDegrees(points[0],points[1])}°`
}

function getAngleDegrees( from, to, force360 =true)
{
let deltaX = from.x - to.x
, deltaY = from.y - to.y // reverse
, radians = Math.atan2(deltaY, deltaX)
, degrees = (radians * 180) / Math.PI - 90 // rotate
;
if (force360)
{
while (degrees >= 360) degrees -= 360;
while (degrees < 0) degrees += 360;
}
return degrees.toFixed(2)
}
:root { --sz-hw: 26px; }
#grid {
font-family: 'Courier New', Courier, monospace;
font-size : 10px;
margin : calc( var(--sz-hw) /2);
}
#grid i {
display : block;
float : left;
width : var(--sz-hw);
height : var(--sz-hw);
border : 1px solid grey;
text-align : center;
margin : 2px;
line-height: var(--sz-hw);
cursor : pointer;
}
#grid i:nth-child(10n-9) {clear: both; }
.color_0 { background-color: lightcoral; }
.color_1 { background-color: lightgreen; }
#angle { padding: calc( var(--sz-hw) /2) 0 0 calc( var(--sz-hw) *13.4); }
<p id="grid"></p>

<h4 id="angle">angle: ?</h4>

关于javascript - 如何计算两点之间的 Angular ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59903415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com