canvas拋物線運動軌跡

原本是想作一個貝塞爾曲線運動軌跡的javascript

公式太複雜了,懶得算,公式在最後html

我先畫了一個拋物線,我肯定了兩個點,起點(0,0),終點(200,200)java

用座標系可算出方程 y=-0.005x^2canvas

如今找出終點的切線與X軸的交點,那個就是貝塞爾曲線的第二個參數,控制點函數

求出是(100,0)spa

 

如今從新繪製一個動態曲線,給X=X+0.1htm

y就是函數方程了y=0.005x^2  (注意沒有負號了)blog

這樣咱們新繪製的線條就能在原來的紅色線條上移動了ip

var oQuadraticCurveTo = document.getElementById("canvas");
var oContext = oQuadraticCurveTo.getContext("2d");
var x=2;
drawLine();
    function drawLine(){
        oContext.beginPath();
        oContext.moveTo(0,0);                       //起始點(x,y)
        oContext.quadraticCurveTo(100, 0, 200, 200);    //建立二次貝塞爾曲線
        oContext.lineWidth = 2;
        oContext.strokeStyle = "tomato";
        oContext.stroke();
        oContext.closePath(); 
    }
    function drawPoint(x,y){
        oContext.beginPath();
        oContext.arc(x, y, 3, 0, 2 * Math.PI, false);
        oContext.fillStyle="red";
        oContext.fill();
        
        oContext.stroke();
        oContext.closePath();
    }

    //畫移動的線
    function drawMivie(){
        
        y=Math.pow(x,2)*0.005
        console.log(y);
        oContext.beginPath();
        oContext.moveTo(x,y); 
        x=x+0.1;
            
        if(x > 198){
            x=0;
        }else{
        //防止首位相連
        y=Math.pow(x,2)*0.005
        oContext.lineTo(x,y);
        oContext.strokeStyle = "white";
        oContext.lineWidth = 1;
        oContext.stroke();
        oContext.closePath();
        }
        

    }

    drawPoint(0,0);
    drawPoint(200,200);
    //定位到起點
    
    setInterval(function(){
            drawMivie();
        },1);
 

 

下面是一個改進版,小球沿着拋物線運動get

 

var oQuadraticCurveTo = document.getElementById("canvas");
var oContext = oQuadraticCurveTo.getContext("2d");
var x=2; 

    function drawLine(){
        oContext.beginPath();
        oContext.moveTo(0,0);                       //起始點(x,y)
        oContext.quadraticCurveTo(100, 0, 200, 200);    //建立二次貝塞爾曲線
        oContext.lineWidth = 2;
        oContext.strokeStyle = "tomato";
        oContext.stroke();
        oContext.closePath(); 
    }
    function drawPoint(x,y){
        oContext.beginPath();
        oContext.arc(x, y, 3, 0, 2 * Math.PI, false);
        oContext.fillStyle="red";
        oContext.fill();
        
        oContext.stroke();
        oContext.closePath();

    }

    //畫移動的線
    function drawMivie(){
        
        y=Math.pow(x,2)*0.005;
      
            
        if(x > 198){
            x=0;
        }else{
        //防止首位相連
     //清楚以前的圖,從新繪製 oContext.clearRect(0, 0, 500, 500); oContext.closePath(); drawStatic(oContext); // x=x+1; y=Math.pow(x,2)*0.005; //畫圓球 oContext.beginPath(); oContext.strokeStyle = "white"; oContext.arc(x,y,5,0,2*Math.PI,false); oContext.fillStyle="white"; oContext.fill(); oContext.stroke(); oContext.closePath(); } } //畫靜態元素,紅線和兩端 function drawStatic(){ drawLine(); drawPoint(0,0); drawPoint(200,200); } setInterval(function(){ drawMivie(oContext); },20);

 

 

公式先丟出來,萬一之後真的要作複雜的曲線呢。。

用下列一組數據點P(0,1) P(1,1) P(1,0) 做爲特徵多邊形的頂點,構造一條貝齊爾曲線,寫出它的方程並做圖

n個數據點構成(n-1)次貝塞爾曲線,
三個數據點構成二次貝塞爾曲線,二次貝塞爾曲線參數方程
(1 - t)^2 P0 + 2 t (1 - t) P1 + t^2 P2;
曲線起點P0,終點P2,但通常不過P1點.

代入座標後獲得:
參數方程:
x = (1 - t)^2 * 0 + 2 t (1 - t) * 1 + t^2 * 1 = 2 t (1 - t) + t^2,
y= (1 - t)^2 * 1 + 2 t (1 - t) * 1 + t^2 * 0 = (1 - t)^2 + 2 t (1 - t) ,

消去參數 t 獲得:y = -1 + 2 Sqrt[1 - x] + x.

相關文章
相關標籤/搜索