Die geringste Distanz ermitteln.

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hey liebe Brotfischer,
    Ich habe mal eine Frage.
    Ich möchte ein Navigationsystem machen und möchte z.B. die nächste Tankstelle ermitteln.
    Ich habe einen Command erstellt der einen List-Dialog aufruft und einem die auswahlmöglichkeit "Nächste Tankstelle" anbietet.
    Ich habe alle Tankstellen in einem Array gespeichert (Tankstellen[][tankvars] die tankvars bestehen aus tx, ty und tz für die Position) nun möchte ich, das wenn man den Menüpunkt wählt ein Checkpoint an der Tankstelle mit der geringsten Distanz erstellt wird,
    nur weis ich nicht wie und da hab ich mir gedacht frage ich euch mal :D


    Vielen Dank für eure Antworten schonmal im Vorraus.


    mfg. Chris

  • Du musst einfach nur in einer Schleife die Tankstellen durchgehen und mit folgender Formal kannste dann die Distanz von der aktuellen Position des Spielers und der Tankstelle errechnen. Am Ende eines Schleifendurchgangs vergleichste dann einfach ob die jetztige kleiner als die bisher kleinste ist und wenn ja ist die aktuelle die kleinste. Ansonsten gehts weiter.


    Distanz d := sqrt( (x2-x1)² + (y2-y1)² )

  • Danke für die schnelle Antwort aber ich kann damit leider nicht viel anfangen sry.
    Haste vllt nen Codeschnipsel als kleines beispiel? Das ich das in ner Schleife durchgehen muss ist klar aber mir ist noch nicht ganz klar wie die Abfrage in der Schleife auszusehen hat :/


    //EDIT: hab grade gesehen es gibt die Funktion GetPlayerDistanceFromPoint kann man mit der i-was anfangen in diesem Fall?

  • Ganz simple Distanzberechnung im dreidimensionalen Raum nach dem Satz des Phytagoras: http://www.ina-de-brabandt.de/…n/a/abstand-2p-in-r3.html


    Formel:


    Code
    sqrt((x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2)


    Funktion zur Berechnung einer Wurzel: floatsqroot()
    Funktion zur Handhabung von Exponenten: floatpower()


    Daher:



    Float:distanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
    return floatsqroot(floatpower(x1 - x2, 2) + floatpower(y1 - y2, 2) + floatpower(z1 - z2, 2));
    }


    P.S.: Du befindest dich im falschen Bereich!

  • Ich lasse alle Tankstellen per MapIcon anzeigen.
    Ich möchte das, das Navi an der Tankstelle die am nächsten ist einen Checkpoint setzt.

    Zitat

    Ich habe alle Tankstellen in einem Array gespeichert (Tankstellen[][tankvars] die tankvars bestehen aus tx, ty und tz für die Position)

  • New i, float:Nah, float:Distanz, Tanke;


    for (i; i <sizeof (Tankstellen); i++;)
    {
    Distanz = GetPlayerDistanceFromPoint (playerid, Tankstellen[i][tx] , Tankstellen[i][ty] , Tankstellen[i][tz]);


    if (floatcmp(Distanz, Nah) == 1)
    {
    Nah = Distanz;
    Tanke = i;
    }
    }
    SetPlayerCheckpoint (playerid,Tankstellen [Tanke][tx] ......);


    Dürfte klappen habe es nicht getestet und mit dem Handy geschrieben
    Bei Fragen Problemen einfach melden


    //Edit
    Ich habe irgendwo einen Fehler ich versuche diese grade zu finden es ist lediglich ein Denkfehler meiner seits bei der if abfrage
    Wir paar Minuten dauern

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Enum+Array:

    enum tankvars{Float:tx,Float:ty,Float:tz}
    new Tankstellen[][tankvars]={
    {1004.1935, -936.8912, 42.3281},
    {-90.7904, -1168.6073, 2.4223},
    {-1676.2301, 412.2717, 7.1797},
    {-2026.1958, 156.7181, 29.0391},
    {-1472.0350, 1863.9956, 32.6328},
    {618.7363, 1685.1774, 6.9922},
    {608.6305, 1700.1099, 6.9922},
    {2639.9553, 1106.1755, 10.8203},
    {2639.9553, 1106.1755, 10.8203},
    {2639.9553, 1106.1755, 10.8203},
    {2146.5283, 2747.9617, 10.8203},
    {1595.7328, 2199.1741, 10.8203},
    {2115.0908, 919.5133, 10.8203},
    {-1328.4840, 2677.3157, 50.0625},
    {-1605.9644, -2713.8699, 48.5335},
    {-2244.1770, -2561.3174, 31.9219},
    {1941.8331, -1772.9332, 13.3906}
    };

    • Offizieller Beitrag

    Ungetestet:


    stock getNearTankstelle(playerid) {
    new Float:distanz[2], tank;
    distanz[1] = 90000.0000;
    for(new i; i < sizeof (Tankstellen); i++) {
    distanz[0] = GetPlayerDistanceFromPoint (playerid, Tankstellen[i][tx] , Tankstellen[i][ty] , Tankstellen[i][tz]);
    if(distanz[0] < distanz[1]) {
    distanz[1] = distanz[0];
    tank = i;
    }
    }
    return tank;
    }

  • enum tankvars
    {
    Float:tx,Float:ty,Float:tz
    }
    new Tankstellen[][tankvars]=
    {
    {1004.1935, -936.8912, 42.3281},
    {-90.7904, -1168.6073, 2.4223},
    {-1676.2301, 412.2717, 7.1797},
    {-2026.1958, 156.7181, 29.0391},
    {-1472.0350, 1863.9956, 32.6328},
    {618.7363, 1685.1774, 6.9922},
    {608.6305, 1700.1099, 6.9922},
    {2639.9553, 1106.1755, 10.8203},
    {2639.9553, 1106.1755, 10.8203},
    {2639.9553, 1106.1755, 10.8203},
    {2146.5283, 2747.9617, 10.8203},
    {1595.7328, 2199.1741, 10.8203},
    {2115.0908, 919.5133, 10.8203},
    {-1328.4840, 2677.3157, 50.0625},
    {-1605.9644, -2713.8699, 48.5335},
    {-2244.1770, -2561.3174, 31.9219},
    {1941.8331, -1772.9332, 13.3906}
    };
    new Float:Nah = 100000.0, Float:Distanz, Tanke;
    for(new i;i<sizeof(Tankstellen);i++)
    {
    Distanz = GetPlayerDistanceFromPoint(playerid, Tankstellen[i][tx],Tankstellen[i][ty],Tankstellen[i][tz]);
    if(Distanz < Nah)
    {
    Nah = Distanz;
    Tanke = i;
    }
    }
    SetPlayerCheckpoint(playerid,Tankstellen [Tanke][tx],Tankstellen [Tanke][ty],Tankstellen [Tanke][tz],5.0);
    return 1;
    }


    Dies geht habe es getestet

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen