Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.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 给定三维空间中的一条直线,如何找到它与点之间的角度?_Javascript_Math_3d_Three.js_Geometry - Fatal编程技术网

Javascript 给定三维空间中的一条直线,如何找到它与点之间的角度?

Javascript 给定三维空间中的一条直线,如何找到它与点之间的角度?,javascript,math,3d,three.js,geometry,Javascript,Math,3d,Three.js,Geometry,我在三维空间中有两组点。我想画一条线,穿过两组点的中心,然后找到从这条线到每个点的角度。从这里开始,我将根据两个角度的接近程度来匹配两个设置中的点 我知道如何找到每一组点的中心(只是将它们平均起来),我知道如何匹配它们(甚至考虑到它们会环绕的事实),但我不知道如何找到从直线到点的角度 基本上我是说,我希望所有的点都投影到一个平面上,这个平面的中心和垂直于穿过中心的线,我希望从这条线到平面上每个点的角度 我希望我已经说清楚了。。。我在这方面没有太多正式的培训(有点让我想起几年前大学里的Diff E

我在三维空间中有两组点。我想画一条线,穿过两组点的中心,然后找到从这条线到每个点的角度。从这里开始,我将根据两个角度的接近程度来匹配两个设置中的点

我知道如何找到每一组点的中心(只是将它们平均起来),我知道如何匹配它们(甚至考虑到它们会环绕的事实),但我不知道如何找到从直线到点的角度

基本上我是说,我希望所有的点都投影到一个平面上,这个平面的中心和垂直于穿过中心的线,我希望从这条线到平面上每个点的角度

我希望我已经说清楚了。。。我在这方面没有太多正式的培训(有点让我想起几年前大学里的Diff Eq),所以一定要问我是否误用了一个术语,把你弄糊涂了

我想我可以从任何其他语言翻译一个解决方案来为我工作,因为我假设这主要是语言无关的数学,但我使用的是Three.JS,所以如果您的解决方案使用javascript/Three.JS(这是它们的,只是为了让您知道它提供了什么帮助函数),那将非常有用。谢谢

通常,两个向量的点积等于两个向量之间的夹角的余弦乘以两个向量的大小(长度)

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 
因此,2个单位向量的点积等于2个向量之间夹角的余弦,因为单位向量的长度为1

uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )


在*three.js*中,所有计算都可以通过[`three.Vector3`][2]的运算完成:
var a = new THREE.Vector3( ... );
var b = new THREE.Vector3( ... );

a.normalize();
b.normalize();

var cosAB = a.dot( b );
var angle_in_radians = Math.acos( cosAB );

正如下面的评论中提到的,在*three.js*中有一个操作**`.angleTo`**,它大大简化了操作:
var angle_in_radians = a.angleTo(b);

如果有4个点'Pa'、'Pb'、'Pc'、'Pd',它们定义了从'Pa'到'Pb'的两条线,并形成了从'Pc'到'Pd',那么这两个向量可以按如下方式计算:
var Pa = new THREE.Vector3( ... );
var Pb = new THREE.Vector3( ... );
var Pc = new THREE.Vector3( ... );
var Pd = new THREE.Vector3( ... );

var a = new THREE.Vector3();
a.copy( Pb ).sub( Pa );

var b = new THREE.Vector3();
a.copy( Pd ).sub( Pc );

仅定义一个点和一条线的角度是不够的-角度需要另一个点来表示旋转,例如,另一组的中心。但是你要寻找的可能是最小二乘优化法,它适用于每个点与目标的垂直距离line@meowgoesthedog-我们可以在二维平面上定义一个点,仅使用其与中心的距离和与轴的角度,对吗?这就是我要找的角度。我只需要轴对每个点都是一致的。因此,也许我应该说是一个3D空间,而不是2D平面,在这里点被定义为它们与直线的距离,它们与该轴的角度,以及它们在该平面上方或下方的高度(但我想要的是与该轴的角度),就像一个3D极坐标系。我是在表达我想要的还是我仍然感到困惑?我确实考虑到了这一点——但我们如何在3D空间中定义这样一个轴呢?有无限多个这样的轴,我不认为有一种方法可以“稳定地”定义它,至少如果点是unconstrained@meowgoesthedog-好的,我明白你的意思。我不在乎轴是如何定义的,只要所有的点使用完全相同的轴(两个集合应该共享一个轴)。我真正想做的是找出另一组中哪一点径向最近。所以,如果你想象我有一组点,从圆锥体的底部开始,在圆锥体的一半,有一组点,那么我会有成对的点定义圆锥体表面上的线。希望我现在想要的是什么。。。我觉得我想要的东西在我的头脑中很简单,但很难用语言表达。我明白了,如果它是从连接中心的线定义的,并且该线在算法执行过程中不会改变,那么所有东西都可以使用相同的轴。然而,既然你想比较径向距离,为什么还要麻烦这个角度呢?您对设置的描述似乎表明它围绕这条线具有旋转对称性(从统计学上讲),在这种情况下,定义任何类型的极角都没有物理意义(如果我理解正确的话),找到一个角度可以简化为
var angle_in_radians=a.angleTo(b),不带
.normalize()
.dot()
@prisoner849谢谢!