Hooke กล่าวไว้ว่า " ระยะยืดของวัตถุจะเป็นสัดส่วนโดยตรงกับแรงที่ใช้ยึดวัตถุนั้น โดยวัตถุจะยืดได้ไม่เกิน จุดจำกัดของสัดส่วน ถ้าหากวัตถุยืดเกินไปจากจุดนี้ก็จะเข้าสู่ ขีดจำกัดสภาพยืดหยุ่น วัตถุนั้นจะหยุดการยืดหยุ่นและไม่สามารถคืนสู่สภาพเดิมได้อีก" (1,2)
จากเอกสารของ อาจารย์ รุ่งอรุณ สมบัติรักษ์ (2)
จะได้ F = kX
เมื่อ F คือแรงที่ใช้ในการยืดสปริง
X คือระยะยืดของสปริง
k คือค่าคงที่ของ tension ของสปริง
ตามความเป็นจริงแล้วเมื่อยืดสปริงออกแล้วปล่อยให้มือเราจะพบว่าระยะยืดของสปริงจะลดลงเมื่อเวลาผ่านไปและหยุด (ระยะยืดเป็น 0) ในที่สุด ในตัวอย่างนี้เรากำหนดให้ค่าคงที่ tension เก็บไว้ในตัวแปร _tension และอัตราการลดลงของระยะยืดเก็บไว้ในตัวแปร _damp เนื่องจากการสร้างตัวแบบในโปรแกรมต้องมีการกำหนดว่าตำแหน่งของวัตถุจะเคลื่อนที่ไปถึงไหนเราจึงกำหนดตัวแปร _xTarget และ _yTarget ไว้เพื่อเก็บตำแหน่งสุดท้ายนี้ไว้ และเมื่อเวลาผ่านไประยะยืดจะลดลงซึ่งเราคำนวณได้จากชุดคำสั่ง
var ax:Number=(this._xTarget - this._ball.x) * this._tension;
var ay:Number=(this._yTarget - this._ball.y) * this._tension;
และคำนวณอัตราการลดลงของระยะยืดของสปริงจากชุดคำสั่ง
this._xPos*=this._damp;
this._yPos*=this._damp;
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.Graphics;
public class HookeMoving extends Sprite{
private var _xPos:Number = 20;
private var _yPos:Number=0;
private var _tension:Number=0.5;
private var _damp:Number=0.95;
private var _xTarget:Number=200;
private var _yTarget:Number=200;
private var _ball:Sprite;
public function HookeMoving(){
this.drawMe();
this.setPosition(0,200);
var timer:Timer = new Timer(50,0);
timer.addEventListener("timer",HookesMove);
timer.start();
}
public function setPosition(x:Number,y:Number):void{
this._ball.x=x;
this._ball.y=y;
}
private function drawMe():void{
this._ball=new Sprite();
this._ball.graphics.beginFill(0xFF0000,200);
this._ball.graphics.drawCircle(0,0,10);
this._ball.graphics.endFill();
addChild(this._ball);
}
private function HookesMove(e:TimerEvent):void{
var ax:Number=(this._xTarget - this._ball.x) * this._tension;
var ay:Number=(this._yTarget - this._ball.y) * this._tension;
this._xPos+=ax;
this._yPos+=ay;
this._ball.x+=this._xPos;
this._ball.y+=this._yPos;
this._xPos*=this._damp;
this._yPos*=this._damp;
}
}
}
Demo :
ในการทดสอบโดยการเปลี่ยนค่าตัวแปร _tension, _damp,_xTarget, _yTarget ก็จะพบรูปแบบการเคลื่อนที่แบบต่าง ๆ กันไป ที่นี้ลองเพิ่มความสนุกเข้าไปโดยการแทนที่ค่าของ _xTarget และ _yTarget ด้วย mouseX และ mouseY ตามลำดับ ก็จะพบว่าตำแหน่งของ mouse ได้กลายเป็นศูนย์กลางของการแกว่งของสปริงและมีลูกตุ้มสีแดงหมุนอยู่รอบๆ
Demo 2 : เลื่อนเมาส์ไปมาในกรอบสี่เหลี่ยมแล้วสังเกตุการเคลื่อนที่ของบอลสีแดง
(1) http://www.electron.rmutphysics.com/physics-glossary/index.php?option=com_content&task=view&id=1186&Itemid=60
(2) http://www.electron.rmutphysics.com/news/index.php?option=com_content&task=view&id=1847&Itemid=18
จากเอกสารของ อาจารย์ รุ่งอรุณ สมบัติรักษ์ (2)
จะได้ F = kX
เมื่อ F คือแรงที่ใช้ในการยืดสปริง
X คือระยะยืดของสปริง
k คือค่าคงที่ของ tension ของสปริง
ตามความเป็นจริงแล้วเมื่อยืดสปริงออกแล้วปล่อยให้มือเราจะพบว่าระยะยืดของสปริงจะลดลงเมื่อเวลาผ่านไปและหยุด (ระยะยืดเป็น 0) ในที่สุด ในตัวอย่างนี้เรากำหนดให้ค่าคงที่ tension เก็บไว้ในตัวแปร _tension และอัตราการลดลงของระยะยืดเก็บไว้ในตัวแปร _damp เนื่องจากการสร้างตัวแบบในโปรแกรมต้องมีการกำหนดว่าตำแหน่งของวัตถุจะเคลื่อนที่ไปถึงไหนเราจึงกำหนดตัวแปร _xTarget และ _yTarget ไว้เพื่อเก็บตำแหน่งสุดท้ายนี้ไว้ และเมื่อเวลาผ่านไประยะยืดจะลดลงซึ่งเราคำนวณได้จากชุดคำสั่ง
var ax:Number=(this._xTarget - this._ball.x) * this._tension;
var ay:Number=(this._yTarget - this._ball.y) * this._tension;
และคำนวณอัตราการลดลงของระยะยืดของสปริงจากชุดคำสั่ง
this._xPos*=this._damp;
this._yPos*=this._damp;
package{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.Graphics;
public class HookeMoving extends Sprite{
private var _xPos:Number = 20;
private var _yPos:Number=0;
private var _tension:Number=0.5;
private var _damp:Number=0.95;
private var _xTarget:Number=200;
private var _yTarget:Number=200;
private var _ball:Sprite;
public function HookeMoving(){
this.drawMe();
this.setPosition(0,200);
var timer:Timer = new Timer(50,0);
timer.addEventListener("timer",HookesMove);
timer.start();
}
public function setPosition(x:Number,y:Number):void{
this._ball.x=x;
this._ball.y=y;
}
private function drawMe():void{
this._ball=new Sprite();
this._ball.graphics.beginFill(0xFF0000,200);
this._ball.graphics.drawCircle(0,0,10);
this._ball.graphics.endFill();
addChild(this._ball);
}
private function HookesMove(e:TimerEvent):void{
var ax:Number=(this._xTarget - this._ball.x) * this._tension;
var ay:Number=(this._yTarget - this._ball.y) * this._tension;
this._xPos+=ax;
this._yPos+=ay;
this._ball.x+=this._xPos;
this._ball.y+=this._yPos;
this._xPos*=this._damp;
this._yPos*=this._damp;
}
}
}
Demo :
ในการทดสอบโดยการเปลี่ยนค่าตัวแปร _tension, _damp,_xTarget, _yTarget ก็จะพบรูปแบบการเคลื่อนที่แบบต่าง ๆ กันไป ที่นี้ลองเพิ่มความสนุกเข้าไปโดยการแทนที่ค่าของ _xTarget และ _yTarget ด้วย mouseX และ mouseY ตามลำดับ ก็จะพบว่าตำแหน่งของ mouse ได้กลายเป็นศูนย์กลางของการแกว่งของสปริงและมีลูกตุ้มสีแดงหมุนอยู่รอบๆ
Demo 2 : เลื่อนเมาส์ไปมาในกรอบสี่เหลี่ยมแล้วสังเกตุการเคลื่อนที่ของบอลสีแดง
(1) http://www.electron.rmutphysics.com/physics-glossary/index.php?option=com_content&task=view&id=1186&Itemid=60
(2) http://www.electron.rmutphysics.com/news/index.php?option=com_content&task=view&id=1847&Itemid=18
ความคิดเห็น
แสดงความคิดเห็น