javascript中的“向量”
什么是向量
向量通常指一个有长度有方向的量。向量使所有的移动和空间行为更容易理解和在代码中实现。向量可以相加,缩放,旋转,指向某物体。
在javascript中,一个方向和长度(即向量)在二维空间中可以用横坐标x和纵坐标y表示。

上图中有4个不同的向量及其x和y分量(左上角为原点{x:0,y:0},这里的向量代表方向、长度,而不是位置。
向量长度
向量的方向由x、y分量表示,可以根据x、y坐标用勾股定理来表示长度。
length = Math.sqrt(x*x + y*y);
一个横坐标( x = -3 ),纵坐标( y = 3 )的向量,利用勾股定理计算长度:
length = Math.sqrt(-3*-3 + 3*3); //length 约为 4.24

在javascript数学函数中,角是以弧度( radian )为单位,不是角度( degree )。1弧度是弧长和半径相等的弧,圆的周长:2*Math.PI*R(R为半径),圆的弧度:2*Math.PI

弧度和角度转化
degrees 角度
radians 弧度 degrees = radians * 180/Math.PI
角度弧度乘于180再除于PI radians = degrees * Math.PI/180
弧度等于角度度乘于PI再除于180 //角度转弧度
var degToRad = function(deg){
return deg * (Math.PI/180);
}
//弧度转角度
var radToDeg = function(rad){
return rad * (180/Math.PI);
}
向量的运算
1. 加、减:可以通过加减向量的x,y坐标来实现向量的相加或相减
给飞行的皮球加上一个重力向量,让它真实的下落
把两个碰撞物体的向量加在一起,计算逼真的碰撞反馈
给宇宙飞船增加火箭推力的向量,让宇宙飞船移动
2. 缩放:按照一定比例的缩放向量的x,y坐标,可以缩小或放大向量的长度
反复以略小于1的向量缩放移动向量,让对应物体缓慢的停下来
将大炮的方向向量扩大,作为一个发射炮弹的初始向量
3. 标准化:有时需要将一个向量变为单位长度,单位长度的向量叫单位向量
定向喷射的方向
斜坡的倾斜方向
大炮的发射方向
4. 旋转:以任意角度来旋转一个向量,可以指向任意一个想要的方向
是一个对象始终指向另一个
更改一个虚拟的喷射引擎的推力方向
根据发射器的方向改变投射体的初始发射方向
5. 点乘:点乘给两个向量之间的角度的余弦,或者点乘提示两个向量的方向相近程度。点乘的结果在 -1 到 1 之间变化。
向量的方向相同:点积 = 1
向量的夹角是45度:点积 = 0.5
向量的夹角是90度:点积 = 0
向量的夹角是180度:点积 = -1
创建一个javascript向量对象
var vector2d = function (x, y) {
var vec = {
vx: x,
vy: y,
// 缩放
scale: function (scale) {
vec.vx *= scale;
vec.vy *= scale;
},
//加 另一个向量
add: function (vec2) {
vec.vx += vec2.vx;
vec.vy += vec2.vy;
},
//减 另一个向量
sub: function (vec2) {
vec.vx -= vec2.vx;
vec.vy -= vec2.vy;
},
//相反方向
negate: function () {
vec.vx = -vec.vx;
vec.vy = -vec.vy;
},
//向量长度
length: function () {
return Math.sqrt(vec.vx * vec.vx + vec.vy * vec.vy);
},
//向量长度的平方
lengthSquared: function () {
return vec.vx * vec.vx + vec.vy * vec.vy;
},
//标准化
normalize: function () {
var len = Math.sqrt(vec.vx * vec.vx + vec.vy * vec.vy);
if (len) {
vec.vx /= len;
vec.vy /= len;
}
return len;
},
//旋转
rotate: function (angle) {
var vx = vec.vx,
vy = vec.vy,
cosVal = Math.cos(angle),
sinVal = Math.sin(angle);
vec.vx = vx * cosVal - vy * sinVal;
vec.vy = vx * sinVal + vy * cosVal;
},
//调试
toString: function () {
return '(' + vec.vx.toFixed(3) + ',' + vec.vy.toFixed(3) + ')';
}
};
return vec;
};
javascript中的“向量”的更多相关文章
- 探秘JavaScript中的六个字符
JavaScript 是一个奇怪而有趣的语言,我们可以写一些疯狂却仍然有效的代码.它试图帮助我们把事情转换到基于我们如何对待他们的特定类型. 如果我们添加一个字符串,JavaScript会假定我们希望 ...
- 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程
本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- JavaScript 中的数据类型
Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- javascript中变量提升的理解
网上找了两个经典的例子 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); // 10 var ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
随机推荐
- Wix打包系列(三)自定义Action(Custom Action)
原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...
- Cocos2dx项目启程一 之 封装属于我的精灵类
给自己的假期就快要结束了,该要做点事情了,哪怕简单的不好的也比不做的有意义. /*#pragma once 保证头文件只被编译一次 #pragma once是编译器相关的,就是说即使这个编译系统上有效 ...
- SE 2014 年4月21日(一)
如图配置 网络中存在四个自治系统,设备之间要求建立BGP对等体关系,发布BGP路由,使得全网BGP路由相互通讯. 要求 1. 由于AS 200中的路由信息频繁抖动,所以AS 100 和 AS 300 ...
- 理解Javascript的动态语言特性
原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...
- poj1935(树形dp)
题目链接:http://poj.org/problem?id=1935 题意:带边权的树,给点一个根,问从根出发遍历某些点,所需的最小花费. 分析:树上任意两点的路径是唯一的,直接dfs一遍,可以得出 ...
- linux网络编程学习笔记之三 -----多进程并发服务端
首先是fork()函数.移步APUE 8.3. 比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...
- There is no Action mapped for namespace / and action name UserAction
果断收藏了,说的非常具体.刚開始学习的人常常遇到的问题. There is no Action mapped for namespace / and action name UserAction 在网 ...
- 大话设计模式C++达到-文章12章-外观模式
一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...
- 2014牡丹江——Hierarchical Notation
problemId=5380" style="background-color:rgb(51,255,51)">题目链接 字符串模拟 const int MAXN ...
- 初识google多语言通信框架gRPC系列(三)C#中使用gRPC
我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...