2013-05-30 231 views
4

嗨我想在移動滑塊時繪製曲線。我有兩種曲線。貝塞爾曲線和二次曲線。此外,當我繪製曲線時,我想在同一條路徑上移動一個對象。我希望它是動態的,所以如果我應該能夠改變曲線點。 所以我需要一個函數,我可以調用滑塊更改,因爲我正在爲線條做。 這是我的代碼。這段代碼只能在chrome中使用。html5-canvas滑動移動畫圖曲線

  <!DOCTYPE HTML> 
      <html> 
       <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
        <meta name="viewport" content="width=device-width, initial-scale=1"> 

        <style type="text/css"> 
         .wrapper { 
          margin: 0 auto; 
          width: 1000px; 
         } 
         .canHdr { 
          float: left; 
          width: 450px; 
          height: 400px; 
          border: 1px solid red; 
         } 
        </style> 

       </head> 
       <body> 
        <form> 
         <!-- wrapper --> 
         <div class="wrapper"> 

          <!-- canHdr --> 
          <div id="canHdr" class="canHdr" > 

           <p> 
            This is my 1st div with quadratic curve I want to draw this curve as I move the slider. I want to make it dynamic so when I should be able to change the curve points. Also I want to move an object on that curve as I am doing in my 3rd div. 
           </p> 

           <div class="canOuterHdr" > 
            <canvas id="myCanvas1" width="300" height="195" style="position: relative;"> 
             [No canvas support] 
            </canvas> 

           </div> 

           <div id="slider1" class="newBg"> 
            <input id="slide1" type="range" min="0" max="100" step="1" value="0" onchange="counterSlider('slide1');" /> 
           </div> 

          </div> 
          <!--/ canHdr --> 
          <!-- canHdr2 --> 
          <div id="canHdr2" class="canHdr" > 

           <p> 
            This is my 2nd div. I have bezier curve. I want to make it dynamic so when I should be able to change the curve points. Also I want to move an object on that curve as I am doing in my 3rd div. 
           </p> 

           <div class="canOuterHdr" > 
            <canvas id="myCanvas2" width="300" height="195" style="position: relative;"> 
             [No canvas support] 
            </canvas> 

           </div> 

           <div id="slider2" class="newBg"> 
            <input id="slide2" type="range" min="0" max="100" step="1" value="0" onchange="counterSlider('slide2');" /> 
           </div> 

          </div> 
          <!-- canHdr2 --> 
          <!-- canHdr3 --> 
          <div id="canHdr3" class="canHdr" > 
           <p> 
            This is my 3rd div with slanting line. I want to move a ball on this line when I move the slider. So as the line increases ball will also move on the line. 
           </p> 

           <div class="canOuterHdr" > 
            <canvas id="myCanvas3" width="300" height="195" style="position: relative;"> 
             [No canvas support] 
            </canvas> 

           </div> 

           <div id="slider3" class="newBg"> 
            <input id="slide3" type="range" min="0" max="100" step="1" value="0" onchange=" drawSlopeCurve2('slide3','100'); " /> 
           </div> 

          </div> 
          <!--/ canHdr3 --> 
          <!-- canHdr4 --> 
          <div id="canHdr4" class="canHdr" > 

           <p> 
            This is my 4th div with slanting line. I want to move a ball on this line when I move the slider. So as the line increases ball will also move on the line. 
           </p> 

           <div class="canOuterHdr" > 
            <canvas id="myCanvas4" width="300" height="195" style="position: relative;"> 
             [No canvas support] 
            </canvas> 

           </div> 

           <div id="slider4" class="newBg"> 
            <input id="slide4" type="range" min="0" max="100" step="1" value="0" onchange=" drawSlopeCurve1('slide4','100'); " /> 
           </div> 

          </div> 
          <!--/ canHdr4 --> 

         </div> 
         <!-- /wrapper --> 

         <script type="text/javascript"> 
          newSprite('myCanvas3', 16, 170); 
          quadraticCurve('myCanvas1', 18.8, 45, 28, 160, 228, 165); 
          bezierCurve('myCanvas2', 20, 75, 55.2, 150.0, 200,100, 228, 165) 
          function counterSlider(sID) { 

           var slideVal = document.getElementById(sID).value; 
           /*if (maxValue ==100){ 

           slideVal=slideVal/100; 
           }*/ 
           slideVal = slideVal/100; 

           if (slideVal == 0) { 

           /* erase('myCanvas2'); 
            erase('myCanvas3'); 
            erase('myCanvas4');*/ 
            //newSprite('myCanvas1b', 18.8, 45); 
            newSprite('myCanvas3', 16, 170); 

           } else if (slideVal > 0 && slideVal <= 34) { 

            /*erase('myCanvas1'); 
            //erase('myCanvas1b'); 
            erase('myCanvas2'); 
            erase('myCanvas3'); 
            erase('myCanvas4');*/ 

           } else if (slideVal > 34 && slideVal <= 67) { 

            /*erase('myCanvas1'); 

            erase('myCanvas2'); 
            erase('myCanvas3'); 
            erase('myCanvas4');*/ 

           } else if (slideVal > 67 && slideVal <= 100) { 

            /*erase('myCanvas1'); 

            erase('myCanvas2'); 
            erase('myCanvas3'); 
            erase('myCanvas4');*/ 

           } 
          } 

          function erase(canvasId) { 

           var canvas = document.getElementById(canvasId); 
           var context = canvas.getContext("2d"); 
           context.beginPath(); 
           context.clearRect(0, 0, canvas.width, canvas.height); 
           canvas.width = canvas.width; 

          } 

          /**********for backgroundImage********************/ 

          function quadraticCurve(canId, spx, spy, cpx, cpy, endx, endy) { 

           var canvas = document.getElementById(canId); 
           var ctx = canvas.getContext('2d'); 

           ctx.beginPath(); 
           ctx.moveTo(spx, spy); 
           ctx.quadraticCurveTo(cpx, cpy, endx, endy); 
           ctx.strokeStyle = "#eaca2d"; 
           ctx.stroke(); 

          } 

          function bezierCurve(canId, spx, spy, cpx1, cpy1, cpx2, cpy2, endx, endy) { 

           var canvas = document.getElementById(canId); 
           var ctx = canvas.getContext('2d'); 

           ctx.beginPath(); 
           ctx.moveTo(spx, spy); 
           ctx.quadraticCurveTo(cpx1, cpy1, cpx2, cpy2, endx, endy); 
           ctx.strokeStyle = "#eaca2d"; 
           ctx.stroke(); 

          } 

          function newSprite(canId, mvx, mvy) { 
           var canvas = document.getElementById(canId); 
           var ctx = canvas.getContext('2d'); 
           ctx.globalCompositeOperation = 'source-over'; 
           //ctx.globalCompositeOperation = "destination-over"; 
           ctx.beginPath(); 
           ctx.fillStyle = "#0077c1"; 
           ctx.arc(mvx, mvy, 6, 0, Math.PI * 2, true); 
           ctx.closePath(); 
           ctx.fill(); 
          } 

          function drawSlopeCurve1(sID, maxValue) { 
           // erase('canvasTwo'); 

           var canId = 'myCanvas4'; 
           var slideVal = parseInt(document.getElementById(sID).value); 
           var canvas = document.getElementById(canId); 
           var context = canvas.getContext('2d'); 
           canvas.width = canvas.width; 
           //line end points 
           x1 = 16; 
           y1 = 170; 
           x2 = 200; 
           y2 = 80; 

           //get slope (rise over run) 
           var m = (y2 - y1)/(x2 - x1); 
           //get y-intercept 
           var b = y1 - (m * x1); 
           //get distance between the two points 
           var distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); 
           //get new x and y values 
           var x = x1 + parseInt(distance/maxValue * slideVal); 
           var y = parseInt(m * x + b); 

           context.beginPath(); 
           context.moveTo(x1, y1); 
           context.lineTo(x, y); 
           context.lineWidth = 0.6; 
           context.stroke(); 

           newSprite(canId, x, y); 
          } 

          function drawSlopeCurve2(sID, maxValue) { 
           // erase('canvasTwo'); 

           var canId = 'myCanvas3'; 
           var slideVal = parseInt(document.getElementById(sID).value); 
           var canvas = document.getElementById(canId); 
           var context = canvas.getContext('2d'); 
           canvas.width = canvas.width; 
           //line end points 
           x1 = 16; 
           y1 = 170; 
           x2 = 160; 
           y2 = 72; 

           //get slope (rise over run) 
           var m = (y2 - y1)/(x2 - x1); 
           //get y-intercept 
           var b = y1 - (m * x1); 
           //get distance between the two points 
           var distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); 
           //get new x and y values 
           var x = x1 + parseInt(distance/maxValue * slideVal); 
           var y = parseInt(m * x + b); 

           context.beginPath(); 
           context.moveTo(x1, y1); 
           context.lineTo(x, y); 
           context.lineWidth = 0.6; 
           context.stroke(); 

           newSprite(canId, x, y); 
          } 

         </script> 
        </form> 
       </body> 
      </html> 

這是鏈接的jsfiddle:http://jsfiddle.net/QRVxH/

+1

你有什麼試過?您已經擁有繪製曲線的代碼,因此只需在滑塊更改時更改這些值,您已經爲滑塊值更改編寫了處理程序。 – Sean

回答

1

應該通過一個函數定義曲線開始,這樣你就可以計算在圖形應該結束對每個x位置。然後你也知道在哪裏繪製結束點。

我的演示功能,具有以下功能:在畫布上繪製一個正弦:

function calc(x){ 
    var y = 100 + (50*Math.sin(x*400)); 
    return y; 
} 

通過繪製你得到你的圖形點之間的直線(不是曲線!)。

for (var x=0; x<=400 && (x <= slider.value); x+=3){   
    y= calc(x); 
    ctx.lineTo(x, y); 
} 

工作演示:http://jsfiddle.net/w1ll3m/CbjWK/11/

新增html5slider.js,使Firefox中的滑塊工作。

+0

非常感謝您的幫助。我已經得到了繪製曲線的代碼。但它不如你的畫得流暢。任何人都可以幫助使它工作順利嗎?我也想在同一條曲線上移動一個對象。和最後一個問題我怎麼能使這個工作在貝塞爾曲線。我的工作js小提琴鏈接:http://jsfiddle.net/JGz4T/1/ –

+0

您的代碼有多個路徑(如果/其他與點集),這並不容易!用'y = 3x^2'或'y = cos(x)'等式來定義你的線,所以你可以簡單地選擇你的x來計算你的y。這樣你可以繪製一個1到4個像素點(x軸)的點。 http://jsfiddle.net/w1ll3m/JGz4T/4/看到我的紅線! – Willem

+0

你能解釋一下你用來得分的等式嗎?我也試圖在0位置啓動滑塊,但它會到達最終位置。 –