项目场景:

计算三维坐标组成的夹角


三维向量的夹角

参考:[三维向量夹角在线计算](https://www.23bei.com/tool/300.html)

公式:
三维向量夹角的计算公式如下:

假设两个三维向量分别为:a=(x1,y1,z1),b=(x2,y2,z2)。
向量a的模:|a|=√(x12+y12+z1^2)。
向量b的模:|b|=√(x22+y22+z2^2)。
两个向量的点乘:a·b=(x1x2+y1y2+z1z2)。
设两个向量的夹角为θ,则有:cosθ=(x1x2+y1y2+z1z2)/[√(x12+y12+z12)*√(x22+y22+z22)]。

上述公式均是以空间三维坐标给出的,如果令坐标中的z=0,则得到平面向量的计算公式。
两个向量夹角θ的取值范围是:[0,π]。当夹角为锐角时,cosθ>0;当夹角为钝角时,cosθ<0。

三维点坐标类

public class Point {
    public float x;
    public float y;
    public float z;

    public Point (float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

计算公式

/**
     * 获取三维向量的夹角.
     *
     * @param center 夹角中心点
     * @param start  起始点
     * @param end    结束点
     * @return 返回夹角
     */
    public static float getTdAngle(Point center, Point start, Point end) {
        // 向量1
        float x1 = start.x - center.x, y1 = start.y - center.y, z1 = start.z - center.z;
        // 向量2
        float x2 = end.x - center.x, y2 = end.y - center.y, z2 = end.z - center.z;
        System.out.println("x1/y1/z1=" + x1 + "/" + y1 + "/" + z1);
        System.out.println("x2/y2/z2=" + x2 + "/" + y2 + "/" + z2);
        // 向量的点乘
        float vectorDot = x1*x2 + y1*y2 + z1*z2;
        // 向量1的模
        double vectorMold1 = Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2) + Math.pow(z1, 2));
        // 向量2的模
        double vectorMold2 = Math.sqrt(Math.pow(x2, 2) + Math.pow(y2, 2) + Math.pow(z2, 2));
        // 向量的夹角[0, PI],当夹角为锐角时,cosθ>0;当夹角为钝角时,cosθ<0
        double cosAngle = vectorDot / (vectorMold1 * vectorMold2);
        double radian = Math.acos(cosAngle);
        return (float) (180 / Math.PI * radian);
    }

测试结果
在这里插入图片描述


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐