Abstand zweier 3D-Geraden

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Abstand zweier 3D-Geraden

Beitrag von Zudomon »

Hallo!
Hat jemand eine Funktion, die den Abstand zweier 3D-Geraden zurückgibt? :)

Gruß
Zudo
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: Abstand zweier 3D-Geraden

Beitrag von klickverbot »

Hallo,

in welcher Form hast du denn die Geraden gegeben?

Spontan würde ich einfach das Kreuzprodukt der beiden Richtungsvektoren nehmen, normalisieren, und dann den Vektor zwischen den beiden gegebenen Punkten darauf projizieren (Skalarprodukt). Wenn ich mich nicht irre, solltest du dann die Länge des Lots zwischen den beiden Geraden erhalten. Getestet habe ich das allerdings nicht...
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Abstand zweier 3D-Geraden

Beitrag von Zudomon »

Die Geraden werden durch Punkt und Richtungsvektor beschrieben.

Habe gehofft, dass jemand so eine Funktion zufällig in seiner Matheunit oder so hat und die posten würde. Es wird ja immer gesagt, man soll das Rad nicht neu erfinden.
Psycho
Establishment
Beiträge: 156
Registriert: 16.09.2002, 14:23

Re: Abstand zweier 3D-Geraden

Beitrag von Psycho »

Googol
Nr. 7

Code: Alles auswählen

<script language="JavaScript">
   function berechne_abstand(f) {
     f.ergebnis.value=""
     kollinear = false
     loesbar = true
     // Koordinaten der Einstiegspunkte einlesen
     gx = f.gx.value
     gy = f.gy.value
     gz = f.gz.value
     hx = f.hx.value
     hy = f.hy.value
     hz = f.hz.value
     // Koordinaten der Richtungsvektoren einlesen
     rx = f.rx.value
     ry = f.ry.value
     rz = f.rz.value
     if (rx == 0 && ry == 0 && rz == 0) { 
       alert("Fehler - erster Richtungsvektor = Nullvektor !")
       loesbar = false 
     }
     sx = f.sx.value
     sy = f.sy.value
     sz = f.sz.value
     if (sx == 0 && sy == 0 && sz == 0) { 
       alert("Fehler - zweiter Richtungsvektor = Nullvektor !")
       loesbar = false 
     }
     if (loesbar == true) {
       // prüfen, ob die Richtungsvektoren kollinear sind
       if (sx != 0) { 
         faktor = rx/sx }
       else {
         if (sy != 0) {faktor = ry/sy }
         else { faktor = rz/sz }
       }
       if (sx*faktor == rx && sy*faktor == ry && sz*faktor == rz) {
         kollinear = true
       }
       if (kollinear == false) {
         // Kreuzprodukt k der Richtungsvektoren berechnen
         kx = ry*sz-rz*sy
         ky = rz*sx-rx*sz
         kz = rx*sy-ry*sx
         // Norm des Kreuzprodukts n_k berechnen
         n_k = Math.sqrt(kx*kx+ky*ky+kz*kz) 
         // Differenzvektor d der Einstiegspunkte berechnen
         dx = gx-hx
         dy = gy-hy
         dz = gz-hz
         // Abstand der Geraden = Differenzvektor auf Kreuzprodukt projizieren
         abstand = Math.abs(dx*kx+dy*ky+dz*kz)/n_k
         if (abstand != 0) {
           // Geraden windschief
           abstand = "Abstand der windschiefen Geraden: "+abstand
         }
         else {
           // Schnittpunkt vorhanden
           m = (gx*ry-gy*rx+rx*hy-hx*ry)/(sx*ry-sy*rx)
           spx = hx*1+m*sx
           spy = hy*1+m*sy
           spz = hz*1+m*sz
           abstand = "Die Geraden schneiden sich im Punkt S("+spx+"/"+spy+"/"+spz+") (Abstand daher Null) !"
         }
       }
       else {
         // parallele Geraden, Abstand eines Einstiegspunkts von der
         // anderen Gerade berechnen
         dx = gx - hx
         dy = gy - hy
         dz = gz - hz
         // Kreuzprodukt aus Differenzvektor d und Richtungsvektor s bilden
         kx = dy*sz-dz*sy
         ky = dz*sx-dx*sz
         kz = dx*sy-dy*sx
         // Norm des Kreuzprodukts und des Richtungsvektors
         n_k = Math.sqrt(kx*kx+ky*ky+kz*kz)
         n_s = Math.sqrt(sx*sx+sy*sy+sz*sz)
         // Quotient ergibt Abstand
         abstand = n_k / n_s
         if (abstand != 0) {
           abstand = "Abstand der parallelen Geraden: "+abstand
         }
         else {
           abstand = "Die beiden Geraden sind identisch !" 
         }
       } 
       f.ergebnis.value = abstand
     }
   }
</script>
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Abstand zweier 3D-Geraden

Beitrag von Matthias Gubisch »

Naja ich zwar nicht aber andere schlaue Leute :)

http://www.geometrictools.com/LibFounda ... tance.html
musst ziemlich weit runterscrollen

übrigens ein sehr guter anlaufpunkt für solche sachen falls dir noch nicht bekannt :)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: Abstand zweier 3D-Geraden

Beitrag von klickverbot »

Inzwischen wurden ohnehin schon fertige Lösungen gepostet, aber ein kleiner Nachtrag: Mein Vorschlag funktioniert natürlich nur, wenn die Geraden nicht (anti-/)parallel sind. In diesem Fall würde für das Kreuzprodukt der Richtungsvektoren der Nullvektor hinauskommen, dann kannst du das Problem aber auf Punkt-Gerade reduzieren.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Abstand zweier 3D-Geraden

Beitrag von Zudomon »

Dank euch allen!! :D
Antworten