การเคลื่อนที่แบบ Spring ตามแนวคิดของ Hooke

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

ความคิดเห็น