سؤال

بالاستناد الى هذه اللعبة البرمجة أنا حاليا بناء.

بفضل الإجابات من هذا المشنور, ، أنا الآن قادر الآن على العثور على إحداثيات XY لجميع نقاط المستطيلات (حتى عند الدوران)، والكشف عن الاصطدام مع الجدران تعمل تقريبا الآن الآن.

الآن أحتاج إلى تنفيذ اكتشاف الاصطدام مع روبوتات أنفسهم (يسبب واضحا، سيكون هناك أكثر من روبوت واحد في الساحة).

كشف الاصطدام المربعة المربعة (غير استدارة) غير صالح في هذه الحالة لأن الروبوت سيتم تشغيلها بزاوية (تماما كما وصفت هنا).

إذن ما هي أفضل طريقة لتنفيذ هذا النوع من الكشف عن تصادم المستطيلات المتناوب في WPF؟

أعتقد أنه يجب أن يكون هناك بعض الرياضيات المعنية، ولكن عادة ما تبين أن هناك وظائف في WPF التي "حساب" هذه الرياضيات لك (تماما هذه القضية)

هل كانت مفيدة؟

المحلول

المحلول

باستخدام الطريقة التي نشرتها كحل هذا السؤال السابق وطريقة WPF تسمى IntersectsWith (من Rect)، كنت قادرا على حل هذه المسألة من اكتشاف تصادم المستطيلات المتناوب مثل ذلك:

public Rect GetBounds(FrameworkElement of, FrameworkElement from)
{
        // Might throw an exception if of and from are not in the same visual tree
        GeneralTransform transform = of.TransformToVisual(from);

        return transform.TransformBounds(new Rect(0, 0, of.ActualWidth, of.ActualHeight));
}

Vehicle IsBotCollided(IEnumerable<Vehicle> blist)
{
    //currentBounds is of type Rect, which contains the 4 points of the rectangle (even when rotated)
    var currentBounds = GetBounds(BotBody, BattleArena);

    //Then I check if the current bounds intersect with each of the other Bots` bounds that are also in the Arena
    foreach (Vehicle vehicle in blist)
    {
        if(GetBounds(vehicle.BotBody, BattleArena).IntersectsWith(currentBounds))
        {
            return vehicle;
        }
    }
    return null;
}

نصائح أخرى

وأود أن تحقق من كل سطر للتصادم (لذلك سيكون لديك ماكس. 4 * 4 خط الاختبارات تصادم، إذا تصطدم سطرين، فإن الروبوتات تفعل، أيضا، يمكنك التوقف)، على الرغم من أنني متأكد من وجود طرق أفضل / أسرع لفعل هذا. إذا كانت المستطيلات يمكن أن يكون لها أحجام مختلفة، يجب عليك أيضا التحقق مما إذا كانت الأصغر داخل الآخر.

يمكن زيادة الأداء بشكل طفيف إذا قمت أولا بفحص قيمة X / Y-Min Min / Max ذات القيمة المطلوبة (أو يمكنك حجز دورتين حول الروبوتات وتحقق من ذلك، وهو أمر أسرع حتى الآن للتحقق من الخطوط إذا كانت بعيدة عن بعضها البعض.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top