如何在PHP中计算两个向量之间的夹角代码

3

2
这不是一个 PHP 的问题,而是一个数学问题。 - Déjà vu
1
下面@Licson的答案是更好的答案。它返回一个在$(-180,180]$范围内的角度,而不像下面那个答案使用$\arccos$。我不明白为什么那个答案会被负评。 - copper.hat
同意。arccos答案将返回一个模pi弧度的角度,这会丢失有关两个点的“方向性”信息。 - bright-star
我在寻找错误的问题时找到了这个答案。也许它能帮助其他人澄清:你是在寻找两个向量之间的角度还是在寻找连接两个向量(点)和X轴之间的线段与X轴之间的角度?这个问题是关于第一个选项的。(或者至少,答案是关于第一个选项的) - Ideogram
3个回答

10

你可以在php中使用atan2($y,$x)函数来完成它,它可以找到弧度制下的角度。

<?php
$angle = rad2deg(atan2($y2-$y1,$x2-$x1));
//$angle is in degrees
?>

1
使用 $x1 = 2; $y1 = 0; $x2 = 2; $y2 = 2; 会导致输出 °90。它应该输出 °45,不是吗? - Genarito

9
function norm($vec)
{
    $norm = 0;
    $components = count($vec);

    for ($i = 0; $i < $components; $i++)
        $norm += $vec[$i] * $vec[$i];

    return sqrt($norm);
}

function dot($vec1, $vec2)
{
    $prod = 0;
    $components = count($vec1);

    for ($i = 0; $i < $components; $i++)
        $prod += ($vec1[$i] * $vec2[$i]);

    return $prod;
}

计算实际角度的方法如下:

$v1 = array(-1, -2);
$v2 = array(90, -5);

$ang = acos(dot($v1, $v2) / (norm($v1) * norm($v2)));

echo $ang; // angle in radians
> 1.97894543055 

如果 $v1 = array(0, 0); $v2 = array(-1, 0);,并且我们得到了除以零的错误,那么该怎么办? - Nilesh patel
2
你不能在零向量和另一个向量之间计算夹角。因此,你可以在输入向量时添加一个检查,以确保它们都不是零向量(即非 [0, 0, 0])。 - Supericy

3
两个向量的夹角计算方式为:
       v1X * v2X + v1Y * v2Y
acos(--------------------------) = angle between two vectors.
           |v1| * |v2|

您可以直接在PHP中使用此公式。

注意:

|v1||v2|是向量的长度,可以使用勾股定理计算。

|v1| = sqrt(v1X * v1X + v1Y * v1Y)
|v2| = sqrt(v2X * v2X + v2Y * v2Y)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接