Aktuelle Zeit: 01.10.2020 09:59

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Schnittpunkt Geraden, Kurven, Gerade/Kurve
BeitragVerfasst: 08.03.2011 13:58 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg
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:
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. -.-


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve
BeitragVerfasst: 08.03.2011 14:08 
Offline
Benutzeravatar

Registriert: 01.08.2007 14:28
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve
BeitragVerfasst: 08.03.2011 14:31 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
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 ..

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve
BeitragVerfasst: 08.03.2011 14:39 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg
@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. -.-


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve
BeitragVerfasst: 08.03.2011 14:54 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Gut habe mich mal deinem Problem angenommen und dir zumindest mal Line-Line geschrieben:
Code:
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 ...

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve
BeitragVerfasst: 08.03.2011 15:51 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg
: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. -.-


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve
BeitragVerfasst: 08.03.2011 16:02 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
muss noch n Frage stellen:
Code:
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...

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkt Geraden, Kurven, Gerade/Kurve
BeitragVerfasst: 08.03.2011 16:16 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg
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. -.-


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

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


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye