Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 23:13

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 41 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 10, 2009 20:12 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
dj3hut1 hat geschrieben:
Man muß nur die Bounding-Boxes um den Radius des Objektes vergrössern, so wie auf dem Bild unten...

Bild


Ok... ich denke der Ansatz ist vielversprechend. Wobei in deinem Bild viele ausreichend große Durchgänge als Blockiert gekennzeichnet werden. Aber das wird dann nur noch ein Detail sein.

Habs mir komplizierter Vorgestellt und bin deshalb wohl damals auch nicht auf die simple Idee gekommen... ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 10:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Ok das Bild war nicht so optimal, man muß die Trennlinien zwischen den Bounding-Boxes besser hervorheben.

Auf denen darf man sich noch bewegen, da das Objekt durch die Vergrösserung der Bounding-Boxes auf einen Punkt zusammenschrumpft.

Ich hoffe es wird in der unteren Grafik etwas besser deutlich :

Bild


Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 12:08 
Offline
DGL Member

Registriert: Di Sep 08, 2009 18:10
Beiträge: 16
ok so weit schonmal ganz gut.
ich hab jz noch die idee, dass man die waypoints nicht an der kompletten gerade verstreut sondern nur 4 stück um den start und zielpunkt.
dadurch würde er um das hindernis drumrumkommen.
jetzt könnte man noch auf nummer sicher gehn, und bei einer geradenlänge von >=1.5Y die gerade in stücken mit ner maximallänge von 1,5Y unterteilen und dort jeweils "links" und "rechts" je einen wegpunkt setzen.

was noch unklar ist
1: "links" und "rechts" würde ich mit dem normaleneinheitsvektor der geraden machen. den dann schon auf meinen abstand (z.b. 10px) skalieren und fertig
2: dann würde ich den normalenvektor der geraden verwenden, um die punkte neben der gerade zu verteilen. brauche ich auch die länge der geraden
3: ich muss von jeder linie im umkreis den abstand zu dem punkt, den ich setzen will berechnen.
ich brauch also eine formel, die mir den abstand punkt->strecke berechnet.
das könnte etwas rechenintensiv werden. meine einzige idee dazu ist:
a)normalenvektor der geraden bestimmen. schnittpunkt der 2 geraden (strecke und punkt mit normalenvektor) bestimmen.
prüfen, ob der auf der strecke liegt.
abstand schnittpunkt<>punkt berechnen
bei keinem schnittpunkt (punkt wäre also auf der verlängerten strecke) nehme ich den minimalabstand des punktes zu den beiden endpunkten der strecke

geth das schneller?
oder gibt es bessere ansätze?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 12:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
ich brauch also eine formel, die mir den abstand punkt->strecke berechnet.

A und B ist deine Strecke, P der Punkt. Die Funktion stammt aus meinen DirectX-Zeiten, aber was z.B. die Funktion D3DXVec3Subtract macht sollte ja relativ klar sein, ansonsten einfach fragen. Das ganze ist 3D, aber auf den ersten Blick würde ich sagen man kann einfach eine Dimension weglassen um es 2D zu machen. Z-Koordinate auf Null setzen geht auf jeden Fall.
(Quelle: functions_coolcat.pas)

Code:
  1. // =============================================================================
  2. // ClosestPointOnLine
  3. // =============================================================================
  4. // Findet den nächsten Punkt auf einer Geraden.
  5. function ClosestPointOnLine( const A, B, P: TD3DXVector3 ): TD3DXVector3;
  6. var C, V: TD3DXVector3;
  7.     d, t: Single;
  8. begin
  9.   D3DXVec3Subtract( C, P, A );
  10.   D3DXVec3Subtract( V, B, A );
  11.   d := D3DXVec3Length( V );
  12.   D3DXVec3Scale( V, V, (1 / d) );
  13.   t := D3DXVec3Dot( V, C );
  14.  
  15.   if (t < 0) then begin
  16.     result := A;
  17.   end
  18.   else if (t > d) then begin
  19.     result := B;
  20.   end
  21.   else begin
  22.     D3DXVec3Scale( V, V, t );
  23.     D3DXVec3Add( result, A, V );
  24.   end;
  25. end;


Du musst die Funktion nur noch so umbauen das sie dir nicht den nächsten Punkt auf der Gerade ausgibt sondern eben den Abstand zu diesem Punkt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 13:48 
Offline
DGL Member

Registriert: Di Sep 08, 2009 18:10
Beiträge: 16
mal ne Frage zum mathematischen Teil
was dort gemacht wird sollte folgendes sein:

C=vektor AP
V=vektor AB
d=|V|
V=v0 (einheitsvektor)
t=V*C

danach ist A+V*t der Punkt auf der Geraden, der dem Punkt P am nächsten ist
warum? was macht das skalarprodukt dort genau?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Ich versuche es mal kurz zu erklären:

Seien A und B Punkte auf der Gerade, P ein Punkt und X der Punkt mit dem kürzesten Abstand. Das bedeutet das Dreieck AXP hat einen rechten Winkel bei X (denn der kürzeste Abstand zwischen Punkt und Gerade ist immer eine Gerade, die orthogonal zur Anfangsgerade steht).
Alpha sei der Winkel zwischen AP und AB.

Dann gilt, da AB ja nur eine Verlängerung der Strecke AX ist:
AP * AB = |AP|*|AB|*cos(alpha)
Gleichzeitig gilt:
cos(alpha) = AK/HYP = |AX| / |AP|

AP * AB = |AP|*|AB|*|AX|/|AP| = |AB|*|AX|

Also gilt: |AX| = AP * AB / |AB|
für die Länge des Vektors AX.

In Vielfachen des Vektors AB:
t = |AX| / |AB|
Und das ganze in die Geradengleichung eingesetzt:
X = A + t * AB

Alles klar? ;)

PS: Danke Coolcat, auf die Idee bin ich bis eben auch noch nicht gekommen. Und das obwohl ich das im Matheunterricht bis zum Erbrechen mit Hilfsebenen etc. machen durfte.

MfG


Zuletzt geändert von WhiteHunter am Sa Sep 12, 2009 18:02, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 17:55 
Offline
DGL Member

Registriert: Di Sep 08, 2009 18:10
Beiträge: 16
verdammt...
und das nach mathe-LK und wdhl des stoffes im 1.semester...
ok danke so weit

noch ne Frage zu dem Baum...
wie baue ich den (in Delphi) auf?

prinzip ist klar: jeder knoten hat 4 unterknoten
jedes blatt hat bis zu 5 linien/punkte
wäre soweit:
Code:
  1.  
  2. PBaum=^TBaum;
  3. TBaum=record
  4. child1,child2,child3,child4:PBaum;
  5. end;
  6.  
  7. TBlatt=record
  8. Points:Array of TPoint;
  9. end;


tja...wie füge ich die zusammen?
und wie baue ich den baum? z.b. wenn ich nen leeren baum habe. in den füge ich nach und nach punkte ein (ebn sobald die feststehen), dann muss ich ja gelegendlich mal ein blatt umsortieren und nen baum drüberhängen...

kann mir das grad nicht vorstellen, wie das gehn soll :-(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 19:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
jedes blatt hat bis zu 5 linien/punkte

Jedes Blatt kann beliebig viele Linien/Punkte aufnehmen.

Du beginnst damit, dass du dem Wurzelknoten einfach mal alle Linien/Punkte zuweist. Dann geht es einfach weiter mit der folgenden Regel:
Enthält ein Knoten mehr als, sagen wir 8 Linien/Punkte, wird dieser Knoten rekursiv unterteilt. D.h. du testet einfach für jeden der vier Kinder ob die jeweilige Linie mit der BoundingBox kollidiert. Wenn das der Fall ist wird die Linie dem Kindknoten zugeordnet. Eine Linie kann so auch mehreren Knoten zugeordnet werden. Das machst du einfach rekursiv solange bis entweder aller Blätter weniger als 8 Linien haben oder du eine maximale Tiefe (zur Sicherheit, falls sich z.B. mehrere Linien in einem Punkt schneiden) erreicht wurde.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 19:27 
Offline
DGL Member

Registriert: Di Sep 08, 2009 18:10
Beiträge: 16
ja das prinzip habe ich verstanden. aber soll das ganze dann so aussehen:
Code:
  1. #
  2. PBaum=^TBaum;
  3. TBaum=record
  4. child1,child2,child3,child4:PBaum;
  5. Points:Array of TPoint;
  6. end;
  7.  


dann hätte ich ja in jedem ast nochmal die ganzen linien/punkte


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 19:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
dann hätte ich ja in jedem ast nochmal die ganzen linien/punkte

Das Array kann doch leer sein?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 19:58 
Offline
DGL Member

Registriert: Di Sep 08, 2009 18:10
Beiträge: 16
ja stimmt...aber ein dynamisches array hat ja doch overhead...
weiß ne genau wo die daten gespeichert sind, aber min 4 Byte von dem Pointer auf die structur
aber gut. die sind dann auch egal ;-)
werds erstmal soweit probieren


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 20:18 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Flamefire hat geschrieben:
jetzt könnte man noch auf nummer sicher gehn, und bei einer geradenlänge von >=1.5Y die gerade in stücken mit ner maximallänge von 1,5Y unterteilen und dort jeweils "links" und "rechts" je einen wegpunkt setzen.


Wenn ich dich recht verstehe, dann willst du deine Objekte "feiner" unterteilen, um auf nummer sicher zu gehen, dass ein möglichst direkter Weg gefunden wird.
Das ist aber weder nötig, noch werden die Wege dadurch besser.

Der Algorithmus mit den "BB-Eckpunkte" basiert auf der Überlegung, wie man sich in unbekanntem Gelände auch als Mensch fortbewegt.
Dort sind die Eckpunkte die Grenzen von Hindernissen bzw. "Sichtkanten" wie z.B. Hausecken. Wenn du möglichst effizient um eine Hausecke rumlaufen willst, dann läufst du auf sie zu um dann, sobald du hinter die Hausecke gucken kannst, zum nächsten derartigen Punkt zu laufen (oder zum Ziel).
Falls die ein Fall bekannt ist, wo mehr Eckpunkte bei gerade Objekten bessere Navigation zur Folge hat dann würde ich den gern wissen. Runde Formen muss man anders unterteilen, da sonst die Eckpunkte der Boundingbox zu weit vom eigentlichen Objekt entfernt liegen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 13, 2009 09:17 
Offline
DGL Member

Registriert: Di Sep 08, 2009 18:10
Beiträge: 16
ich hatte vor, die idee von coolcat zu nehmen, aber die anzahl der wegpunkte zu reduzieren.
weil die idee den vorteil hat, dass ich auch teleporter benutzen kann durch (mehr oder weniger) manuelles einfügen zusätzlicher verbindungen.

bei den BB versteh ich noch nicht ganz, wie das ganze am ende funktionieren soll.
wenn du den algo (also vorbereitung und wegsuche) mal als pseudocode formulieren kannst, kann ich das vl ebsser einschätzen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 13, 2009 09:27 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
"Mein Algorithmus" ist der aus dem Tutorial, halt nur mit einem Vorberechnungsschritt.
Entweder die Bounding Boxen sind bereits im Datenmodell der "Hindernisse" enthalten, oder aber du musst die erst erstellen.
Wenn dein "Level" aus linien besteht, dann ist dies recht leicht. Du musst einfach nur jeweils 2 Punkte links und recht vom Ende einer Linie postieren. Fertig. Optimieren kannst du das ganze noch, wenn du Linien die aneinanderstoßen am Schnittpunkt nur 2 Navigationspunkte spendierst anstatt 4 (da jeweils 2 aufeinander liegen).

Start und ziel sind dann ebenfalls noch Navigationspunkte. Allerdings welche, die dynamisch ins Netz eingefügt werden.

Und wenn dir das Raster aus dem Tutorial zu grob ist, kannst du auch einfach das "OpenGL Gitter" nehmen. Also quasi eine beliebig hohe Auflösung.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 13, 2009 22:15 
Offline
DGL Member

Registriert: Di Sep 08, 2009 18:10
Beiträge: 16
also praktisch: an jedem ende einer linie 2 punkte erstellen (sofern diese nicht zu nah an einer anderen linie sind)

also so(s. Anhang)

dann soweit wie möglich verbinden (immer wenn kein SP mit einer linie vorhanden ist)

bei der wegsuche dann
start/ziel je als wegpunkt mit einbinden und so weit möglich verbinden

die boundingboxen sind nur dafür da, unnötige linienschnittpunkt-prüfungen zu vermeiden (da wenn linie nicht in BB-->linie schneidet nicht linie in BB)


so weit richtig verstanden?


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 41 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]