向量

向量(vector),物理、工程等也称作矢量、欧几里得向量,是数学、物理学和工程科学等多个自然科学中的基本概念。指一个同时具有大小和方向,且满足平行四边形法则的几何对象。

理论数学中向量的定义为任何在向量空间中的元素。

一般地,同时满足具有大小和方向两个性质的几何对象即可认为是向量。

向量常常在以符号加箭头标示以区别于其它量。

与向量相对的概念称标量、纯量、数量,即只有大小、绝大多数情况下没有方向(电流是特例)、不满足平行四边形法则的量。


📐 数学公式

设向量 A = (x1, y1), 向量 B = (y1, b2), 向量 C = (c1, c2)

▶ 一般写向量要带上箭头符号,文本输出就忽略了它
▶ 向量没有除法运算


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
负向量
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
而负向量,就是相对于()向量来的,与()向量“相反”。

在点积(dot product)中,-a · b = a · (-b) = -1(a · b)。
在叉积(cross product)中,- a × b = a × (-b) = -1(a × b)。
a × (-a) = - (a × a) = 0


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
向量的模
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
设有一个平面向量 a(x,y),向量 a 的大小,也就是向量 a 的长度(或称模),记作 |a||a| = (+)


使用勾股定理计算合向量的大小
c² =+ b²

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
向量加法
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
A + B = (x1 + a2, y1 + b2)
a + b = c = (8, 13) + (26, 7) = (8+26, 13+7) = (34, 20)


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
向量减法
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
A - B = (x1 - a2, y1 - b2)

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
向量乘法
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
向量的点乘,也叫向量的内积、数量积。
ABC = x1 • a2 + y1 • b2 + c1 • c2

点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影,公式为:
AB = |A||B| • cosΘ

x1 • a2 + y1 • b2 + c1 • c2 = ((x1² + y1²))  ((x2² + y2²)) • cosΘ

cosΘ = (x1 • a2 + y1 • b2 + c1 • c2) ÷ ((x1² + y1²))  ((x2² + y2²)) 

Θ = arccos((x1 • a2 + y1 • b2 + c1 • c2) ÷ ((x1² + y1²))  ((x2² + y2²)))



■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
向量分解
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
也叫向量正交分解,这个方法通常用在位于直角平面中的向量上,不过也可以用在别的向量上。将每个向量分解成互相垂直的两个向量。它构建了平面向量及其运算的坐标表示。

空间向量分解定理是指如果三个向量a,b,c不共面,那么对空间任一向量p,存在一个唯一的有序实数组x,y,z,使 p = xa + yb + zc。表达式 xa + yb + zc 叫做向量a,b,c的线性表达式或线性组合。






📌 JavaScript

参考代码:index.js

/**
 * 向量类
 */
export class Vector {

    /* 创建一个向量,value 使用了剩余运算符,返回一个数组 */
    constructor(...value) {
        this.value = value;
    }

    /* 向量加法 */
    add({ value }) {
        return new Vector(
            ...value.map((component, index) => this.value[index] + component)
        )
    }

    /* 向量减法 */
    subtract({ value }) {
        return new Vector(
            ...value.map((component, index) => this.value[index] - component)
        )
    }

    /* 向量点积(内积、数量积) */
    dotProduct({ value }) {
        return value.reduce((acc, component, index) => acc + component * this.value[index], 0)
    }
    

    /* 向量的模(长度),返回所有参数的平方和的平方根(勾股定理) */
    length() {
        return Math.hypot(...this.value);
    }

    /* 转化为角度 */
    toDegrees(radians) {
        return (radians * 180) / Math.PI;
    }

    /* 计算角度 */
    angleBetween(other) {
        return this.toDegrees(
             
            /* 反余弦函数 */
            Math.acos(
                this.dotProduct(other) /
                (this.length() * other.length())
            )
        )
    }

}

测试:test.js

import { Vector } from './index';

const v = new Vector(0, 5);
const w = new Vector(6, 2);

console.log(v.add(w));
/* 输出:
Vector {
    "value": [6, 7]
}
*/


console.log(v.subtract(w));
/* 输出:
Vector {
    "value": [-6, 3]
}
*/


console.log(v.dotProduct(w)); 
/* 输出:10 */



console.log(v.angleBetween(w)); 
/* 输出:71.56505117707799 */