Science

ตัวบทความนี้เขียนไว้นานแล้วตั้งกะแต่เราทำ ตะกร้อลอดห่วง วุ่นอยู่นานเหมือนกัน

1.เราอาจสร้างตัวแปรดังนี้

  1. //ผู้ใช้ป้อน Input
  2. float Uprojectile
  3. float Degree
  4.  
  5. //Output
  6. float Sx; //เอาไปกำหนดตำแหน่งวัตถุบนหน้าจอ สำหรับแกน x
  7. float Sy; //เอาไปกำหนดตำแหน่งวัตถุบนหน้าจอ สำหรับแกน y
  8. float Time;
  9.  
  10. //ค่าคงที่
  11. float g=-9.8;
เริ่มแรก set Time=0.0;

จากนั้นอยากใช้ Function SetTimer จับเวลาได้ทุกกี่วิก็ เพิ่มค่า Time ไป

และก็เขียนโค้ดหาระยาทางแนวแกน x
จากสมการ Sx=Ux * t;

Sx=Uprojectile * cos(Degree*3.14/180) * Time;

 
และก็เขียนโค้ดหาระยะทางแนวแกน y
จากสมการ Sy=Uy*t+0.5*g*t*t

Sy=Uprojectile * sin(Degree*3.14/180) *Time + 0.5*g*Time*Time;



และตอนนี้เราก็ได้ค่า Sx และ Sy เรียบร้อยแล้ว
เราก็เพียงวาดรูปวัตถุ ณ ตำแหน่งที่ (Sx,Sy) ในทุกๆครั้งที่ Time เพิ่ม เพราะค่า Time ใหม่ จะทำให้ได้ Sx และ Sy อันใหม
 
 
 

edit @ 5 May 2008 17:42:42 by LinGmnZ

พอดีไปดูหนังสือฟิสิกส์ ม4 มาอ่ะ เลยนึกได้ว่า ถ้าจะใส่ลงต้านไปในแนวแกน x
เราก็แค่เปลี่ยนจากสมการปกติ
Sx=Ux * t
เป็น Sx = Ux * t + 0.5 * a * t * t
เพราะแนวแกน x มันไม่คงที่แล้ว มันมีลมต้านด้วย เพราะฉะนั้นแกน x มีความหน่วง

ส่วนแกน y ก็ปกติของมันไป

เราจึงได้สมการแบบสมบูรณ์กว่าคือ
Sx = Ux*t + 0.5 *a*t *t
Sy = Uy*t + 0.5 *g*t *t

โดยอาจให้เราป้อน ค่าแรงลมเป็น Newton
และมวลของวัตถุ เป็น kg
เพื่อนำไปหาค่า a
จาก สมการ F=ma
ก็จะได้ a=-f/m จึงได้
Sx = Ux*t+0.5*(-f/m) *t*t

 

//Header ไฟล์

class PROJECTILE
{
//Constant value
double g; //in m/s^2

//Input
double Upro; //in m/s
double Degree; //in Degree
double friction_force; //in Newton
double mass; //in kg

//Output
double Sx;
double Sy;

//Time
double t;

public:
//Constructor
PROJECTILE(double Upro,double Degree,double friction_force,double mass)
{
Sx=0.0;
Sx=0.0;
g=-9.8;
t=0.0;
this->Upro=Upro;
this->Degree=Degree;
this->friction_force=friction_force;
this->mass=mass;

}

double GetSx();
double GetSy();

void SetUpro(double Upro);
void SetDegree(double Degree);
void Setfriction_froce(double friction_force);
void Setmass(double mass);
void SetTime(double t);

double GetUpro();
double GetDegree();
double Getfriction_force();
double Getmass();
double GetTime();


};

//Implementation ไฟล์

#include "CProjectile.h"
#include

//Get////////////////////////////////////////////////////////
double PROJECTILE::GetSx()
{
Sx=(Upro*cos(Degree*3.14/180))*t+0.5*(-friction_force/mass)*t*t;
return Sx;
}

double PROJECTILE::GetSy()
{
Sy=(Upro*sin(Degree*3.14/180))*t+0.5*g*t*t;
return Sy;
}

double PROJECTILE::GetUpro()
{
return Upro;
}

double PROJECTILE::GetDegree()
{
return Degree;
}

double PROJECTILE::Getfriction_force()
{
return friction_force;
}

double PROJECTILE::Getmass()
{
return mass;
}

double PROJECTILE::GetTime()
{
return t;
}

//Set////////////////////////////////////////////////////////
void PROJECTILE::SetTime(double t)
{
this->t=t;
}

void PROJECTILE::SetUpro(double Upro)
{
this->Upro=Upro;
}

void PROJECTILE::SetDegree(double Degree)
{
this->Degree=Degree;
}

void PROJECTILE::Setfriction_froce(double friction_force)
{
this->friction_force=friction_force;
}

void PROJECTILE::Setmass(double mass)
{
this->mass=mass;
}

ตัวแรก Upro หน่วยเป็น m/s
ตัวสอง Degree หน่วยเป็น องศา
ตัวสาม FractionForce หน่วยเป็น newton
ตัวสี่ mass หน่วยเป็น kg

ตัวอย่างการเรียกใช้
PROJECTILE obj1(100,60,10,5);
//กำหนด
Upro = 100 m/s
Degree =60
FrictionForce =10 N
mass = 5 kg

หลังจากนั้นต้อง set เวลาให้มันด้วย เพื่อให้มันมีการเคลื่อนที่ได้ โดยอาจใช้ฟังชั่น SetTimer(ทุกๆ 10 ms ลองดู)

ในฟังชั่นจับเวลาอาจประกาศตัวแปร static float i=0;
จากนั้นก็
obj1.SetTime(i+=0.1); //ใส่เวลาให้มันคำนวนตำแหน่ง

หลังจากนั้นส่วนแสดงผลก็
วาดรูป(ตำแหน่งเริ่มต้น+obj1.GetSx(),ตำแหน่งเริ่มต้น+obj1.GetSy());

มันจะแสดงรูปวาดออกมาโดยการเคลื่อนที่มันจะเบี้ยวๆ ในทางแกน x เนื่องจากมีลมมาประทะวัตถุ