គំនូរ​ជីវចល
គោលការណ៍​នៃ​ គំនូរ​ជីវចល​ (animation) នៅ​ក្នុង​ធាតុ canvas ក៏​មិន​ខុស​គ្នា​ពី​គោល​ការណ៍​ទូទៅ​នៃ​គំនូរ​ជីវចល​នៅ​ក្នុង​ខ្សែ​ភាពយន្ត​ដែរ​។ ពោល​គឺ​មាន​គោលការណ៍​ដ៏​ធំ​ចំបង ២ ដែល​អ្នក​ផលិត​គំនូរ​ជីវចល​ទាំងឡាយ​តែង​តែ​យក​មក​អនុវត្ត​។ គោលការណ៍​ទី ១ គឺ​ការផ្លាស់​ប្តូរ​ទីតាំង​និង​ឬ​កែប្រែ​ទំរង់​របស់​រូប​គំនូរ​ទាំងឡាយ នៅ​ក្នុង​រយពេល​កំណត់​ណា​មួយ​។ គោលការណ៍​ទី​ ២ គឺ​ការ​បែង​ចែក​រូបភាព​នៃ​ចលនា​របស់​រូប​គំនូរ​ទាំងនោះ ជា​រូបភាព​តូច​ៗ​ បាន​កាន់​តែ​ច្រើន​កាន់​តែ​ល្អ​។ រូបភាព​តូច​ៗ​ទាំងនោះ ត្រូវ​គេ​អោយ​ឈ្មោះ​ថា​ជា frame ។ ឧទាហរណ៍ រូបភាព​នៃ​ចលនា​លើក​ដៃ​អេះ​ក្បាល​របស់​រូប​គំនូរ​ អាច​ចែក​ចេញ​ជា​រូប​ភាព​តូច​ៗ​ជា​ច្រើន​ទៀត គឺ​ចាប់​តាំង​ពី​រូបភាព​លើក​ដៃ​ដំបូង រហូត​ដល់​រូបភាព​យក​ដៃ​អេះ​ក្បាល​ចុង​ក្រោយ​គេ​។ យ៉ាងណាម៉ិញ ពាក្យ​ថា​រូបភាព​តូច មិនមែន​មាន​ន័យ​ថា​មាន​ទំហំ​តូច​នោះ​ទេ គឺ​មាន​ន័យ​ថា​ ជា​រូបភាព​រង​នៃ​ចលនា​ណា​មួយ​នៅ​ក្នុង​ខណៈ​ណាមួយ​។

និយាយ​រួម​ រូបភាព​នៃ​ចលនា​ណាមួយ គឺ​ជា​ការកើត​ចេញ​ពីការយក​រូបភាព​តូច​ៗ​នៃ​ចលនា​នោះ ចាប់​​ពី​ពេល​ចាប់​ផ្តើម​ រហូត​ដល់​ពេល​ចប់ មក​បង្ហាញ​ដល់​ទស្សនិកជន មួយ​ម្តង​ៗ​ យ៉ាង​រហ័ស​ជាទី​បំផុត​។ ជាទូទៅ ល្បឿន​មធ្យម​នៃ​ការបង្ហាញ​រូប​ភាព​តូច​ៗ​ដែល​ជា frame ទាំងនោះ​ត្រូវ​អោយ​បាន​យ៉ាង​ហោច​ណាស់​ក៏​ពី ១០ ទៅ ១២ រូប​ក្នុង​មួយ​វិនាទី​ដែរ ទើប​ធ្វើ​អោយ​ភ្នែក​មនុស្ស​យើង មើល​ឃើញ​ថា​ជា​ចលនា​ជាប់​មិន​ដាច់​។ ផ្ទុយ​ទៅ​វិញ ​បើ​រូបភាព​ដែល​ត្រូវ​យក​មក​បង្ហាញ​មាន​ចំនួន​តិច​ពេក ភ្នែក​មនុស្ស​យើង​នឹង​មើល​ឃើញ​រូបភាព​ទាំងនោះ​មាន​ចលនា​ដើរ​ឈប់​ៗ​។ ពិនិត្យ​កម្មវិធី​ខាង​ក្រោម​នេះ៖
<!DOCTYPE html>
<html>
  <head>
    
    
    
  </head>
  <body>

    <canvas id="vuthclock" width="613" height="520"> </canvas>
    <img id="clock" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgILxJJijz1XkNhEeYqijKev0g4nn05lzL9Apt3qb-pO2KnTNEseQXZTABDYWGaNrhY984g0Mz-edznp1MpQYqKzEsKqj4QyvnN4lWcMqDXu7eKHBYQ5XfgdlvoZvkP2qUVQn1qDjAt00o/s512/clock.png" />

	<script>  
    function draw(){  
	  var canvas = document.getElementById('vuthclock');  
      if (canvas.getContext){  
        var ctx = canvas.getContext('2d');
        var img = document.getElementById("clock");
        ctx.drawImage(img, 0, 0);

	    //ក្បួន​គណនា​កូអរដោនេ
	    function xyAxis(angle,radius, center){
    	    var x = Math.round(radius * Math.sin(Math.PI - angle) + center[0]);
   		    var y = Math.round(radius * Math.cos(Math.PI - angle) + center[1]);
    	    return [x,y];
        }
       
        //គូរ​ទ្រនិច​ម៉ោង
        var dimension = 512;
        var date = new Date(); 
	    var angle = date.getHours()*Math.PI/6 + Math.PI/6/60*date.getMinutes();
	    ctx.beginPath();
	    ctx.lineCap = 'round';
	    ctx.lineWidth = 12;
	    ctx.strokeStyle = "white";
	    ctx.moveTo(dimension/2, dimension/2);
	    lineTo = xyAxis(angle,dimension/2-70, [dimension/2, dimension/2]); 
	    ctx.lineTo(lineTo[0], lineTo[1]);
        ctx.stroke();
    
	    //គូរ​ទ្រនិច​នាទី
	    angle = date.getMinutes()*Math.PI/30;
	    ctx.beginPath();
	    ctx.lineCap = 'round';
	    ctx.lineWidth = 8;
	    ctx.strokeStyle = "white";
	    ctx.moveTo(dimension/2, dimension/2);
	    lineTo = xyAxis(angle,dimension/2-30, [dimension/2, dimension/2]); 
	    ctx.lineTo(lineTo[0], lineTo[1]);
        ctx.stroke();
    
	    //គូរ​ទ្រនិច​វិនាទី
	    angle = date.getSeconds()*Math.PI/30;
	    ctx.beginPath();
	    ctx.lineCap = 'round';
	    ctx.lineWidth = 5;
	    ctx.strokeStyle = "red";
	    ctx.moveTo(dimension/2, dimension/2);
	    lineTo = xyAxis(angle,dimension/2-10, [dimension/2, dimension/2]); 
	    ctx.lineTo(lineTo[0], lineTo[1]);
        ctx.stroke();
    
        //គូររង្វង់​​គល់​ទ្រនិច
        var x = dimension/2;
	    var y = dimension/2;
	    radius = 15;
	    startAngle = 0;
	    endAngle = Math.PI*2;
	    anticlockwise = true;
	    ctx.fillStyle = "white"; 
	    ctx.strokeStyle = "darkBLue";
	    ctx.lineWidth = 2;
	    ctx.beginPath();
	    ctx.arc(x,y,radius,startAngle,endAngle, anticlockwise);
        ctx.fill();
      }  
    }

  WebFont.load({
    custom: {
      families: ['Moul'],
      urls:['fonts/fonts.css']
    },
    active: function(){
      setInterval("draw()", 1000);
    },
    inactive: function(){
      alert('មិន​​អាច​ទាញ​យក​ពុម្ព​អក្សរ​បាន​ទេ។');
    }
  });
  </script>
    
  </body>
</html>

នៅ​ក្នុង​កម្មវិធី​ខាង​លើ​នេះ យើង​ពិនិត្យ​ឃើញ​ថា ការង្ហាញ​រូប​នាឡិកាប៉ោល​ជាមួយ​នឹង​ទ្រនិច​ស្ថិត​នៅ​ទីតាំង​ថ្មី ត្រូវ​ធ្វើ​ឡើង​រាល់​មួយ​វិនាទី​ម្តង ពី​ព្រោះ​រូប​ទ្រនិច​នាឡិកា​ខាង​លើ​នេះ​ មាន​ចលនា​តែ​ក្នុង​មួយ​វិនាទី​ម្តង​តែ​ប៉ុណ្ណោះ ដូចនេះ​យើង​មិន​ចាំបាច់​បង្ហាញ​រូប​នាឡិកា​ចំនួន​ពី ១០ ទៅ ១២ រូប​ដើម្បី​អោយ​មាន​ចលនា​ដោយ​រលូន​ឡើយ​។

យ៉ាងណាម៉ិញ ការគូរ​រូប​នាឡិកា​ជាមួយ​នឹង​ទ្រនិច​នៅ​ទីតាំង​ថ្មី​ត្រូវ​ធ្វើ​ឡើង​ដោយ​ប្រើប្រាស់​វិធី​មាន​ស្រាប់​មួយ​ចំនួន​ទាក់ទង​នឹង​ផ្ទាំង​គំនូរ canvas ទ្វេមាត្រ​។ ហើយ​ការគូរ​នោះ​ត្រូវ​ធ្វើ​ឡើង​រាល់​មួយ​វិនាទី​ម្តង ដោយ​ប្រើប្រាស់​ក្បួន​មានស្រាប់​ setInterval() ដូច​នៅ​លើ​បន្ទាត់​លេខ 85 នោះ​ស្រាប់​។ ក្បួន​មួយ​នេះ​ដើរ​តួនាទី​សំខាន់​នៅ​ក្នុង​គំនូរ​ជីវចល​និង​ល្បែង​កំព្យូទ័រ ព្រោះ​វា​ធ្វើ​អោយ​កម្មវិធី​ JS ដំណើរការ​ទៅ​ជាប់​រហូត​ ដូច​ជា​កម្មវិធី​នៅ​លើ server ដែរ​៕

Transformations
Method Description
scale() Scales the current drawing bigger or smaller
rotate() Rotates the current drawing
translate() Remaps the (0,0) position on the canvas
transform() Replaces the current transformation matrix for the drawing
setTransform() Resets the current transform to the identity matrix. Then runs transform()