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中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
随机推荐
- poj3280(区间dp)
题目连接:http://poj.org/problem?id=3280 题意:给定一个长度为m(m<=2000)的小写字母字符串,在给定组成该字符串的n(n<=26)个字符的添加和删除费用 ...
- 跟着ZHONGHuan学习设计模式--桥接模式
转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...
- XSS跨站攻击
目录 1 XSS跨站攻击简介 1 1.1 什么是XSS 1 1.2 XSS的分类 1 1.3 XSS的危害 1 2 XSS的攻击原理 1 2.1 本地式漏洞攻击 1 2.2 存储式漏洞攻击 2 2.3 ...
- HTML解析HtmlAgilityPack
原文:HTML解析HtmlAgilityPack //解析页面源代码 Uri surl = new Uri(url); Uri uriCategory = ...
- 三点半们耐热i哦好家哦i囧囧【
http://pan.baidu.com/share/link?shareid=3011665141&uk=338692646&third=15 http ...
- C#-gdi画图,双缓冲画图,Paint事件的触发---ShinePans
在使用gdi技术画图时,有时会发现图形线条不够流畅,或者在改变窗口大小时会闪烁不断的现象.(Use DoubleBuffer to solve it!) ...
- ACM-简单题之Least Common Multiple——hdu1019
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- Java UML描述
开发Java应用程序时,开发者要想有效地利用统一建模语言(UML),必须全面理解UML元素以及这些元素如何映射到Java.本文重点讨论UML类图中的元素. 类图是最常用的UML图,它用于描述系统的 ...
- hdu 4007 Dave (2011年大连ACM网络赛)
题意:给定正方形的边长 r ,在平面内寻找正方形可以圈住的点的最大的个数. 分析:先对点排序,然后固定一条边,再平移另一条垂直边,得到点的个数,最后比较大小即可. 注意:不包含正方形倾斜的情况! // ...
- hdu 5187 高速幂高速乘法
http://acm.hdu.edu.cn/showproblem.php?pid=5187 Problem Description As one of the most powerful brush ...