2013-05-09 85 views
2

我用下面的代碼繪製了一個多邊形。現在我想動態調整這個多邊形的大小。詳細地說,我想在多邊形的一邊設置一個角度運動,這樣就形成了一個弧,從而改變了多邊形的大小。我搜索了關於多邊形動畫的所有內容,但沒有得到任何東西,雖然有很多線性動畫材質。如何在HTML5畫布中爲多邊形大小設置動畫效果?

<script> 
    $(function(){ 
    var c=$('#myCanvas'); 
    var ctx=c.getContext("2d"); 
    ctx.fillStyle='#f00'; 
    ctx.beginPath(); 
    ctx.moveTo(0,40); 
    ctx.lineTo(80,200); 
    ctx.lineTo(100,200); 
    ctx.lineTo(40,0); 
    ctx.closePath(); 
    ctx.fill(); 
</script> 
</div> 

是否可以選取一條多邊形併爲其設置動畫效果,以更改多邊形的形狀?

+0

不是一個答案,但* *爲什麼你會使用jQuery(或其他一些庫/框架)爲? – PeeHaa 2013-05-09 13:48:36

+0

我不知道是否有這樣的庫設計,但是您可以對算法進行編碼,以進行角運動,然後重新繪製事件的線條。 – eLRuLL 2013-05-09 14:11:56

+0

當然可以。 _不要對座標進行硬編碼 - 畫布除了像素之外什麼也不知道。正如elRuLL所說 - 將計算座標的數學運用到程序中。這將允許您以不同的比例/平移/旋轉繪製相同的圖形。另一方面,如果希望改變形狀 - 例如從正方形變爲圓形,然後存儲座標數組。根據需要移動它們,然後清除屏幕並重新繪製。重複ad-nauseum .. – enhzflep 2013-05-09 14:45:38

回答

0

確定這是我做過什麼,並且制定了:

<script> 
var canvas = document.getElementById("myCanvas"); 
var dc  = canvas.getContext("2d"); 
var angle = 0; 
var x = canvas.width; 
var y = canvas.height; 
window.setInterval(function(){ 
    angle = (angle + 1) % 360; 
    dc.clearRect(0, 0, canvas.width, canvas.height); 

    dc.save(); 
    dc.fillStyle = "#DDDDDD"; 

    dc.translate(x/2,y); 
    dc.rotate(angle*Math.PI/270); // rotate 90 degrees 
    dc.translate(0,0); 

    dc.beginPath(); 
    dc.moveTo(-x/16, 0); 
    dc.lineTo(-x, y/2); 
    dc.lineTo(-x/2,y); 
    dc.lineTo(-0,y/16); 
    dc.closePath(); 
    dc.fill(); 

    dc.restore(); 
}, 20); 
</script> 

我提到比爾的答案在https://stackoverflow.com/a/2767556/2163837感謝您的幫助也。

1

訣竅是將多邊形的座標存儲在數組中,然後處理數組中的數字。

然後渲染你的數組到畫布。當涉及到翻譯和你有什麼時,無憂無慮。

請將canvas作爲當前數組中任何內容的快照。

1

下面介紹如何將三角形變成方形,將方形變成五角形等。

此代碼繪製正多邊形具有指定數量的邊:

function drawPolygon(sideCount,size,centerX,centerY){ 

    // draw a regular polygon with sideCount sides 
    ctx.save(); 
    ctx.beginPath(); 
    ctx.moveTo (centerX + size * Math.cos(0), centerY + size * Math.sin(0));   
    for (var i = 1; i <= sideCount;i += 1) { 
     var x=centerX + size * Math.cos(i * 2 * Math.PI/sideCount); 
     var y=centerY + size * Math.sin(i * 2 * Math.PI/sideCount); 
     ctx.lineTo (x, y); 
    } 
    ctx.stroke(); 
    ctx.fill(); 
    ctx.restore();   

} 

動畫奇數條邊的多邊形成偶數邊的多邊形

enter image description here

在該圖示中您可以通過將三角形上的每個彩色頂點動畫到其在廣場上的相應位置來將三角形動畫化爲正方形。所有奇數邊多邊形都以相同方式轉換爲偶數邊多邊形。

動畫偶數邊的多邊形分成奇數條邊的多邊形

enter image description here

在這個圖示中,可以通過對所述平方每個彩色頂點動畫到其相應的位置的動畫方形成五角形五角大樓。在這種情況下,還必須將兩個中最左側的黃色頂點剪切,並將兩個部分的動畫製作爲五角形上的兩個黃色頂點。所有偶數邊多邊形都以相同的方式轉換爲奇數邊多邊形。

這裏的代碼和一個小提琴:http://jsfiddle.net/m1erickson/DjV5f/

<!doctype html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 

<style> 
    body{ background-color: ivory; padding:10px; } 
    canvas{border:1px solid red;} 
    p{font-size:24px;} 
</style> 

<script> 
    $(function(){ 

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


     // 
     var colors=["","blue","green","black"]; 
     drawPolygon(3,50,70,70,2,"blue","red",colors,true); 
     colors=["","blue","yellow","green","black"]; 
     drawPolygon(4,50,215,70,2,"blue","red",colors,false); 
     // 
     ctx.beginPath(); 
     ctx.moveTo(0,162); 
     ctx.lineTo(300,162); 
     ctx.stroke(); 
     // 
     var colors=["black","blue","yellow","green"]; 
     drawPolygon(4,50,70,250,2,"blue","red",colors,true); 
     colors=["black","blue","yellow","yellow","green"]; 
     drawPolygon(5,50,215,250,2,"blue","red",colors,false); 


     function drawPolygon(sideCount,size,centerX,centerY,strokeWidth,strokeColor,fillColor,colorPts,showBursePoint){ 

      // draw a regular polygon with sideCount sides 
      ctx.save(); 
      ctx.beginPath(); 
      ctx.moveTo (centerX + size * Math.cos(0), centerY + size * Math.sin(0));   
      for (var i = 1; i <= sideCount;i += 1) { 
       var x=centerX + size * Math.cos(i * 2 * Math.PI/sideCount); 
       var y=centerY + size * Math.sin(i * 2 * Math.PI/sideCount); 
       ctx.lineTo (x, y); 
      } 
      ctx.fillStyle=fillColor; 
      ctx.strokeStyle = strokeColor; 
      ctx.lineWidth = strokeWidth; 
      ctx.stroke(); 
      ctx.fill(); 
      ctx.restore();   

      // draw vertex points 
      for (var i = 1; i <= sideCount;i += 1) { 
       var x=centerX + size * Math.cos(i * 2 * Math.PI/sideCount); 
       var y=centerY + size * Math.sin(i * 2 * Math.PI/sideCount); 
       drawPoint(x,y,colorPts[i]); 
      } 

      // draw point where this poly will "burst" to create next poly 
      if(showBursePoint){ 
       var burstX= centerX + size * Math.cos(Math.floor(sideCount/2) * 2 * Math.PI/sideCount); 
       var burstY= centerY; 
       drawPoint(burstX, burstY, "yellow");   
      } 
     } 

     function drawPoint(x,y,fill){ 
      ctx.save() 
      ctx.strokeStyle="black"; 
      ctx.lineWidth=2; 
      ctx.fillStyle=fill; 
      ctx.beginPath(); 
      ctx.arc(x,y,6,0,Math.PI*2,false); 
      ctx.fill(); 
      ctx.stroke(); 
      ctx.restore(); 
     } 

    }); // end $(function(){}); 
</script> 

</head> 

<body> 
    <p>Regular polygons (3-8 sides)</p><br/> 
    <p>Unmoving anchor point is green</p><br/> 
    <p>Burst point is yellow</p><br/> 
    <canvas id="canvas" width=300 height=350></canvas> 
</body> 
</html> 
+0

這很鼓舞人心.. Upvote ..其實我試圖畫出閃光燈熄滅火炬..並想旋轉閃光燈的軌跡相對於鼠標運動所創建的角度。尚未達到那個輪換部分。 – 2013-05-11 10:53:11