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;
};

 

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM