Crash auf Kreuzung verhindern

  • C#
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Annoxoli.

    Crash auf Kreuzung verhindern

    Hallo,

    folgende Situation:
    Die Anwendung, welche ich Umsetze funktioniert soweit, wenn ich die Ampel Position sowie die Autoposition berechne,
    wennn eine Straße vorhanden ist.

    Nun habe ich jedoch eine Kreuzung, und muss die entsprechenden anderen Fahrzeuge mit einberechnen.
    Das "Feld" sieht wie folgt aus (siehe Anhang)

    zu sehen sind die entsprechenden Ampeln, Fußgängerüberweg, und die Straße.

    Fahrzeuge, die von Westen kommen, können den Fahrzeug (aktuell) welcher von Osten kommt ignorieren.
    Das gleiche bei Fahrzeugen die von Norden <-> Süden kommen.

    Wenn sich der Weg von den Fahrzeugen aus dem Westen kommend, mit denen aus dem Süden kommend kreuzen,
    muss ich die Range entsprechend berechnen.

    Mein Gedankenansatz, sieht wie folgt aus:
    (this. -> gegnerische Fahrzeug, welches zb. vom Süden kommt ; Fahrzeug. -> mein eigenes Fahrzeug, welches zb. vom Westen kommt)

    C#-Quellcode

    1. switch (Fahrzeug.Seite)
    2. {
    3. case Speicherverwaltung.Seite.WEST:
    4. if (Seite == Speicherverwaltung.Seite.EAST)
    5. return true;
    6. if (Seite == Speicherverwaltung.Seite.NORD || Seite == Speicherverwaltung.Seite.SOUTH)
    7. {
    8. if ((Fahrzeug.FahrzeugY + Fahrzeug.FahrzeugHeight + 5) >= (FahrzeugY - FahrzeugHeight + 5) && (Fahrzeug.FahrzeugY + Fahrzeug.FahrzeugHeight - 5) <= (FahrzeugY - FahrzeugHeight + 5) && (Fahrzeug.FahrzeugX + 5) >= (FahrzeugY + 5) && (Fahrzeug.FahrzeugX - 5) <= (FahrzeugY - 5))
    9. return false;
    10. else
    11. return true;
    12. }
    13. if ((FahrzeugX + FahrzeugWidth) <= (Fahrzeug.FahrzeugX + Fahrzeug.FahrzeugWidth + FahrzeugWidth + 5) && (FahrzeugX + FahrzeugWidth) >= (Fahrzeug.FahrzeugX + Fahrzeug.FahrzeugWidth - 10))
    14. return false;
    15. else
    16. return true;
    17. case Speicherverwaltung.Seite.EAST:
    18. if (Seite == Speicherverwaltung.Seite.WEST)
    19. return true;
    20. if ((FahrzeugX - FahrzeugWidth) >= (Fahrzeug.FahrzeugX - Fahrzeug.FahrzeugWidth - FahrzeugWidth - 5) && (FahrzeugX - FahrzeugWidth) <= (Fahrzeug.FahrzeugX - Fahrzeug.FahrzeugWidth + 10))
    21. return false;
    22. else
    23. return true;
    24. case Speicherverwaltung.Seite.NORD:
    25. if (Seite == Speicherverwaltung.Seite.SOUTH)
    26. return true;
    27. if ((FahrzeugY + FahrzeugWidth) <= (Fahrzeug.FahrzeugY + Fahrzeug.FahrzeugWidth + FahrzeugHeight + 1) && (FahrzeugY + FahrzeugWidth) >= (Fahrzeug.FahrzeugY + Fahrzeug.FahrzeugWidth - 10))
    28. return false;
    29. else
    30. return true;
    31. case Speicherverwaltung.Seite.SOUTH:
    32. if (Seite == Speicherverwaltung.Seite.NORD)
    33. return true;
    34. if ((FahrzeugY - FahrzeugWidth) >= (Fahrzeug.FahrzeugY - Fahrzeug.FahrzeugWidth - FahrzeugHeight - 5) && (FahrzeugY - FahrzeugWidth) <= (Fahrzeug.FahrzeugY - Fahrzeug.FahrzeugWidth + 10))
    35. return false;
    36. else
    37. return true;
    38. default:
    39. return false;
    40. }


    Allerdings klappt dies nicht wie gewünscht.
    Hat jemand einen Ansatz/Tipp, wie ich das Problem lösen könnte ?

    Gruß und danke!
    Bilder
    • Scr_Street.PNG

      9,72 kB, 782×537, 133 mal angesehen
    @Annoxoli Du solltest Dein Design vollständig überarbeiten.
    Mach Dir eine Klasse Fahrzeug und eine Klasse Ampel und eine Klasse Kreuzung oder so, dann gib diesen Klassen die entsprechenden Methoden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Es ist alles in Klassen programmiert worden...
    nur werde ich jetzt nicht den ellen langen SC posten.
    Die entsprechende Methode befindet sich in der Klasse "Fahrzeug".

    Der Methode wird das Objekt "Fahrzeug" übergeben, welches sich bewegen möchte
    und überprüft dann für jedes Fahrzeug, welches die Bedingung erfüllt, ob es Fahren darf oder nicht.
    Das ist im Aktuellen fall der eigene Verkehr, sowie der von Norden und Südlicher kommende verkehr.

    De Frage bezieht sich auch lediglich auf die Berechnung des Abstands, weil mir vermutlich ein Fehler unterlaufen ist,
    welchen ich jedoch aktuell (noch) nicht einsehen kann.

    Annoxoli schrieb:

    Es ist alles in Klassen programmiert worden...
    OK.
    Dann räume bitte mal auf, so dass das ganze If-Zeugs lesbar wird.
    Mach aus allen solchen Ausdrücken Properties mit klingenden Namen:

    Annoxoli schrieb:

    VB.NET-Quellcode

    1. (Fahrzeug.FahrzeugX + Fahrzeug.FahrzeugWidth + FahrzeugWidth + 5)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So einfach umzusetzen ist das ATM nicht, da viele viele Faktoren eine Rolle Spielen, demzufolge
    muss es aktuell so sein. Denn unter bestimmten bedingungen die ich dabei nicht wissen kann,
    werden diese Werte anders berechnet.

    //Edit:
    Für die Funktion habe ich eben Lokale Variablen erstellt, zwecks der Übersicht:

    C#-Quellcode

    1. private voide bla(){
    2. Int32 RangeA = Fahrzeug.FahrzeugX + Fahrzeug.FahrzeugWidth + 5;
    3. Int32 RangeB = Fahrzeug.FahrzeugY + Fahrzeug.FahrzeugHeight + 5;
    4. Int32 UnknownRangeA = FahrzeugY - FahrzeugWidth + 5;
    5. Int32 UnknownRangeB = FahrzeugY - FahrzeugWidth + 5;
    6. if ((RangeA) >= (UnknownRangeA) && (RangeA - 10) <= (UnknownRangeA) && (RangeB) >= (UnknownRangeA) && (RangeB - 10) <= (UnknownRangeA))
    7. return false;
    8. else
    9. return true;
    10. }

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Annoxoli“ ()

    Annoxoli schrieb:

    UnknownRangeA
    und UnknownRangeB sind identisch.
    Was sind das für Maße / Positionen?
    Male die mal in ein Bildchen. Vielleicht hilft das schon, ein Problem zu lösen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Es hat schon viel gebracht es in lokale Variablen zu schreiben.
    Das Auto fährt zwar noch nicht weiter, aber es entsteht immerhin schonmal kein Crash mehr.

    C#-Quellcode

    1. Int32 RangeA = Fahrzeug.FahrzeugX + Fahrzeug.FahrzeugWidth + FahrzeugWidth + 10;
    2. Int32 RangeB = Fahrzeug.FahrzeugX - FahrzeugWidth - 10;
    3. Int32 RangeC = Fahrzeug.FahrzeugY + Fahrzeug.FahrzeugHeight + FahrzeugWidth + 10;
    4. Int32 RangeD = Fahrzeug.FahrzeugY - FahrzeugWidth - 10;
    5. Int32 UKRangeA = FahrzeugX + FahrzeugWidth + 5;
    6. Int32 UKRangeB = FahrzeugX - 5;
    7. Int32 UKRangeD = FahrzeugY + FahrzeugHeight + 5;
    8. Int32 UKRangeC = FahrzeugY - 5;
    9. if ((RangeA >= UKRangeA && RangeB <= UKRangeB) && (RangeC >= UKRangeC && RangeD <= UKRangeD))
    10. return false;
    11. else
    12. return true;

    Annoxoli schrieb:

    kein Crash
    Vielleicht kannst Du das einfacher lösen, indem Du geeignete Rectangle-Objekte anlegst, die kannst Du dann mit den Rectangle-Methoden abchecken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Annoxoli schrieb:

    Verbotszone
    Jou. Da kannst Du eigentlich alles mit machen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Rechteck beim initialisieren erzeugen sollte nicht das Problem sein, mit den entsprechenden Werten,
    aber wie soll die Berechnung/Überprüfung ablaufen ?

    Zumal die Range auch noch durch/mit dem anderen Fahrzeug berechnet wird, ob diese so zutreffen ist

    Annoxoli schrieb:

    Überprüfung
    Sieh Dir mal die Rectangle-Methode IntersectsWith() an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!