26. Februar 2012

Prüfen ob in einer C# Forms Anwendung zwei Panele kollidieren

26. Februar 2012 - Geschrieben von Martin - 4 Kommentare

Um zu prüfen ob zwei Panele in einer C# Windows Forms Anwendung miteinander kollidieren, habe ich mir eben eine kleine Panel Collider Klasse geschrieben, die anhand der Position sowie Höhe und Breite prüft ob sich zwei Panele berühren.

class panelCollider
{
    public static bool check(Panel one, Panel two)
    {
        if (one.Left == two.Left)
        {
            if (one.Top == two.Top)
            {
                return true;
            }
            else if (one.Top < two.Top)
            {
                if (one.Top + one.Height >= two.Top)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                if (two.Top + two.Height >= one.Top)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
        else if (one.Left > two.Left)
        {
            if (two.Left + two.Width >= one.Left)
            {
                if (one.Top == two.Top)
                {
                    return true;
                }
                else if (one.Top < two.Top)
                {
                    if (one.Top + one.Height >= two.Top)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    if (two.Top + two.Height >= one.Top)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            else
            {
                return false;
            }
        }
        else if (one.Left < two.Left)
        {
            if (one.Left + one.Width >= two.Left)
            {
                if (one.Top == two.Top)
                {
                    return true;
                }
                else if (one.Top < two.Top)
                {
                    if (one.Top + one.Height >= two.Top)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    if (two.Top + two.Height >= one.Top)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
}

Soweit ich es in meiner Anwendung testen konnte, funktioniert sie. Sollte doch noch jemandem ein Fehler auffallen, würde ich mich über einen Kommentar freuen.

4 Antworten zu “Prüfen ob in einer C# Forms Anwendung zwei Panele kollidieren”

  1. SiSoSnooP sagt:

    Ist es nicht besser der Klasse gleich die Rectangle Positionen zu übergeben ?
    Dann könnte man diese Klasse auch für andere Objekte verwenden.

  2. Martin sagt:

    Stimmt eigentlich, die Eigenschaft .Bounds wäre auch kompatibel zum bisherigen Code, da die Eigenschaften genau so heißen.

    Werde ich nacher mal umstellen, Danke! :)

  3. Mario Edel sagt:

    Ab Microsoft Visual Studio 2012 wird noch ein „using System.Windows.Forms;“ in der Klasse benötigt, da sonst die Import-Panel nicht als Control erkannt werden

    Grüße Mario

  4. _MBB_ sagt:

    Hallo Martin,

    war gerade auf der Suche nach ein paar C#-Beispielen und bin durch zufall wieder auf diesen Eintrag gestoßen.

    Hätte noch einen kleinen (realtiv subjektiven) Änderungsvorschlag:

    pack doch in dein return einfach die jeweilige Bedingung, dann sparst dir die ganzen return true bzw. false ;)

Schreibe einen Kommentar