GLBasic forum

Other languages => GLBasic - de => Topic started by: Worebu on 2021-Feb-13

Title: Entfernungtabelle erstellen
Post by: Worebu on 2021-Feb-13
Moin,
ich möchte mal eine fiktive Entfernungstabelle erstellen und die Tabelle mit Random zahlen füllen.
Was eigentlich kein Problem ist, aber wie bekommt man das hin das die Entfernungen stimmen?

Also von A nach A oder B nach B usw. ist logischerweise immer null, aber wenn ich die Tabelle komplett fülle
habe ich Werte die nicht stimmen. A nach Z  hat einen anderen Wert wie Z nach A.

Jemand eine Idee?

Schönes WE.


So ungefähr.

    A B C

A  0 5 9
B  5 0 7
C  9 7 0



Title: Re: Entfernungtabelle erstellen
Post by: Schranz0r on 2021-Feb-14
Moin,

was hast du damit vor?
Willst du ein Pathfinding schreiben?

Komm komm nicht ganz hinterher, was es machen soll, dein Aufbau...
Title: Re: Entfernungtabelle erstellen
Post by: Worebu on 2021-Feb-14
Hi,
das ist erstmal nur ein Test. Das soll eine Entfernungstabelle von fiktiven Orten sein,
nur das die Entfernungen  Random sein sollen. Ich  bekomme das mit dem füllen nur nicht hin.


Ein Feld das so gefüllt ist:


http://www.auslandversicherungen.de/entfernungstabelle.html
 (http://www.auslandversicherungen.de/entfernungstabelle.html)


Hast Du eine Idee?

Worebu
Title: Re: Entfernungtabelle erstellen
Post by: S. P. Gardebiter on 2021-Feb-14
Ich würde dir zu einer geometrischen Lösung raten, da sie einfach nachvollziehbar ist.
Zunächst solltest du zufällige x und y Koordinaten zu deinen Punkten generieren.

Dann kannst du die Distanz zwischen zwei Punkten wie folgt ausrechnen:

d = √((x1 - x2)² + (y1 - y2)²)

Es handelt sich hierbei um die Pythogoras Formel (a² + b² = c²):
Die Länge der Seite a ist hierbei die Differenz zwischen den beiden x-Werten deiner Punkte und die Länge der Seite b ist die Differenz zwischen den y-Werten.
Kurz gesagt, bei dir ist a = x1 - x2 und b = y1 - y2.
Zum Schluss kannst du die Punkte quadrieren, addieren und danach die Wurzel ziehen, dann hast du deinen Wert für c, was bei dir die Distanz zwischen den beiden Punkten ist.

Die Logik dahinter: Du konstruierst ein Dreieck anhand deiner beiden Punkte und kannst so die Distanz über die Ermittlung der dritten, längsten Seite deines Dreiecks ausrechnen.

Wenn du jetzt deine Schleife programmierst, kannst du noch folgende Optimierungen vornehmen:

Ich hoffe ich konnte dir helfen.

Liebe Grüße.
Title: Re: Entfernungtabelle erstellen
Post by: Worebu on 2021-Feb-14
Hmm,
da ich kein abgeschlossenes Mathe Studium habe und nur so ein Hobbyprogrammierer bin hast Du mir leider nicht helfen können.
Aber ich danke Dir dafür das Du dir Gedanken über mein Problem gemacht hast.

Worebu
Title: Re: Entfernungtabelle erstellen
Post by: S. P. Gardebiter on 2021-Feb-14
Nichts für Ungut aber das ist Stoff den man in der Mittelstufe (8. bis 10. Schulklassen) lernt.
Gerade für 2D Sachen ist es empfehlenswert da fit zu sein. In vielen Fällen kommt man nicht drum herum oder nur mit sehr komplizierten Algorithmen.
Falls du Schwierigkeiten beim Verständnis hast, kannst du ggf. hier nachlesen:
https://www.gut-erklaert.de/mathematik/x-y-koordinatensystem-mit-punkte.html
https://www.gut-erklaert.de/mathematik/satz-des-pythagoras.html

Es gibt mit Sicherheit auch mathematisch elegantere Wege das Ganze zu lösen. Wenn es sich dabei jedoch um eine Tabelle mit Entfernungen soll die in sich logisch ist, würde ich ad-hoc stark vermuten, dass es zumindest keinen simpleren Weg gibt.

Vielleicht hilft dir ja etwas Code. Da ich in GLB etwas eingerostet bin, hier Pseudocode:
Code: (glbasic) [Select]
size = 10

FOR n = 0 TO size - 1
     px[n] = RND(10)
     py[n] = RND(10)
NEXT

FOR n1 = 0 TO size - 1
     FOR n2 = 0 TO size - 1
          IF n1 <> n2 THEN
               IF d[n2, n1] > 0 THEN
                    d[n1, n2] = d[n2, n1]
               ELSE
                    d[n1, n2] = SQR(POW(px[n1] - px[n2], 2) + POW(py[n1] - py[n2], 2))
               ENDIF
          ENDIF
     NEXT
NEXT

Liebe Grüße.
Title: Re: Entfernungtabelle erstellen
Post by: Worebu on 2021-Feb-14
Meine Schulzeit ist aber 40 Jahre her.