התנגשות עם קו משופע.

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

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

נסתכל על הדוגמא הבאה:

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

כלומר אנו צריכים לסובב את מערכת הצירים שלנו לפי זווית השיפוע של הקו חזרה למצב ישר.

אני מציג פה קוד מתועד למשעי . שימו לב שהקוד בעצם חלק מהמחלקה הבונה את הכדור.

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

public function CheckCollision(iLine:DisplayObject):Boolean
{          
    // נבדוק אם בכלל יש טעם לחשב פגיעה
    if(!iLine.hitTestObject(this)) 
        return false;                      
    // נחשב את אורך הוקטור בין הכדור לראשית הקו               
    var aLength:Point = new Point(x - iLine.x, y - iLine.y);
    // נחשב את זווית הקו ברדינים              
    var aRadSlope:Number = iLine.rotation * Math.PI / 180; 
    //  נחשב את הסינוס והקוסינוס של זווית הקו               
    var aCos:Number = Math.cos(aRadSlope);             
    var aSin:Number = Math.sin(aRadSlope);             
    // נסובב את הוקטור כך שנקבל את הגובה אם המערכת היתה מיושרת
    var aTurnY:Number = aCos * aLength.y - aSin * aLength.x;
    // נסובב את וקטור המהירות כך שנקבל את הערך האנכי שלו במצב של מערכת מיושרת     
    var aTempVy:Number = -(aCos * mVelocity.y - aSin * mVelocity.x);
    // בדיקה האם יש פגיעה בין הקו לכדור              
    if((aTurnY > -mRadius)&&(aTurnY > aTempVy))                        
    {                  
        // נסובב את כוון וקטור המהירות של הכדור בשביל לקבל החזרה נכונה
        // יחסית למצב המיושר                
        var aTempVx:Number = aCos * mVelocity.x + aSin * mVelocity.y;  
        // נסובב חזרה את וקטור המהירות למצב הנכון                  
        mVelocity.x = aCos * aTempVx - aSin * aTempVy;         
        mVelocity.y = aCos * aTempVy + aSin * aTempVx;         
        return true;               
    }          
       
}

שימו לב כי הפונקציה כתובה כחלק מהמחלקה שמנהלת את הכדור כך שהערכים X , Y ו mVelocity שיכים לכדור.

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

כתיבת תגובה

האימייל לא יוצג באתר.

תגי HTML מותרים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>