什么是向量  

  向量通常指一个有长度有方向的量。向量使所有的移动和空间行为更容易理解和在代码中实现。向量可以相加,缩放,旋转,指向某物体。 

  在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中的“向量”的更多相关文章

  1. 探秘JavaScript中的六个字符

    JavaScript 是一个奇怪而有趣的语言,我们可以写一些疯狂却仍然有效的代码.它试图帮助我们把事情转换到基于我们如何对待他们的特定类型. 如果我们添加一个字符串,JavaScript会假定我们希望 ...

  2. 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程

    本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...

  3. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  4. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  5. JavaScript 中的数据类型

    Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...

  6. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  7. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

  8. javascript中变量提升的理解

    网上找了两个经典的例子 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); // 10 var ...

  9. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

随机推荐

  1. 祖国版Solowheel!IPS103 独轮思维车 - 三个月体验报告

    http://tieba.baidu.com/f?kz=2308652773&mo_device=1

  2. finger用户名、主目录、停滞时间、登录时间

    finger yum install finger    1.作用    finger用来查询一台主机上的登录账号的信息,通常会显示用户名.主目录.停滞时间.登录时间.登录Shell等信息,使用权限为 ...

  3. poj 3280 Cheapest Palindrome ---(DP 回文串)

    题目链接:http://poj.org/problem?id=3280 思路: dp[i][j] :=第i个字符到第j个字符之间形成回文串的最小费用. dp[i][j]=min(dp[i+1][j]+ ...

  4. Android画图监听接口OnPreDrawListener具体解释

    public static interface ViewTreeObserver.OnPreDrawListener 我们先看下API中的定义: 类概述: 为即将绘制视图树时运行的回调函数定义的接口. ...

  5. mmc生产任务分配问题

    mmc生产任务分配问题,本题目简单.

  6. hdu1532 (最大流入门,EK算法)

    看着这个博客 然后敲了hdu1532这个入门题,算是对最大流有点理解了 #include <stdio.h> #include <string.h> #include < ...

  7. python学习之print输出不换行

    print的即时打印会导致换行,要使得print的输出不换行,可以在字符串或者变量后面加个逗号(“,”),如下: s = "A bird in the hand..." for c ...

  8. SQL:多表关联采取这一纪录迄今为止最大

    笔者:iamlasong 1.需求 两个表,投递记录表和封发开拆记录表,如今想知道投递日期距最后一次封发日期天数分布情况. 对这个需求,须要先查询出投递明细,同一时候要知道相应的邮件最后一次封发情况. ...

  9. 悟道—位IT高管20年的职场心经(读书笔记五)

    悟道--一位IT高管20年的职场心经 第五章 搞定老板 "老板就是老板" 这一点,你可能会忘了,他一定不会忘: "老板不会总是老板" 这一点,他可能会忘,你最好 ...

  10. 【python下使用OpenCV实现计算机视觉读书笔记4】保存摄像头视频

    读取摄像头内容,然后保存一段十秒钟的视频. import cv2 cameraCapture = cv2.VideoCapture(0) fps = 30 # an assumption size = ...