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

Aktuelle Zeit: Do Mär 28, 2024 11:13

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Ray-Ray Closest Point
BeitragVerfasst: Sa Jul 14, 2012 13:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

gibt es eine Möglichkeit zwischen zwei (un)endlich langen Linien im 3D Raum den punkt zu errechnen an dem sie sich am nächsten sind?
Ich habe zwei Linien (jeweils Anfangspunkt und Richtungsvektor) A und B. Ich möchte jetzt gern den punkt auf Linie B haben, an den Linie A am nächsten heran kommt.

Geht das? Und wenn ja, wie?


Danke,
Aya


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ray-Ray Closest Point
BeitragVerfasst: Sa Jul 14, 2012 13:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Gibts da was von Ratiopharm?

Aber klar:
Code:
  1. /** finds an least squares solution for ao + s*ar = bo + t*br.
  2.  * @return Vector2(s,t) */
  3. template<class T> inline Vector2<T> rayIntersect3D(const Vector3<T>& ao, const Vector3<T>& ar,
  4.                                                    const Vector3<T>& bo, const Vector3<T>& br)
  5. {
  6.     //        ao + s*ar = bo + t*br
  7.     //    <=> s*ar - t*br = bo - ao
  8.     //    <=> A*X = B
  9.     // solve: A^T * A * X = A^T*B
  10.     //    <=>    AN * X   = BN
  11.     //    <=>         X   = AN^-1 * BN
  12.  
  13.     Vector3<T> A0 = ar;
  14.     Vector3<T> A1 = -br;
  15.     Vector3<T> B = bo - ao;
  16.     // normal equations
  17.     Vector2<T> AN0(A0*A0, A1*A0);
  18.     Vector2<T> AN1(A0*A1, A1*A1);
  19.     Vector2<T> BN(A0*B, A1*B);
  20.  
  21.     // check determinant of AN
  22.     T det = AN0.x*AN1.y - AN1.x*AN0.y;
  23.     if (-EPSILON < det && det < EPSILON) {
  24.         // both rays are nearly parallel
  25.         return Vector2<T>(B*ar / ar.lengthSq(), 0);
  26.     }
  27.     else {
  28.         // compute inverse(AN)^T
  29.         // used peusdocode from http://www.dr-lex.be/random/matrix_inv.html
  30.         det = 1.0f/det;
  31.         Vector2<T> iAN0T( AN1.y*det, -AN1.x*det);
  32.         Vector2<T> iAN1T(-AN0.y*det,  AN0.x*det);
  33.         return Vector2<T>(iAN0T*BN, iAN1T*BN);
  34.     }
  35. }


Du musst dann s und t jeweils wieder in die Geradengleichung einsetzen um den gewünschten Punkt zu berechnen.

Nachtrag: Das basiert auf dem alten Coolmath, also Vektor*Vektor ist das dot-Produkt.

_________________
Yeah! :mrgreen:


Zuletzt geändert von Coolcat am Sa Jul 14, 2012 14:02, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ray-Ray Closest Point
BeitragVerfasst: Sa Jul 14, 2012 14:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn die Funktion auch nur den nächsten Punkt zurückgibt (wie der docstring vermuten ließe), ist sie ganz schön irreführend benannt ;).

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ray-Ray Closest Point
BeitragVerfasst: Sa Jul 14, 2012 14:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Find ich nicht, sie gibt doch die Schnittstelle zurück? (...und zwar in der Form die die flexibelste Nutzung erlaubt) Eine ja/nein Entscheidung wäre in diesem Fall wenig hilfreich, da sich Linien in 3D so gut wie nie exakt schneiden. Aber ja...man hätte sie sicher sinnvoller benennen können...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ray-Ray Closest Point
BeitragVerfasst: Sa Jul 14, 2012 14:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, aber wenn ich zwei strahlen habe, die sich nirgendwo schneiden und nicht parallel sind, dann gibt es mir doch den nächsten Punkt zurück? Das ist nicht der Schnittpunkt (wenn der abstand größer ε ist meinetwegen), und von einer Funktion mit Intersect in Namen würde ich dann einen Rückgabewert erwarten, der das nicht-vorhandensein eines Schnittpunktes anzeigt.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ray-Ray Closest Point
BeitragVerfasst: Sa Jul 14, 2012 15:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Coolcat hat geschrieben:
Zitat:
Gibts da was von Ratiopharm?

Aber klar:


Vielen dank! <3


Coolcat hat geschrieben:
Du musst dann s und t jeweils wieder in die Geradengleichung einsetzen um den gewünschten Punkt zu berechnen.


Du überschätzt meine Mathematischen Kenntnisse... Geradengleichung hab ich schonmal in der Schule gehört, aber so spontan steh ich sehr auf dem schlauch - die lustigen Symbole bei Wikipedia dazu machen das nicht viel besser :mrgreen:

Ein kleinen tipp noch? :oops:

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Ray-Ray Closest Point
BeitragVerfasst: Sa Jul 14, 2012 17:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ein kleinen tipp noch? :oops:

Die Geradengleichung ist das was du in die Funktion stopfst. In der Schule wird das meist Stützpunkt S und Richtungsvektor R genannt. Also die Gerade sind alle Punkte die sich durch S + t*R beschreiben lassen, wobei t beliebige Werte annehmen darf.
Dem Kommentar der Funktion kannst du entnehmen:
Code:
  1. ao + s*ar
  2. bo + t*br

Also du musst nur die Werte für s und t die dir die Funktion ausgibt wieder in die Geradengleichungen einsetzen und du bekommst die beiden am nächsten zueinander gelegenen Punkte.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.675s | 17 Queries | GZIP : On ]