向量
向量(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| = √(x² + y²) 使用勾股定理计算合向量的大小 c² = a² + 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) ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 向量乘法 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 向量的点乘,也叫向量的内积、数量积。 A • B • C = x1 • a2 + y1 • b2 + c1 • c2 点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影,公式为: A • B = |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 */