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>