文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

v2 —— 最小化的 2D 向量类

v2 不是一个真正的类,仅仅是一个简单的生成 JavaScript 对象的函数。 v2(3,4) 创建了对象{x:3,y:4}. 同时 v2 也可作为一个命名空间包含一组向量函数。这些静态函数使用的对象形式例如 {x:<number>,y:<number>}.

基于矢量库的优点是更加通用的方法,可以与其他包含 X 和 Y 成员的对象紧密结合。

var cir = { x:100, y:200, r: 50 }, 
    pnt = { x: 30, y:150 },
    dist = v2.len(v2.dif(cir,pnt)) - 50;  // dist = 36.02325
第 1 段(可获 2 积分)

x/y-getter 以及——对某些只读函数来说甚至是不需要的——x/y-setter同样是足够的。

var box = {
   x0:100, y0:200, b:100, h:60,
   // center point
   get x()  { return this.x0 + this.b/2; },
   set x(v) { this.x0 += v - (this.x0 + this.b/2); },
   get y()  { return this.y0 + this.h/2; },
   set y(v) { this.y0 += v - (this.y0 + this.h/2); }
}
v2.add(box,{x:50,y:75})    // box = { x0:150, y0:275, b:100, h:60 }

利用这个惯例,v2能很好地协调自定义对象,以及可能的 ECMAScript 7 typed objects(类型对象)

一个替代性的表述方案使用了 [<number>,<number>]数组,并展现出了近似的性能结果。 即使数组的性能稍好一点,比起对象来说其代码可读性要差得多,这也是我们在这里选用对象表述的主要原因。

第 2 段(可获 2 积分)

v2 区分了三类向量函数:

  • 分析(analyse)函数(isZero, isEq, isEps, isUnit, isPolar, isCartesian, sqr, len, angle)
  • 操作(operator)函数(unit, neg, tilde, sum, dif, rot, scl, trf, simtrf, dot, perp, polar, cartesian)
  • 突变(mutator)函数(iunit, ineg, itilde, isum, idif, irot, iscl, itrf, copy, ipolar, icartesian)

操作函数 从不修改向量参数,但突变函数 有意这样做,从而节约内存并提高性能。因此考虑下面的向量表达式:s(a+b-c),给定a, b, c 和标量s。一个使用操作函数 的恰当的v2 表述是:

第 3 段(可获 2 积分)
   v2.scl(v2.sum(a,v2.dif(b,c)),s)

a, b, c 这三个向量均未改变,只是创建了三个临时向量对象。但当使用突变函数 作为替代时:

   v2.iscl(v2.isum(a,v2.idif(b,c)),s)

这个表达式没有创建临时向量对象,这能大幅节省内存和提高性能。向量ab失去了本来的数值,而是存储了临时数值。你可以将这些用到的函数读作implace scale,inplace sum 和 inplace difference。

v2是最小化的,能够很好地处理自定义对象,非常适合图像、物理和工程应用。v2很小,压缩之前为8 kB,压缩之后为2 kb。

第 4 段(可获 2 积分)

Vector-2D 数学资源

Vector-2D Math Resources

Node 安装

npm install v2d

var v2 = require('v2d');
var u = v2(3,4);

浏览器

<script src="v2.js"></script>
<script>
   var u = v2(3,4);
</script>

测试

npm run test

GitCDN

使用链接 https://gitcdn.xyz/repo/goessner/v2/master/v2.min.js 来获取最新版本的 JS 文件。

在 HTML 的使用如下:

<script src="https://gitcdn.xyz/repo/goessner/v2/master/v2.min.js"></script>

许可证

v2 使用 MIT 许可证,详情请看 LICENSE-MIT 

第 5 段(可获 2 积分)

改进记录

所有关于该项目值得关注的改进都会在这里列出,本项目坚持使用语义版本号。

1.3.1 - 2016-07-05

新特性

  • isimtrf 函数用于原地相似度变换
  • 增加该方法的 API 示例

1.3.0 - 2016-07-04

新特性

  • polar 函数用于转换到极坐标
  • cartesian 函数用于从极坐标转换为笛卡尔坐标
  • ipolar 函数用于原地转换为极坐标
  • icartesian 函数用于原地将极坐标转换为笛卡尔坐标

修改

  • toPolar 该方法被标识为过时了,现在请使用 polar.
  • fromPolar 该方法被标识为过时了,请使用 cartesian.

1.2.0 - 2016-05-14

新特性

`simtrf` function for applying efficient similarity transformation @goessner.

1.1.0 - 2016-01-08

新特性

toPolar function @goessner.
fromPolar function @goessner.
CHANGELOG.md @goessner.
第 6 段(可获 2 积分)

API

Kind: 全局类

第 7 段(可获 2 积分)

v2(x,y) ⇒ object

创建一个普通的 2D 向量对象 {x:number,y:number} 而不使用 new 

示例

var u1 = v2(3,4),      // create vector as an alternative ...
    u2 = {x:3,y:4};    // ... to simple object notation.

v2.zero

空向量

Kind: v2 的静态属性

v2.EPS

Epsilon (1.49e-8) 用于测试空向量和单元向量

Kind: v2 的静态属性

v2.isZero(u) ⇒ boolean

测试零向量
u === 0

Kind: 静态方法 v2
Returns: boolean - 是否为零向量

ParamTypeDescriptionu v22D 笛卡尔向量

示例

var u1 = v2(3,4), u2 = {x:-3,y:-4};
v2.isZero(v2.add(u1,u2);   // true
v2.isZero(v2.sub(u1,u2);   // false
第 8 段(可获 2 积分)

v2.isEq(u, v) ⇒ boolan

判断两个向量是否相等. u === v

Kind: 静态方法 v2
Returns: boolan - 是否相等.

ParamTypeDescription u v2 2D 笛卡尔向量 v22D 笛卡尔向量

示例

var u1 = v2(3,4), u2 = v2(1,2), u3 = {x:3,y:4};
v2.isEq(u1,u2);       // false
v2.isEq(u1,u3);       // true

v2.isEps(u, v) ⇒ boolean

测试两个向量的差异 
|u - v| < v2.EPS

Kind: 静态方法 v2
Returns: boolean - 近乎相等或者 0 

ParamTypeDescription u v2Vector 用来测试.v v2 | undefined 向量用于构建 u 的差异向量 [可选].

第 9 段(可获 2 积分)

示例

var u1 = v2(1e-10,2e-9), u2 = {x:3e-9,y:-4e-11};
v2.isEps(u1);         // true
v2.isEps(u1,u2);      // true, with difference
                      // {x:-2.9e-9, y:2.04e-9} 

v2.isUnit(u) ⇒ boolean

测试,如果vector是一个单位向量。
|u| === 1

Kind: 静态方法 v2

ParamTypeDescriptionu v2Vector 用来测试。

示例

var u1 = {x:3/5,y:4/5}, u2 = v2(3,-4);
v2.isUnit(u1);        // true
v2.isUnit(u2);        // false

v2.isCartesian(u) ⇒ boolean

测试,如果向量有笛卡尔坐标{x,y}。

Kind: 静态方法 v2

ParamTypeDescriptionu v2Vector 用来测试。

第 10 段(可获 2 积分)

示例

var u1 = v2(3,4), u2 = {r:5,w:0.9273}, 
    u3 = {r:5,w:0.9273,x:3,y:4};
v2.isCartesian(u1);   // true
v2.isCartesian(u2);   // false
v2.isCartesian(u3);   // true

 

v2.isPolar(u) ⇒ boolean

测试,如果向量有极坐标{r,w}。

Kind: 静态方法 v2

ParamTypeDescriptionu v2Vector 用来测试。

示例

var u1 = v2(3,4), u2 = {r:5,w:0.9273}, 
    u3 = {r:5,w:0.9273,x:3,y:4};
v2.isPolar(u1);   // false
v2.isPolar(u2);   // true
v2.isPolar(u3);   // true

 

v2.len(u) ⇒ number

向量的长度/欧氏距离。
len = sqrt(u.x^2 + u.x^2)

Kind: 静态方法 v2
Returns: number - 向量的长度。

第 11 段(可获 2 积分)

ParamTypeDescriptionu v22D笛卡尔向量

示例

var u = {x:3,y:4};
v2.len(u);   // 5

 

v2.sqr(u) ⇒ number

向量平方长度。
u*u = u.x^2 + u.x^2

Kind: 静态方法 v2
Returns: number - 向量平方长度。

ParamTypeDescriptionu v22D笛卡尔向量

示例

var u = v2(3,4);
v2.sqr(u);   // 25

 

v2.angle(u, [v]) ⇒ number

从u到v的角度,如果v缺失就从正x轴到u。 [弧度]。
atan(~u*v)/(u*v)

Kind: 静态方法 v2
Returns: number - 从u到v或从正x轴到u的角度。

ParamTypeDescriptionu v22D 笛卡尔向量[v] v22D 笛卡尔向量

第 12 段(可获 2 积分)

示例

var u1 = v2(3,4), u2 = v2(-4,3);
v2.angle(u1);     // 0.9273
v2.angle(u1,u2);  // 1.5708 (pi/2)

 

v2.copy(u, v) ⇒ v2

将向量u赋给v。
v = u

Kind: v2 的静态方法
Returns: v2 - 目标向量 o.

ParamTypeDescriptionu v22D源向量 v2 | undefined 2D目标向量[可选]。

示例

var u1 = v2(3,4), u2 = {x:2,y:1}, u3;
v2.copy(u1,u2);    // u2 = {x:3,y:4}
u3 = v2.copy(u1);  // u3 = {x:3,y:4}

 

v2.neg(u) ⇒ v2

负向量。
-u

Kind: v2 的静态方法
Returns: v2 - 无效的2D笛卡尔向量

ParamTypeDescriptionu v22D笛卡尔向量

第 13 段(可获 2 积分)

示例

v2.neg({x:2,y:1});  // {x:-2,y:-1}

 

v2.tilde(u) ⇒ v2

正交向量 - 逆时针旋转90度。 也称为 perp 运算符。
~u = {x:-u.y,y:u.x}

Kind: 静态方法 v2
Returns: v2 - 2D正交向量。

ParamTypeDescriptionu v22D笛卡尔向量

示例

v2.tilde({x:3,y:4});  // {x:-4,y:3}

 

v2.unit(u) ⇒ v2

向量的单位向量。
u / |u|

Kind: 静态方法  v2
Returns: v2 - 2D单位笛卡尔向量。

ParamTypeDescriptionu v22D笛卡尔向量

示例

v2.unit({x:3,y:4});  // {x:0.6,y:0.8}

 

v2.cartesian(u) ⇒ object

极坐标向量的笛卡尔向量
如果参数已经是笛卡尔向量,就返回。
{x:u.r*cos(u.w),y:u.r*sin(u.w)}

第 14 段(可获 2 积分)

Kind: 静态方法 v2
Returns: object - 2D笛卡尔向量{x,y}。

ParamTypeDescriptionu v22D极坐标向量{r,w}。

示例

var u1 = {r:5,w:0.9273}, u2 = {x:3,y:4}; 
v2.cartesian(u1);       // {x:3,y:4};
v2.cartesian(u2);       // {x:3,y:4};

 

v2.polar(u) ⇒ object

从笛卡尔向量的极坐标向量
如果参数已经是极坐标向量,就返回。
{r:sqrt(u.x^2+u.y^2),w:atan2(u.y,u.x)}

Kind: 静态方法 v2
Returns: object - 2D极坐标向量{r,w}。

ParamTypeDescriptionu v22D笛卡尔向量{x,y}。

示例

var u1 = {r:5,w:0.9273}, u2 = {x:3,y:4}; 
v2.polar(u1);       // {r:5,w:0.9273};
v2.polar(u2);       // {r:5,w:0.9273};
第 15 段(可获 2 积分)

v2.toPolar(u) ⇒ object

将笛卡尔向量转换为极坐标向量。
Obsolete: 使用 v2.polar 代替.

Kind: 静态方法 v2
Returns: object - 2D 极坐标向量。

ParamTypeDescriptionu v22D 笛卡儿向量

 

v2.fromPolar(u) ⇒ v2

将极坐标向量{r,w}转换为笛卡尔向量。
Obsolete: 使用v2.cartesian 代替。
{x:u.r*cos(u.w),y:u.r*sin(u.w)}

Kind: 静态方法 v2
Returns: v2 - 2D 笛卡儿向量

ParamTypeDescriptionu object2D 极坐标向量。

 

v2.sum(u, v) ⇒ v2

两个向量的和。
u + v

Kind: 静态方法 v2
Returns: v2 - 2D 笛卡尔向量和。

ParamTypeDescriptionu v22D笛卡尔向量v v22D笛卡尔向量

第 16 段(可获 2 积分)

示例

var u1 = {x:3,y:4}, u2 = {x:1,y:2}; 
v2.sum(u1,u2);      // {x:4,y:6};

 

v2.dif(u, v) ⇒ v2

两个向量的差。
u - v

Kind: 静态方法 v2
Returns: v2 - 2D笛卡尔向量的差。

ParamTypeDescriptionu v22D笛卡尔向量v v22D笛卡尔向量

示例

var u1 = {x:3,y:4}, u2 = {x:1,y:2}; 
v2.dif(u1,u2);      // {x:2,y:2};

 

v2.dot(u, v) ⇒ number

两个向量(内积)的标量(点)乘积。
u * v = u.x*v.x + u.y*v.y

Kind: 静态方法 v2
Returns: number - 标量积。

ParamTypeDescriptionu v22D笛卡尔向量v v22D笛卡尔向量

第 17 段(可获 2 积分)

示例

var u1 = {x:3,y:4}, u2 = {x:1,y:2}, u3 = {x:-4,y:3}; 
v2.dot(u1,u2);      // 11;
v2.dot(u1,u3);      // 0;
v2.dot(u2,u3);      // 2;

 

v2.perp(u, v) ⇒ number

perp 两个2D笛卡尔向量(外积或面积)的点积。
~u * v = u.x*v.y - u.y*v.x
与  v2.dot(v2.tilde(u),v)一样
结果与来自相应3D向量的叉积的向量的z坐标的值相等。

Kind: 静态方法  v2
Returns: number - perp 点积 (~u*v).

ParamTypeDescriptionu v22D笛卡尔向量v v22D笛卡尔向量

第 18 段(可获 2 积分)

示例

var u1 = {x:3,y:4}, u2 = {x:6,y:8}, u3 = {x:1,y:2}; 
v2.perp(u1,u2);      // 0;
v2.perp(u1,u3);      // 2;
v2.perp(u2,u3);      // 4;

 

v2.scl(u, [s]) ⇒ v2

向量乘法
u*s

Kind:  v2 的静态方法
Returns: v2 - 2D 笛卡尔向量缩放

ParamTypeDefaultDescriptionu v2 2D 笛卡尔 vector[s] number1 缩放因子

示例

v2.scl({x:3,y:4},2);      // {x:6,y:8};
v2.scl({x:3,y:4},-1);     // {x:-3,y:-4};

 

v2.rot(u, [w]) ⇒ v2

向量旋转角度 w [弧度].

Kind:  v2 的静态方法
Returns: v2 - 2D 笛卡尔向量旋转

第 19 段(可获 2 积分)

ParamTypeDefaultDescriptionu v2 2D 笛卡尔向量[w] number0旋转角度(以弧度表示)

示例

v2.rot({x:3,y:4},-Math.PI/2);   // {x:4,y:-3};

 

v2.trf(u, a, b, c, d, [e], [f]) ⇒ v2

通过2x3矩阵(SVG)转换向量。
[a c e] [x] = [x']
[b d f] [y] = [y']
[0 0 1] [1] = [1]

Kind: 静态方法 v2
Returns: v2 - 2D 笛卡尔向量变换。

ParamTypeDefaultDescriptionu v2  2D 笛卡尔向量a number m11b number m21c number m12d number m22[e] number0X轴[f] number0y轴

示例

v2.trf({x:3,y:4},2,0,0,1,4,5);   // {x:10,y:9};
第 20 段(可获 2 积分)

v2.simtrf(u, [a], [b]) ⇒ v2

将相似性变换应用于向量。
a*u + b*~u

Kind: 静态方法 v2
Returns: v2 - 2D笛卡尔向量变换。

ParamTypeDefaultDescriptionu v2 2D笛卡尔向量[a] number1通过a缩放u.[b] number0通过b缩放-u.

示例

v2.simtrf({x:3,y:4},2,1);   // {x:2,y:11};

 

v2.icartesian(u) ⇒ object

将极坐标向量转换为笛卡尔向量
{x:u.r*cos(u.w),y:u.r*sin(u.w)}

Kind: 静态方法 v2
Returns: object - 2D笛卡尔向量。

ParamTypeDescriptionu v22D极坐标向量

示例

var u1 = {r:5,w:0.9273}, u2 = {x:3,y:4}; 
v2.icartesian(u1);       // u1 = {x:3,y:4};
v2.icartesian(u2);       // u2 = {x:3,y:4};
第 21 段(可获 2 积分)

v2.ipolar(u) ⇒ object

将笛卡尔向量转换为极坐标向量
{r:sqrt(u.x^2+u.y^2),w:atan2(u.y,u.x)}

Kind: 静态方法 v2
Returns: object - 2D 极坐标向量.

ParamTypeDescriptionu v22D 笛卡尔向量

示例

var u1 = {r:5,w:0.9273}, u2 = {x:3,y:4}; 
v2.ipolar(u1);       // u1 = {r:5,w:0.9273};
v2.ipolar(u2);       // u2 = {r:5,w:0.9273};

 

v2.ineg(u) ⇒ v2

向量取反。
u = -u

Kind: 静态方法 v2
Returns: v2 - 2D向量u取反。

ParamTypeDescriptionu v22D 笛卡尔向量

示例

let u = {x:2,y:1};
v2.ineg(u);  // u = {x:-2,y:-1}
第 22 段(可获 2 积分)

v2.itilde(u) ⇒ v2

创建正交向量 - 逆时针旋转90度。
u = {x:-u.y,y:u.x}

Kind: 静态方法 v2
Returns: v2 - 正交笛卡尔向量u。

ParamTypeDescriptionu v22D 笛卡尔向量

示例

let u = {x:3,y:4};
v2.tilde(u);  // u = {x:-4,y:3}

 

v2.iunit(u) ⇒ v2

创建向量的单位向量。
u = u / |u|

Kind: 静态方法 v2
Returns: v2 - 2D 单位笛卡尔向量。

ParamTypeDescriptionu v22D 笛卡尔向量

示例

let u = {x:3,y:4};
v2.unit(u);  // u = {x:0.6,y:0.8}

 

v2.isum(u, v) ⇒ v2

将向量v添加到u(求和)。
u += v

第 23 段(可获 2 积分)

Kind: 静态方法 v2
Returns: v2 - 结果向量u。

ParamTypeDescriptionu v22D 笛卡尔向量v v22D 笛卡尔向量

示例

var u1 = {x:3,y:4}, u2 = {x:1,y:2}; 
v2.isum(u1,u2);      // u1 = {x:4,y:6};

 

v2.idif(u, v) ⇒ v2

从u中减去向量v(求差)。
u -= v

Kind: 静态方法 v2
Returns: v2 - 结果向量u。

ParamTypeDescriptionu v22D 笛卡尔向量v v22D 笛卡尔向量

示例

var u1 = {x:3,y:4}, u2 = {x:1,y:2}; 
v2.idif(u1,u2);      // u1 = {x:2,y:2};

 

v2.iscl(u, [s]) ⇒ v2

缩放向量。
u *= s

Kind: 静态方法 v2
Returns: v2 - 缩放笛卡尔向量u。

第 24 段(可获 2 积分)

ParamTypeDefaultDescription u v2 2D 笛卡尔向量,number1 缩放因子

示例

let u = {x:3,y:4};
v2.scl(u,2);      // u = {x:6,y:8};

 

v2.irot(u, [w]) ⇒ v2

原地旋转向量,弧度 w

Kind: 静态方法 v2
Returns: v2 - 旋转后的向量

ParamTypeDefaultDescription u v2 2D 笛卡尔向量,number0 旋转弧度

示例

let u = {x:3,y:4};
v2.rot(u,-Math.PI/2);   // u = {x:4,y:-3};

 

v2.itrf(u, a, b, c, d, e, f) ⇒ v2

原地 2x3 矩阵变换 2x3 (SVG).
[a c e] [x] = [x']
[b d f] [y] = [y']
[0 0 1] [1] = [1]

第 25 段(可获 2 积分)

Kind: 静态方法 v2
Returns: v2 - 变换后的 2D 笛卡尔向量

ParamTypeDescription u v2 2D 笛卡尔向量 a numberm11b numberm21c numberm12d numberm22e numberx-translation [optional]f numbery-translation [optional]

示例

let u = {x:3,y:4};
v2.trf(u,2,0,0,1,4,5);   // u = {x:10,y:9};

 

v2.isimtrf(u, a, b) ⇒ v2

使用原地相似变换向量
u = a*u + b*~u

Kind: 静态方法 v2
Returns: v2 - 变换后的向量

ParamTypeDescription u v2 2D cartesian vectora number Scale u by a.b numberScale ~u by b.

第 26 段(可获 2 积分)

示例

let u = {x:3,y:4};
v2.simtrf(u,2,1);   // u = {x:2,y:11};

 

v2.str(u, n) ⇒ string

用字符串表示向量,格式: (x,y).

Kind: 静态方法 v2
Returns: string - .

ParamTypeDescription u v2 2D 笛卡尔向量,n v2 小数位数. [可选]

示例

let u1 = {x:3,y:4}, u2 = {x:1.23456,y:78.90123} 
v2.str(u1);     // "(3,4)";
v2.str(u2,3);   // "(1.235,78.901)";
v2.str(u2,0);   // "(1,79)";
v2.str(u2);     // "(1.23456,78.90123)";
第 27 段(可获 2 积分)

文章评论