Laden...

C# Werte innerhalb einer zweidimensionalen Liste in einem bestimmten "Umkreis" vergleichen

Erstellt von blue_86 vor 12 Jahren Letzter Beitrag vor 12 Jahren 11.144 Views
Thema geschlossen
B
blue_86 Themenstarter:in
22 Beiträge seit 2010
vor 12 Jahren
C# Werte innerhalb einer zweidimensionalen Liste in einem bestimmten "Umkreis" vergleichen

Hey Jungs,

ich mache gerade ein kleines Flugeugspiel. Habe aber ein Problem bekommen.
Ich habe eine 2 Dimensionale List und ich möchte Werte innerhalb der List vergleichen jedoch mit +-15 Punkte von den eigentlichen x bzw. y. Es soll festgestellt werden ob die Flugzeuge mit einander Kollidieren.

Kann mir jemand helfen? Dachte sowas geht mit Linq aber ich weiss es einfach nicht mehr 😉 Danke schon mal fuer eure Hilfe

Die Klasse fuer meine List mit x,-y Koordinaten


public class Flugzeug_Linie
    {
        public int x;
        public int y;
    }

Declaration der List


List<List<Flugzeug_Linie>> flugzeug_linie = new List<List<Flugzeug_Linie>>();

endliche Flugzeug hinufügen


flugzeug_linie.Add(new List<Flugzeug_Linie>());

endliche Koordinaten hinzufügen für das jeweilige Flugzeug


flugzeug_linie.Last().Add(new Flugzeug_Linie { x = e.X, y = e.Y });

B
48 Beiträge seit 2010
vor 12 Jahren

Hallo.

So auf die schnelle für eine 2D-List von ints. Das kannst Du aber einfach ändern zu Flugzeug_Linie.


            int CollisionDistance = 1;

            List<List<int>> list = new List<List<int>>();
            list.Add(new List<int>());
            list.Add(new List<int>());

            list[0].Add(3);
            list[0].Add(7);
            list[0].Add(8);

            list[1].Add(9);
            list[1].Add(14);
            list[1].Add(15);

            var many = list.SelectMany(item => item);
            var result = from x in many
                         let collision = many.Where(y => x != y && Math.Abs(y - x) <= CollisionDistance)
                         where collision.Any()
                         select new { item = x, collisionset = collision };

            foreach (var r in result)
            {
                Console.Write("Item: " + r.item + " , Kollisionsmenge: ");
                foreach (var collisionCandidate in r.collisionset)
                    Console.Write(" " + collisionCandidate);
                Console.WriteLine();
            }

Zu jedem Item der Liste wird also die Menge der Kollisionskandidaten gefunden. Im Beispiel alle, die eine Entfernung von 1 haben (CollisionDistance = 1)

Ausgabe:

Item: 7 , Kollisionsmenge: 8
Item: 8 , Kollisionsmenge: 7 9
Item: 9 , Kollisionsmenge: 8
Item: 14 , Kollisionsmenge: 15
Item: 15 , Kollisionsmenge: 14

MfG

B
blue_86 Themenstarter:in
22 Beiträge seit 2010
vor 12 Jahren

Das sieht auf jeden Fall schon mal sehr gut aus

Danke dir

B
blue_86 Themenstarter:in
22 Beiträge seit 2010
vor 12 Jahren

Habe es gleich reingebaut er zickt aber bei


Math.Abs(y - x)

er mag das "-" nicht

Hinweis von herbivore vor 12 Jahren

Bitte beachte bei Fragen und Nachfragen [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Den Umgang mit Collections setzen wir als bekannt voraus, genauso wie die Fähigkeit, einfache Fehler, erst recht Syntaxfehler zu lösen. Zu letzterem siehe [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

Thema geschlossen