2110101 : Lab6 - Bouncing Ball

 

สิ่งที่ต้องการ

ดูลูกบอลสามลูกข้างล่างนี้ ลูกทางซ้ายเด้งไปมาแบบไปมีการสูญเสียพลังงานในสภาพไร้แรงโน้มถ่วง สิ่งที่ต้องการให้เขียนคือ XBall1.java ซึ่งมีพฤติกรรมการเด้งของลูกบอลแบบไม่มีการสูญเสียพลังงาน และอยู่ในสภาพที่มีแรงโน้มถ่วงด้วย  และ XBall2.java ซึ่งเป็นลูกบอลที่มีการเสียการสูญเสียพลังงาน และอยู่ภายใต้แรงโน้มถ่วง  (อยากให้เริ่มเด้งใหม่ ให้นำ mouse ไปคลิกภายในบริเวณ)
  

XBall1.java

XBall2.java

ให้นักเรียนแก้โปรแกรมในส่วนที่หมายเลขบรรทัดเป็นสีเทา

ข้อแนะนำ

  • ทำ XBall1.java ก่อน เพราะมีการเพิ่มเติมคำสั่งอีกเพียงสองสามบรรทัดเท่านั้น
  • โปรแกรมเริ่มต้นที่ให้ใน XBall1 และ XBall2 จะพฤติกรรมเป็นแบบลูกบอลทางซ้ายในรูปข้างบนนี้
  • เมื่อต้องการสั่งทำงาน ให้กดปุ่ม F5
  • อ่านคำอธิบายเพิ่มเติมข้างล่างนี้ก่อน

คำอธิบายเพิ่มเติม

  • ส่วนของโปรแกรมที่ปรากฏในเมท็อด run ซึ่งมีพฤติกรรมแบบเด้งไปมาในสภาพไร้แรงโน้มถ่วงและไม่มีการสูญเสียพลังงานนั้น เป็นดังนี้
while (ballThread == Thread.currentThread()) {
  frameWidth = getSize().width;
  frameHeight = getSize().height;
  if (x <= radius || x >= frameWidth - radius) dx = -dx;
  if (y <= radius || y >= frameHeight - radius) dy = -dy;
  x += dx;
  y += dy;
  repaint();
  try {
   Thread.sleep(30);
  } catch (InterruptedException e) {}
}
  • เงื่อนไขที่ while อ่านแล้วอาจงงๆ แต่ตีความได้ว่าให้ทำงานใน loop นี้ไปเรื่อยๆ จนกว่าลูกบอลจะถูกทำลาย (โดยการนำเมาส์ไป click ในบริเวณที่เด้ง) ตรงนี้อย่าไปสนใจมาก ว่าทำไมเป็นแบบนี้ เพราะเนื้อหาที่สอนไม่ได้ครอบคลุมตรงนี้  
  • สองบรรทัดต่อมาเป็นการคำนวณหาความกว้าง (frameWidth) และความสูง (frameHeight) ของกรอบที่ลูกบอลเด้งอยู่ภายใน
  • มีตัวแปร 5 ตัวที่ต้องทำความเข้าใจความหมายของมัน  (ทั้ง 5 ตัวนี้ได้ประกาศและตั้งค่าเริ่มต้นไว้เรียบร้อยแล้วที่อื่น) ดังนี้
    • ตัวแปร x และ y เก็บพิกัด (x,y) ของลูกบอล   (x,y) มีค่าเป็น (0,0) ที่มุมซ้ายบนของกรอบ  x มีค่าเพิ่มขึ้นไปทางซ้าย y มีค่าเพิ่มขึ้นเมื่อดิ่งลง
    • ตัวแปร dx และ dy เก็บอัตราการเปลี่ยนแปลงตำแหน่งของลูกบอล ทางแนวนอนและแนวตั้ง  หรือพูดอีกอย่างหนึ่งว่า (dx, dy) เป็นเวกเตอร์ของความเร็วของลูกบอล  ตัวอย่างเช่น ถ้า dx เป็นบวกก็แสดงว่าลูกบอลกำลังเคลื่อนที่ไปทางขวา ถ้า dy เป็นลบก็แสดงว่าลูกบอลกำลังลอยขึ้น เป็นต้น
    • ตัวแปร radius แทนรัศมีของลูกบอล
  • เงื่อนไข if สองบรรทัดต่อมาเป็นการตรวจสอบว่าตำแหน่งของลูกบอลกระทบขอบหรือไม่ ถ้ากระทบให้เปลี่ยนแปลงเวกเตอร์ที่แทนความเร็วของลูกบอล เช่นถ้ากระทบขอบซ้าย (นั่นคือเงื่อนไข x <= radius) หรือกระทบขอบขวา (x >= frameWidth - radius) ก็ให้กลับทิศ dx เป็นต้น
  • คำสั่ง x += dx; และ y += dy เป็นการปรับตำแหน่งลูกบอล
  • เมท็อด repaint() สั่งให้วาดรูปลูกบอลใหม่ตามพิกัด (x,y) ใหม่ที่คำนวณได้
  • สามบรรทัดต่อมาสุดท้ายของ loop บอกว่าให้ระบบหยุดรอประมาณ 30 millisecond (เป็นคำสั่งและเมท็อดที่ยังไม่เคยอธิบายมาก่อน) ซึ่งเป็นการควบคุมให้ตำแหน่งลูกบอลเกิดการเปลี่ยนแปลงทุกๆ 30ms
  • ตำแหน่ง ขนาด และความเร็วเริ่มต้นของลูกบอล ถูกกำหนดไว้แล้ว ก่อนเข้า loop นี้ (ถ้าอยากรู้ว่าตั้งค่าเท่าใด ให้ไปดูที่เมท็อด setBallProperties)
  • ข้อสังเกต
    • ในสภาพไร้แรงโน้มถ่วงและไม่สูญเสียพลังงาน dx และ dy มีการเปลี่ยนแปลงก็เฉพาะตอนกระทบขอบเท่านั้น
    • ถ้ามีแรงโน้มถ่วงด้วย ก็แสดงว่าลูกบอลต้องมีความเร่งตามแนวดิ่งลง นั่นคือ dy ต้องมีการเปลี่ยนแปลง จะเปลี่ยนอย่างไร เท่าใด และเมื่อไรเป็นสิ่งที่ให้นักเรียนคิด
    • การสูญเสียพลังงานจะเกิดขึ้นขณะลูกบอลกระทบกับขอบ ทำไห้ความเร็วก่อนกระทบและหลังกระทบไม่เท่ากัน (แน่นอนว่าหลังกระทบต้องมีขนาดน้อยกว่า เพราะได้สูญเสียพลังงาน) จะลดลงอย่างไร เท่าใด เมื่อไร  เป็นสิ่งนักเรียนต้องคิด

คะแนนเต็ม : 10 คะแนน

  • เขียนโปรแกรม 10 คะแนน  (ลูกละ 5 คะแนน   ไม่มีระบบตรวจอัตโนมัติ จะตรวจให้ภายหลัง)

เวลาปฏิบัติการ : 45 นาที