2016-08-16 62 views
1

我在畫布上有兩個Points(x/y),可以使用requestanimationframe或setinterval在一條直線上移動它們之間的圖像。JS - 將2D矢量變成曲線?

然而,代替我想,不知何故,移動對象以彎曲的動畫,取決於速度的向量組合的x/y和尤其是S(步驟) 我已經創建了這個JSBin:?!

http://jsbin.com/furomu/edit?html,js,console,output - (點擊init)。

是否有可能以某種方式將此「矢量」變成某種曲線來繪製平滑的運動? 如果不是,我還需要其他什麼值才能將它變成彎曲運動?

//start at 50,50 
    //move to 150,125 
// Vector is 100/75 or v +1/+0.75 at 100 steps 


function Move(ox, oy, x, y){ 
    this.ox = ox; 
    this.oy = oy; 
    this.x = x 
    this.y = y 
    this.p; 
    this.v = {x: x - ox, y: y - oy}; 

    this.setup = function(){ 

    var p = {}; 
    var v = this.v; 

    if (this.x > this.y){ 
     p.s = v.y; 
     p.y = 1; 
     p.x = v.x/v.y; 
    } 
    else { 
     p.s = v.x; 
     p.x = 1; 
     p.y = v.y/v.x; 
    } 

    this.p = p; 
    } 

    this.setup(); 
} 


function Ship(x, y){ 
    this.x = x; 
    this.y = y; 

    this.moves = []; 

    this.draw = function(){ 
    this.drawSelf(); 
    this.drawTarget(); 
    } 

    this.create = function(){ 
    var move = new Move(this.x, this.y, 150, 125); 
    this.moves.push(move); 
    } 

    this.update = function(){ 
    var m = this.moves[0]; 
    var self = this; 

    anim = setInterval(function(){   
     ctx.clearRect(0, 0, res, res); 
     self.x += m.p.x; 
     self.y += m.p.y; 
     m.p.s--; 

    self.draw(); 

     if (m.p.s == 0){ 
     clearInterval(anim); 
     } 
    }, 30); 
    } 

    this.create(); 
    this.draw(); 
    this.update(); 
} 

function init(){ 
    var ship = new Ship(50, 50); 
     } 
+0

你需要至少3個點來定義曲線。 Google「splines」。如果你有一個速度,你可以用它來定義第三個點,從初始速度方向的起點向前投影。 – samgak

回答

2

有關於這個話題here

基本上一些有用的信息,你需要一個或多個控制點,以「彎曲」您的矢量成曲線。

enter image description hereenter image description here

這可以用下面的公式用於單個控制點來實現: [x,y]=(1–t)²P0+2(1–t)tP1+t2²P2

t=0,右手側等於第一控制點 - 線段的開始。當t=1,我們得到點P1,第二個控制點和線段的結束。