2012-08-03 13 views
5

sto cercando di creare una linea che attraversa la tela da sinistra a destra. im ancora in fase iniziale per ottenere che, per fare che im utilizzando la seguente funzione di fare il passo di animazione passoTela: animare la curva di Bézier disegno

timer = window.setInterval(draw_line, 30); 

la mia funzione di disegno è come questo

function draw_line() 
    { 
     context.fillStyle = "#000"; 
     context.fillRect(0, 0, canv.width, canv.height); 

      context.beginPath(); 
     context.lineWidth = 2; 
     context.strokeStyle = '#fff'; 

      //Where p1, p2, cp1, cp2 are point objects that has x & y values already defined  
     context.moveTo(p1.x, p1.y); 
     context.bezierCurveTo(cp1.x,cp1.y,cp2.x,cp2.y,p2.x,p2.y); 
     context.stroke(); 
     context.closePath(); 

      // now i have to move p1, p2 ,cp1,cp2 
      // now here is my problem 
    } 

ho capito che ho bisogno di move p1.x+= a random number; e anche lo stesso per cp1 e cp2, ma per quanto riguarda p2 il punto finale dovrebbe seguire la stessa riga traccia! come posso ottenerlo?

Grazie

risposta

4

risposta a cura

Con il vostro chiarimento, credo di poter rispondere a questa in modo appropriato ora.

Per fare in modo che il punto di arrivo segua il percorso che il punto di inizio ha attraversato la tela, è necessario memorizzare i valori storici. In questo esempio, http://jsfiddle.net/mobidevelop/bGgHQ/, utilizzo i movimenti del mouse per riempire un buffer delle ultime 16 posizioni, quindi lo uso per formare una curva bezier attraverso i punti ripetendo il RingBuffer.

function RingBuffer(length) { 
    this.length = length; 
    this.pointer = 0; 
    this.buffer = []; 
} 
RingBuffer.prototype.get = function(index) { 
    if (index < 0) { 
     index += this.length;   
    } 
    return this.buffer[index]; 
} 
RingBuffer.prototype.push = function(value) { 
    this.buffer[this.pointer] = value; 
    this.pointer = (this.length + this.pointer +1) % this.length;  
} 

var c = document.getElementById("myCanvas"); 
var context =c.getContext("2d"); 

timer = window.setInterval(draw_line, 30); 
function Point(x,y) { 
    this.x = x; 
    this.y = y; 
} 
Point.prototype.translateX = function(x) { 
    return this.x += x; 
}; 
Point.prototype.translateY = function(y) { 
    return this.y += y; 
}; 

function draw_line() 
{ 
    context.fillStyle = "#000"; 
    context.fillRect(0, 0, c.width, c.height); 

    var pointer = history.pointer; 
    context.beginPath(); 
    context.lineWidth = 2; 
    context.strokeStyle = '#F00';  
    for (iteration = 0, count = 15; iteration < count; iteration += 3) { 
     var p1 = history.get(--pointer); 
     var p2 = history.get(--pointer); 
     var p3 = history.get(--pointer); 
     var p4 = history.get(--pointer);   

     if (p1 && p2 && p3 && p4) { 

      context.moveTo(p1.x, p1.y); 
      context.bezierCurveTo(p2.x, p2.y, p3.x, p3.y, p4.x, p4.y); 

     } 
     pointer++; 
    } 
    context.stroke(); 
    context.closePath();  

} 

var history = new RingBuffer(16); 
var lastGrab = new Date(); 
c.addEventListener('mousemove', function() { 
    now = new Date(); 
    if (now - lastGrab > 15) { 
     history.push(new Point(event.clientX - c.offsetLeft, event.clientY - c.offsetTop)); 
     lastGrab = now; 
    }  
});​ 

risposta precedente a sinistra sotto, per scopi storici.

Non sono sicuro di capire completamente cosa stai cercando di ottenere, ma penso che tutto ciò che devi fare è tradurre tutti i tuoi punti con lo stesso valore. Ciò comporterà la linea che attraversa la tela mantenendo la stessa forma. qualcosa di simile:

JSFiddle

var c = document.getElementById("myCanvas"); 
var context =c.getContext("2d"); 

timer = window.setInterval(draw_line, 30); 
function Point(x,y) { 
    this.x = x; 
    this.y = y; 
} 
Point.prototype.translateX = function(x) { 
    return this.x += x; 
}; 
Point.prototype.translateY = function(y) { 
    return this.y += y; 
}; 

var p1 = new Point(0,0); 
var p2 = new Point(100,100); 
var cp1 = new Point(15,45); 
var cp2 = new Point(85,45); 

function draw_line() 
{ 
    context.fillStyle = "#000"; 
    context.fillRect(0, 0, c.width, c.height); 

    context.beginPath(); 
    context.lineWidth = 2; 
    context.strokeStyle = '#fff'; 

     //Where p1, p2, cp1, cp2 are point objects that has x & y values already defined  
    context.moveTo(p1.x, p1.y); 
    context.bezierCurveTo(cp1.x,cp1.y,cp2.x,cp2.y,p2.x,p2.y); 
    context.stroke(); 
    context.closePath(); 

    p1.translateX(1); 
    p2.translateX(1); 
    cp1.translateX(1); 
    cp2.translateX(1); 

    if (p1.x > 300) { 
     p1.translateX(-400); 
     p2.translateX(-400); 
     cp1.translateX(-400); 
     cp2.translateX(-400);   
    } 
} 

A meno che non sto equivoco l'obiettivo ...

+0

Grazie per la risposta, ma ciò che im cercando di ottenere è un punto che ha una coda. il primo punto p1 si muove in una direzione casuale e il secondo punto p2 segue la coda p1 – trrrrrrm

+0

Interessante, non l'avrei mai ottenuto dalla tua descrizione del problema ... E sfortunatamente, sono ancora confuso. Hai un esempio visivo di ciò che vuoi ottenere? –

+0

@ra_htial cerchi qualcosa di simile? http://jsfiddle.net/mobidevelop/bGgHQ/ (Muovi il mouse sulla tela) –