Abstand zweier 3D-Geraden
Verfasst: 13.07.2009, 11:54
				
				Hallo!
Hat jemand eine Funktion, die den Abstand zweier 3D-Geraden zurückgibt? :)
Gruß
Zudo
			Hat jemand eine Funktion, die den Abstand zweier 3D-Geraden zurückgibt? :)
Gruß
Zudo
Die deutsche Spieleentwickler-Community (seit 1999).
https://www.zfx.info/
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>