Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何提高Math.atan()的准确性?_Javascript_Math - Fatal编程技术网

Javascript 如何提高Math.atan()的准确性?

Javascript 如何提高Math.atan()的准确性?,javascript,math,Javascript,Math,我试图在点的角度之间做一些比较,但很快我遇到了一些奇怪的结果 在本例中,我尝试旋转直线,使其指向中心,但直线的角度似乎比其应快速旋转的角度大。然后,正上方和下方的中心线开始指向各种方向 如何从Math.atan()获得准确的结果?是否有其他方法进行此计算 我上传了一个“工作”版本到这个小提琴上: . 我在Chrome工作 html: 如您所述,精确渐近线(即pi/2和-pi/2)不在atan的有效域内,这使得不可能获取这些值的atan。您可能还必须处理这样一个事实,即atan始终返回一个参考角度

我试图在点的角度之间做一些比较,但很快我遇到了一些奇怪的结果

在本例中,我尝试旋转直线,使其指向中心,但直线的角度似乎比其应快速旋转的角度大。然后,正上方和下方的中心线开始指向各种方向

如何从Math.atan()获得准确的结果?是否有其他方法进行此计算

我上传了一个“工作”版本到这个小提琴上: . 我在Chrome工作

html:


如您所述,精确渐近线(即pi/2和-pi/2)不在
atan
的有效域内,这使得不可能获取这些值的
atan
。您可能还必须处理这样一个事实,即atan始终返回一个参考角度,该角度可能不是您希望答案所在的象限。这些都是众所周知的问题,大多数语言都有一个简单的解决方法,称为atan2。对于javascript,请参见

对代码的更改很简单;简单地改变

points[i].tan = Math.atan(0.5 - points[i].y)/(0.5 - points[i].x);

如果您查看,您可能会看到它的行为有了很大的改进

atan2并没有提供更高的精度,但它确实提供了[0..2pi]的完整范围内的值,而无需进行所有额外的工作来确定答案应该位于哪个象限,以及在其范围内支持pi/2和-pi/2。知道x或y(或两者)是否为负有助于做到这一点,如果你自己除法,这个事实就会隐藏起来

应该注意的是,我对代码所做的最重要的更改不是atan2,而是围绕括号的使用进行的更改。虽然我主张在您通常使用atan的任何时候使用atan2,但您的实际问题是误用括号,使Oriol的答案正确。

您正在使用

points[i].tan = Math.atan(0.5 - points[i].y)/(0.5 - points[i].x);
应该是

points[i].tan = Math.atan( (0.5 - points[i].y)/(0.5 - points[i].x) );
let points=[];
金额=1000;
宽度=300;
设高度=300;
for(设i=0;i 3.14/2?真:假;
}	
对于(让点对点){
让line=document.createElement(“div”);
行。类列表。添加(“行”);
line.style.marginTop=点.y*高度+px;
line.style.marginLeft=点.x*宽度+px;
line.style.transform=“rotateZ”(+((point.tan*(180/Math.PI)))+“deg)”;
point.error==true&&line.classList.add(“错误”);
document.getElementById(“内容”).appendChild(行);
}
#内容{
位置:相对位置;
}
.线路{
位置:绝对位置;
高度:1px;
宽度:10px;
背景色:黑色;
}
.错误{
背景色:红色;
}

非常感谢!我的理解是,atan2()允许提高精度,因为这两个参数并没有像将它们划分为atan()时那样压缩为1.
atan
在渐近线附近的行为并不奇怪。@Oriol-True。它只是在渐近线处未定义。我会更改它。更重要的是,我应该在进行修复时注意到,本例中的问题只是误用了
atan
points[i].tan = Math.atan(0.5 - points[i].y)/(0.5 - points[i].x);
points[i].tan = Math.atan2(0.5 - points[i].y, 0.5 - points[i].x);
points[i].tan = Math.atan(0.5 - points[i].y)/(0.5 - points[i].x);
points[i].tan = Math.atan( (0.5 - points[i].y)/(0.5 - points[i].x) );