![]() |
AW: Vektoriales Rechnen
oder ich zeichne mit canvas eine Linie von den beiden Punkten... nur wie frage ich ab ob die durch die Shapes geht?
|
AW: Vektoriales Rechnen
Hey :)
Ich glaube, es wäre auch noch ganz interessant, wie deine Datenstruktur intern aussieht: Also wie sind Objekte und Hindernisse repräsentiert? Beispiel: Man kann zum Beispiel intern ein zweidimensionales Array vorhalten, welche das Spielfeld repräsentieren. Kann man zum Beispiel in einem Schachspiel verwenden, weil da nur eine Figur pro "Zelle" erlaubt ist. Du merkst dir intern nur für die Figuren die Positionen? Auch die "Art wie Bewegung" implementiert ist, wäre vmtl. noch informativ: Wie findest du denn bisher heraus, ob deine Figur gegen eine Wand läuft. Im Prinzip ist das eventuell fast das selbe: Ob ein Projektil oder ein Männchen die Wand durchkreuzt, kann je nach Implementierung/Datenhaltung signifikante Unterschiede machen. Wenn ich jetzt raten müsste, dann könnte ich mir vorstellen, dass du die Hindernisse in einer Art "Liste" (oder listenähnlich) gespeichert hast. Die "naive" Vorgehensweise ist einfach alle durchzutesten. Bei kleinen Szenenaufbauten funktioniert das mit moderner Hardware im Allgemeinen ganz gut. Und 2D spielt auch noch in deine Karten ;) Brighty :D |
AW: Vektoriales Rechnen
Zitat:
|
AW: Vektoriales Rechnen
Zitat:
Es ist viel einfacher den Schnittpunkt zweier Linien zu ermitteln wenn die Koordinaten bekannt sind : ![]() Deswegen vermutlich auch die Frage des Vorposters nach der Datenstruktur. Wenn Du eine Liste, Array etc. der dargestellten Objekte hast, dann hast Du normalerweise auch die Koordinaten der Objekte und kannst eines nach dem anderen Testen. Wenn das Ganze dann komplexer wird, dann nennt man das eine Sprite-Engine. So was findest Du beispielsweise hier ![]() cu Ha-Jö |
AW: Vektoriales Rechnen
Zitat:
|
AW: Vektoriales Rechnen
Okay, also ich habe mir jetzt eine Funktion gebaut, die jede Millisekunde die Geradengleichung durch die Punkte Figur1 und Figur2 berechnet. Durch meine Hindernisse hab ich nun auch geraden gelegt. Jetzt muss ich nur noch die Schnittpunkte berechnen und dann überprüfen ob die Schnittpunkte innerhalb der Hindernisse liegen (weil diese ja eigentlich nur Strecken sind) und falls ja, siehen die Figuren sich nicht und falls nein sehen sie sich.
Ich habe mir den Link einmal angeschaut, nur verstehe ich die Funktion nicht ganz und verwende sehr ungern Code den ich nicht versthe... Könntest du mir erklären, was dort jeweils passiert? Hier nochmal die Funktion: Zitat:
Ich hoffe mir kann jemand helfen. LG |
AW: Vektoriales Rechnen
Zitat:
Man kann die Lösung in zwei Teile untergliedern (1) Tu so als wären die Strecken Geraden (also unendlich lang). Berechne die Schnittpunkte der Geraden. (2) Prüfe, ob der Schnittpunkt tatsächlich auf den Strecken liegt. (1) Zuerst betrachten wir mal nur die Schnittpunkte von Geraden (also unendlich langen Strecken), weil der Fall einfacher ist. Man kann eine Gerade durch zwei Punkte und einen Parameter darstellen: Gerade g: g(t) = g0*(1-t) + g1*t Gerade h: h(s) = h0*(1-s) + h1*s g0, g1: Stützpunkte von Gerade g (Vektoren) h0, h1: Stützpunkte von Gerade h (Vektoren) t, s: Parameter (Skalare) Du kannst dir vorstellen, dass man, wenn man für t und s beliebige Werte einsetzt, alle Punkte auf den jeweiligen Geraden bekommt. Den Schnittpunkt erhält man jetzt einfach, indem man g = h setzt. Da bekommt man ein Gleichungssystem heraus, das man dann auflösen muss. Wie man sich denken kann, gibt es einen Fall, in dem das Gleichungssystem nicht bzw. nicht eindeutig lösbar ist, nämlich wenn g und h parallel sind (führt in der Praxis zu einer Division durch 0). Diesen Fall muss man abfangen. Andernfalls erhält man die Lösung in Form einer Formel für t bzw. s. Wenn man den Wert in die oben gegebene Definition für g bzw. h einsetzt, erhält man den Schnittpunkt. (2) Wie prüfen wir jetzt, ob der Schnittpunkt tatsächlich auf den Strecken liegt? Nun, schauen wir uns mal an, was passiert, wenn wir für t den Wert 0 oder den Wert 1 einsetzen. g(0) = g0*(1-0) + g1*0 = g0 g(1) = g0*(1-1) + g1*1 = g1 Aha! Das heißt, 0 und 1 ergeben genau die Endpunkte der Strecke. Und nicht nur das, alle Werte zwischen 0 und 1 ergeben genau die Punkte zwischen den Endpunkten. D.h. man muss nur prüfen, ob t im Bereich [0,1] liegt, und ob s im Bereich [0,1] liegt. Wenn beides wahr ist, dann schneiden sich die Strecken im berechneten Punkt. Andernfalls schneiden sie sich nicht. --- Ich hoffe, der grobe Ansatz ist so verständlich. Ich hatte jetzt keine Lust, das hier alles im Detail aufzulösen. ;) Du kannst ja mal versuchen, das nachzurechnen. Wenn du dabei Fragen hast, kannst du sie hier stellen. Zitat:
|
AW: Vektoriales Rechnen
Zitat:
Genau das Beschriebene macht die Funktion. AX1,AY1 und AX2,AY2 sind die Koordinaten des Anfangs.- und Endpunktes einer Strecke, BX1,BY1 und BX2 und BY2 sind die Koordinaten des Anfangs.- und Endpunktes der zweiten Strecke. Die Funktion liefert wahr zurück wenn sich die beiden Strecken schneiden und false wenn nicht. X und Y sind die Koordinaten des Schnittpunktes falls sich die Strecken schneiden, ansonsten undefiniert. cu Ha-Jö |
AW: Vektoriales Rechnen
Okay, vielen Dank.
Was bringt das
Code:
in der ersten Zeile und könnte man statt dem
Result := false;
Code:
nicht auch
Exit
Code:
nehmen?
result := false;
|
AW: Vektoriales Rechnen
Hey :)
Das
Delphi-Quellcode:
"unterbricht" den Kontrollfluss in der Funktion und kehrt zum "Aufrufer" zurück.
Exit
Delphi-Quellcode:
ist der Rückgabewert und fasst erstmal den Kontrollfluss nicht an, sondern setzt nur den Rückgabewert.
Result
Der Gedanke ist der: Diese Funktion ist so aufgebaut, dass man viele Kriterien überprüfen muss, bevor ein positives Ergebnis herauskommt. Man kann in jedem Zwischenschritt abbrechen und verkürzt damit die Ausführungszeit. Warum kein if-else-Baum? Ja, man kann das auch mit verschachtelten if-else Statements ausdrücken. Aber optisch ist das eventuell nicht so schön, da man in jeder Verschachtelung optisch einmal mehr "einrückt". Klar, das ist Stil. Der Autor dieses Codes hat sich entschieden, dass das optisch für ihn schöner ist, wenn das alles optisch in einer Ebene liegt. Diese Entscheidung hat zum Beispiel zur Folge, dass die Symmetrie der Berechnung von S und T direkt allein schon durch den selben Zeilenbeginn und die interne Struktur der Zeile sichtbar ist. Brighty |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz