לא ידעתי איפה הכי כדאי לשאול את זה... אז אני אשאל פה - מדע וטכנולוגיה - HWzone פורומים
עבור לתוכן
  • צור חשבון

לא ידעתי איפה הכי כדאי לשאול את זה... אז אני אשאל פה


tdknight

Recommended Posts

טוב זה שאלה בהתנגשות בפיזיקה, רק שזה חלק מפרוייקט שלי בC++ ולכן לא הייתי בטוח איפה לשאול.

אני מדמה התנגשויות בין כדורים, ובעיקרון אני משתמש בקוד הבא:


CSBall eq=EquivalentBall(B);
CSCart p=TempBall->GetPos(),
v=TempBall->GetVel(),
a=TempBall->GetAcc(),
pt=eq.GetPos(),
vt=eq.GetVel(),
at=eq.GetAcc()+Container->GetTotalGravity();
double m=TempBall->GetMass(),
r=TempBall->GetRadius(),
mt=eq.GetMass(),
rt=eq.GetRadius();
double an=(p-pt)<CSCart(1,0);
v.VRotate(an);
vt.VRotate(an);
v.X=(-v.X*(m-mt)+2*mt*vt.X)/(m+mt);
v.VRotate(-an);
TempBall->SetVel(v);

בעיקרון הפונקציה EQUIVALENT BALL מקבלת מערך של כל הכדורים שמתנגשים בכדור הספציפי (TEMPBALL) ומחזירה את הכדור השקול, לפי האלגוריתם הבא:


CSBall CSBall::EquivalentBall(ABalls AB)
{
double m,r;
CSCart p,v,a;
m=r=0;
p=v=a=CSCart(0,0);
for (ABalls::iterator ball=AB.begin(); ball<AB.end(); ball++)
{
CSBall b=**ball;
m+=b.GetMass();
r+=b.GetRadius()*b.GetMass();
p+=b.GetPos()*b.GetMass();
v+=b.GetVel()*b.GetMass();
a+=b.GetAcc()*b.GetMass();
}
r/=m;
p/=m;
v/=m;
a/=m;
CSBall TB=CSBall();
TB.Init(m,r,p,v,a);
return TB;
}

(בעיקרון אני די בטוח שהבעיה לא פה, אבל אם יש לי פה שגיאה כלשהי מבחינה פיזיקאלית תיידעו אותי)

המחלקה CSCART זה פשוט קורדינטות קרטזיות עם פרמטרים X ו-Y.

מה שהאלגוריתם עושה זה "לחבר" את מרכזי הכדורים בקו ולחפש את הזווית שלו ביחס לציר הX, ואז לעשות טרנספורמציה של ווקטורי המהירות למערכת צירים שבה הקו המחבר הזה הוא ציר הX. אני מחשב את הזווית כך:


double CSCart::operator <(CSCart np)
{
double m_size=Size(),
n_size=np.Size(),
t_size=(*this)*np;
return acos(t_size/(m_size*n_size));
}

(המתודה SIZE מחזירה את גודל הווקטור, האופרטור * מציין מכפלה סקלרית)

את הטרנספורמציה למישור החדש אני כך:


void CSCart::VRotate(double a)
{
double tx=X, ty=Y;
X=tx*cos(a)+ty*sin(a);
Y=ty*cos(a)-tx*sin(a);
}

אחרי שאני את הטרנספורמציה אני מחשב מחדש את המהירות של הכדור הספציפי, לפי נוסחא שנובעת מחוק שימור תנע/חוק שימור אנרגיה (ההתנגשות אלסטית לחלוטין, ללא חיכוך), ואז עושה טרנספורמציה חזרה למערכת צירים רגילה ושומר.

בכל מקרה, אין לי מושג איפה הבעיה, אבל אני מניח שזה באלגוריתם הראשי שלמעלה. אני לא יודע אם זה בעיה טכנית בסינטקס או טעות מתמטית.

כשאני מריץ את זה ויזואליות ברוב המקרים הוא פשוט מתחיל להציג תוצאות לא הגיוניות.

מצטער על הפוסט הארוך,

תודה מראש לעוזרים.

קישור לתוכן
שתף באתרים אחרים

  • 2 שבועות מאוחר יותר...

איך אתה מצפה שהאפליקציה שלך תרוץ? איפה המנקטרוים? אתה צריך לבנות את התוכנית עצמה, מה שעשית פחות או יותר זה חישובים שבעצם לא עושים כלום.

תתקן את CSCart שמכיל שגיאה ותבנה תוכנית שהיא תיהיה הבסיס של האפלקציה.

איך ציפית שזה ירוץ? אתה לא רואה שחסר לך 50% מהפזל?

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...