Schnittpunkt Geraden, Kurven, Gerade/Kurve

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Schnittpunkt Geraden, Kurven, Gerade/Kurve

Beitrag von PMV »

Ich bereue ständig, dass ich Mathematik hab schleifen lassen. :oops:
Und heute kommt es dann wohl richtig dick. Tausend Informationen, aber
auf die richtige Lösung komm ich nicht. Mir fehlt das mathematische
Verständnis und da ich mich auch nur jetzt damit beschäftige, wird es
mir auch bald wieder fehlen, sofern ich's überhaupt erlange. :|

So oder so steh ich vor folgendem Problem, dass ich irgend wie lösen
will. Ich werd mich noch weiter damit beschäftigen, aber ich hoffe
dass ihr mir letzten Endes eine Lösung präsentiert. Ich bin halt doch zu
doof und wo ich Tage brauch, da ist es für dein ein oder anderen hier
ne Sache von Minuten bis max. Stunde. :freak: *schäm*

Code: Alles auswählen

Structure VectorStraight
  X.d          ; Startpunkt der Geraden
  Z.d          ; Startpunkt der Geraden
  Angle.d      ; Richtungswinkel der Geraden (in Bogenmaß)
  Length.d     ; Länge der Geraden
EndStructure

Structure VectorCurve
  X.d            ; Startpunkt des Kreisbogens
  Z.d            ; Startpunkt des Kreisbogens
  Angle.d        ; Richtungswinkel der Kreisbogens (in Bogenmaß)
  Radius.d       ; Der Radius des Kreisbogens (bzw. des gesamten Kreises)
  CenterX.d      ; Mittelpunkt des Kreisbogens (bzw. des gesamten Kreises)
  CenterZ.d      ; Mittelpunkt des Kreisbogens (bzw. des gesamten Kreises)
  CenterAngle.d  ; Mittelpunktswinkel des Kreisbogens (in Bogenmaß)
  Length.d       ; Länge des Kreisbogens
EndStructure

; [in]  *Straight1.VectorStraight       erste Gerade
; [in]  *Straight2.VectorStraight       zweite Gerade
; [out] Array Distance.d(1)            die Entfernung zwischen Startpunkt und Schnittpunkt auf den beiden Geraden
; [out] return #True/#False            Rückgabe gibt es überhaupt einen Schnittpunkt
Procedure.i StraightHitStraight(*Straight1.VectorStraight, *Straight2.VectorStraight, Array Distance.d(1))
  
  ;Mathematik ^_^  
  
  
  Distance(0) =   ; Entfernung auf der ersten Geraden vom Startpunkt zum Schnittpunkt
  Distance(1) =   ; Entfernung auf der zweiten Geraden vom Startpunkt zum Schnittpunkt
  ProcedureReturn #True
EndProcedure


; [in]  *Straight.VectorStraight       Gerade
; [in]  *Curve.VectorCurve             Bogen
; [out] Array Distance.d(1)            die Entfernung zwischen Startpunkt und Schnittpunkt der Geraden & Bogen
; [out] return #True/#False            Rückgabe gibt es überhaupt einen Schnittpunkt
Procedure.i StraightHitCurve(*Straight.VectorStraight, *Curve.VectorCurve, Array Distance.d(1))
  
  ;Mathematik ^_^  
  
  
  Distance(0) =   ; Entfernung auf der Geraden vom Startpunkt zum (ersten) Schnittpunkt
  Distance(1) =   ; Entfernung auf dem Bogem vom Startpunkt zum (ersten) Schnittpunkt
  ProcedureReturn #True
EndProcedure


; [in]  *Curve1.VectorStraight         erster Bogen
; [in]  *Curve2.VectorCurve            zweiter Bogen
; [out] Array Distance.d(1)            die Entfernung zwischen Startpunkt und Schnittpunkt der beiden Bögen
; [out] return #True/#False            Rückgabe gibt es überhaupt einen Schnittpunkt
Procedure.i CurveHitCurve(*Curv1.VectorStraight, *Curve2.VectorCurve, Array Distance.d(1))
  
  ;Mathematik ^_^  
  
  
  Distance(0) =   ; Entfernung auf dem ersten Bogen vom Startpunkt zum (ersten) Schnittpunkt
  Distance(1) =   ; Entfernung auf dem zweiten Bogen vom Startpunkt zum (ersten) Schnittpunkt
  ProcedureReturn #True
EndProcedure

; [in]  *Straight.VectorStraight       Gerade
; [in]  *Curve.VectorCurve             Bogen
; [out] Array Distance.d(1)            die Entfernung zwischen Startpunkt und Schnittpunkt der Geraden & Bogen
; [out] return #True/#False            Rückgabe gibt es überhaupt einen Schnittpunkt
Procedure.i StraightLastHitCurve(*Straight.VectorStraight, *Curve.VectorCurve, Array Distance.d(1))
  
  ;Mathematik ^_^  
  
  
  Distance(0) =   ; Entfernung auf der Geraden vom Startpunkt zum letzten Schnittpunkt
  Distance(1) =   ; Entfernung auf dem Bogem vom Startpunkt zum letzten Schnittpunkt
  ProcedureReturn #True
EndProcedure


; [in]  *Curve1.VectorStraight         erster Bogen
; [in]  *Curve2.VectorCurve            zweiter Bogen
; [out] Array Distance.d(1)            die Entfernung zwischen Startpunkt und Schnittpunkt der beiden Bögen
; [out] return #True/#False            Rückgabe gibt es überhaupt einen Schnittpunkt
Procedure.i CurveLastHitCurve(*Curv1.VectorStraight, *Curve2.VectorCurve, Array Distance.d(1))
  
  ;Mathematik ^_^  
  
  
  Distance(0) =   ; Entfernung auf dem ersten Bogen vom Startpunkt zum letzten Schnittpunkt
  Distance(1) =   ; Entfernung auf dem zweiten Bogen vom Startpunkt zum letzten Schnittpunkt
  ProcedureReturn #True
EndProcedure
Der Code dürfte reichen um das Problem auf zu zeigen. Ich will es aber
dann doch noch mal in Sätze formulieren. Nicht dass es heißt, ich hätte
mir keine Mühe beim erstellen der Frage gegeben. :D
Gegeben sind Vektoren im 2D-Raum. X und Z deswegen, weil eigentlich
handelt es sich schon um 3D-Raum, doch brauch ich die 3. Dimension
hier nicht, da ich davon ausgehen kann, dass die zu testenden Vektoren
die selbe Höhe haben.
Es gibt zwei Typen von Vektoren: Geraden und Kreisbögen. Gegeben ist der
Startpunkt, die Länge und die Startrichtung als Winkel im Bogenmaß. Für
Kreisbögen ist natürlich auch der Radius definiert. Des weiteren sind zudem
bereits bestimmt die Koordinaten des Kreismittelpunktes und der
Mittelpunktswinkel des Kreisbogens. Das hab ich doch tatsächlich selber hin
bekommen ^_^

In der Tat interessieren mich nicht die genauen Koordinaten des Schnittpunktes,
sondern die Entfernung dieses Schnittpunktes vom jeweiligen Startpunkt aus.
Auch benötige ich eigentlich nur den ersten Schnittpunkt. Doch in Ausnahmefällen
ist der letzte Schnittpunkt ebenfalls nötig. Dafür bräuchte es dann auch noch mal
jeweils eine extra Prozedur.

Wer auch immer sich dem annimmt, schon mal tausend dank. :allright:

:coderselixir:
MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve

Beitrag von gnasen »

ich würde dir ja ganz gerne helfen, aber ich denke ich verstehe dein Problem nicht so wirklich. Könntest du vllt besser eine Skizze (mit Paint oder so) anfertigen? Sonst interpretiert man noch das Problem falsch und das kostet viel Zeit.
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve

Beitrag von STARGÅTE »

Zuerst einmal ist es für das rechnen schlecht das du eine Stecke durch Start + Winkel+Länge definierst.
Das macht nur unnötig viele nebenrechungen ...

Besser wäre es nur Vektoren zu nutzen ... X, Y und DirectionX, DirectionY oder so.

Als nächstes solltest du dir dann eine reihe von Vektor-Macros anlegen zum addieren, subtrahieren, normieren, usw. von Vektoren ..

danach gibt es ein paar einfache kompackte berechungen für Schnittpunkte ...

Bei Stecken: Erst Gerade-Gerade schnittpunkt bestimmen, und dnan prüfen ob er auf beidne Strecken liegt.
Bei Kurven: Erst Kreis-Kreis schnittpunkte bestimmen, und dann prüfen ob die Schnittpunkte auf den Segmenten liegen ..
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve

Beitrag von PMV »

@gnasen
Paint ist wohl nicht das beste Programm für so was, aber vielleicht reicht das ja schon:
Bild
Skizziert hab ich hier nur den 1. Fall: Gerade <-> Gerade
Gegeben für jede Gerade:
Startpunkt der Geraden (X, Z)
Richtungswinkel im Bogenmaß (Angle)
Länge der Geraden (Length)

Gesucht:
Länge (Entfernung) des Startpunktes zum Schnittpunkt


Analog dazu dann das ganze mit Kreisbögen.
Fals bewünscht, nein ich werd mich gleich drann setzten und ne Skizze
für Kreisbögen machen, denke da ist das größere Verständnisproblem.
Dafür reicht Paint aber nicht mehr aus. Mal schauen ob ich's mit Gimp
hin bekomme. :lol:


@Stargate
Die Theorie ist mir bekannt, die gib's ja wie schon geschrieben zu hauf im Netz,
und hier im Forum gibt es auch genug Kollisionsroutinen, die Praxis krieg ich
aber nicht hin :cry: Es mag für diesen Fall schlecht sein, dass
die Vektoren so definiert sind, wie sie definiert sind, doch ist nur bei dieser
Rechnung der Schnittpunkte das ein zusätzliches Problem. Später brauch ich
nur diese Werte. Ich hab gehofft, dass man ohne Nebenrechnungen die Schnittpunkte
raus bekommt, aber Hauptsache es geht überhaupt :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve

Beitrag von STARGÅTE »

Gut habe mich mal deinem Problem angenommen und dir zumindest mal Line-Line geschrieben:

Code: Alles auswählen

Structure VectorStraight
  X.d          ; Startpunkt der Geraden
  Z.d          ; Startpunkt der Geraden
  Angle.d      ; Richtungswinkel der Geraden (in Bogenmaß)
  Length.d     ; Länge der Geraden
EndStructure

Structure VectorCurve
  X.d            ; Startpunkt des Kreisbogens
  Z.d            ; Startpunkt des Kreisbogens
  Angle.d        ; Richtungswinkel der Kreisbogens (in Bogenmaß)
  Radius.d       ; Der Radius des Kreisbogens (bzw. des gesamten Kreises)
  CenterX.d      ; Mittelpunkt des Kreisbogens (bzw. des gesamten Kreises)
  CenterZ.d      ; Mittelpunkt des Kreisbogens (bzw. des gesamten Kreises)
  CenterAngle.d  ; Mittelpunktswinkel des Kreisbogens (in Bogenmaß)
  Length.d       ; Länge des Kreisbogens
EndStructure

; [in]  *Straight1.VectorStraight       erste Gerade
; [in]  *Straight2.VectorStraight       zweite Gerade
; [out] Array Distance.d(1)            die Entfernung zwischen Startpunkt und Schnittpunkt auf den beiden Geraden
; [out] return #True/#False            Rückgabe gibt es überhaupt einen Schnittpunkt
Procedure.i StraightHitStraight(*Straight1.VectorStraight, *Straight2.VectorStraight, Array Distance.d(1))
	Protected U.d, V.d, X.d, Z.d
	U = *Straight1\Length*Cos(*Straight1\Angle) * *Straight2\Length*Sin(*Straight2\Angle) - *Straight1\Length*Sin(*Straight1\Angle) * *Straight2\Length*Cos(*Straight2\Angle)
	If U ; Nicht Parallel
		X = *Straight2\X - *Straight1\X
		Z = *Straight2\Z - *Straight1\Z
		V = X * *Straight2\Length*Sin(*Straight2\Angle) - Z * *Straight2\Length*Cos(*Straight2\Angle)
		Distance(0) = V/U * *Straight1\Length
		If Distance(0) >= 0 And Distance(0) <= *Straight1\Length ; Kollision auf *Straight1
			V = X * *Straight1\Length*Sin(*Straight1\Angle) - Z * *Straight1\Length*Cos(*Straight1\Angle)
			Distance(1) = V/U * *Straight2\Length
			If Distance(1) >= 0 And Distance(1) <= *Straight2\Length ; Kollision auf *Straight2
				ProcedureReturn #True  
			Else ; keine Kollision auf *Straight2
				ProcedureReturn #False 
			EndIf
		Else ; keine Kollision auf *Straight1
			ProcedureReturn #False
		EndIf
	Else
		ProcedureReturn #PB_Default; Probleme ^^
	EndIf
EndProcedure


Straight1.VectorStraight ; -->
Straight1\X = 100
Straight1\Z = 100
Straight1\Angle = 0
Straight1\Length = 300   ; ^
Straight2.VectorStraight ; |
Straight2\X = 200
Straight2\Z = 200
Straight2\Angle = Radian(270)
Straight2\Length = 200

Dim Distance.d(1)
Debug StraightHitStraight(Straight1, Straight2, Distance())
Debug Distance(0)
Debug Distance(1)
Dort ist jedoch keine Sondebehandlung für Parallere Strecken drin:
- kein Schnittpunkt, einer, unendliche viele ...

EDIT: habe vergessen die Wahre länge zurückzugeben ... hatte es mit relativen ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve

Beitrag von PMV »

:shock:
Jaja ... Mathematik ist schon was feines. Wenn man's kann. Cool, danke!
Parallel kommt in meinem Fall nicht vor. Und wenn durch irgend einen dummen
zufall doch, dann liegen die nicht übereinander -> return #False.
Sollte sich in der Zukunft rausstellen, das es doch Fälle gibt, bei deinen
sich die beiden Vektoren parallel überlagern, werd ich das schon irgend
wie selber hin bekommen. :)


Ich hab inzwischen die Grafik für die Bögen fertig:
Bild
1. Fall
Beide Bögen haben eine ähnliche Richtung, somit ist für beide Bögen
der 1. Schnittpunkt auch der 1. Schnittpunkt und der 2. der 2. ... hier
brauch ich wieder die Länge vom Startpunkt zum Schnittpunkt auf diesem
Bogen (Kreisbahn).

2. Fall
Der untere Bogen (*Curve1) verläuft von unten links nach rechts. Der
obere Bogen (*Curve2) verläuft von oben rechts nach links. Der erste
Schnittpunkt ist der, welcher der zuerst übergebene Bogen (*Curve1)
erreicht. Der 2. bzw. letzte Schnittpunkt ist der, welcher der erste
übergebene Kreis als zweites erreicht. Ich hoffe das war nicht zu kompliziert
ausgedrückt. Die Skizze sollte das Problem eigentlich auch ohne Worte
beschreiben können. :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve

Beitrag von STARGÅTE »

muss noch n Frage stellen:

Code: Alles auswählen

Structure VectorCurve
  X.d            ; Startpunkt des Kreisbogens
  Z.d            ; Startpunkt des Kreisbogens
  Angle.d        ; Richtungswinkel der Kreisbogens (in Bogenmaß)
  Radius.d       ; Der Radius des Kreisbogens (bzw. des gesamten Kreises)
  CenterX.d      ; Mittelpunkt des Kreisbogens (bzw. des gesamten Kreises)
  CenterZ.d      ; Mittelpunkt des Kreisbogens (bzw. des gesamten Kreises)
  CenterAngle.d  ; Mittelpunktswinkel des Kreisbogens (in Bogenmaß)
  Length.d       ; Länge des Kreisbogens
EndStructure
X, Y, Angle, Length sind gleich wie bei Strecke oder ?
Und wenn du nun ein CenterX, CenterY angibst, wozu dann noch Radius und CenterAngle ?
Schließlich ist der der abstand zwischen Start und Center = Radius, und der CenterWinkel ist unbedeutend ...

EDIT: Wäre es nicht einfacher n Art Krümmung anzugeben statt CenetrX,Y wenn du schon viel mit Winkeln arbeitest ?
EDIT2: klar für den rechung brauch ich eh wieder den Kreis mit Mittelpunkt...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve

Beitrag von PMV »

CenterX, CenterZ, CenterAngle sind Nebenprodukte. Sie erschließen sich
aus den übrigen Werten. Da ich diese aber öfters brauch, sind diese
aus Optimierungsgründen in der Struktur gespeichert. Mit ihnen lässt
sich die resultierende Position auf der Kreisbahn bestimmen, wenn
neben der definition des Bogens nur die Entfernung bekannt ist, die
darauf zurück gelegt wurde. Und das hab ich selbst hin bekommen :D
Ich mach aber keine Angaben über die Dauer, bis ich's raus hatte. /:->

Was in wie weit sinnvoller ist, da mag ich mich nicht aus dem Fenster
lehnen. Mathematik ist nicht so mein Gebiet. :coderselixir: So weit
ich aber mein Programm bisher überblicken kann, ist dass die optimalste
Lösung bisher. :)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten