Entfernungtabelle erstellen

Previous topic - Next topic

Worebu

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



Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

Schranz0r

Moin,

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

Komm komm nicht ganz hinterher, was es machen soll, dein Aufbau...
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Worebu

#2
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



Hast Du eine Idee?

Worebu
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

S. P. Gardebiter

#3
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:

  • Wenn deine beiden Punkte gleich sind (beide Schleifenvariablen haben den selben Wert), dann ist die Distanz immer 0, das ist die Diagonale in deiner Tabelle.
  • Du kannst die beiden Schleifenvariablen als Indizes vertauschen und schauen ob in deiner Tabelle bereits ein Wert vorhanden ist, wenn ja, dann brauchst du die Distanz nicht neu ausrechnen, sondern nur innerhalb der Tabelle kopieren (von A nach B ist die selbe Distanz wie von B nach A).

Ich hoffe ich konnte dir helfen.

Liebe Grüße.
~ Cave Story rules! ~

Worebu

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
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

S. P. Gardebiter

#5
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.
~ Cave Story rules! ~

Worebu

Meine Schulzeit ist aber 40 Jahre her.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD