Seite 1 von 1

Flächennormale

Verfasst: Mittwoch 23. Dezember 2009, 19:30
von kame
Hallo!

Ich versuche die Flächennormale zu berechnen. Aber irgendwie funktioniert das nicht. Ich denke, dass ich das Kreuzprodukt richtig berechnet habe. Die Normierung hab ich noch nicht durchgeführt. Erstmal suche ich einen Vektor der orthogonal zu Fläche steht. Wahrscheinlich hab ich einen Fehler in der Ableitungsberechnung. Kann mir jemand helfen? Gruß kame

Code: Alles auswählen

from visual import curve, scene, sphere, color
from math import *

xweite=9
zweite=9
ebene = []
for x in range(xweite):
    ebene.append([])
    for z in range(zweite):
        ebene[x].append(sin(x)+sin(z)) #FUNKTION

for x in range(xweite-1):
    for z in range(zweite-1):
        curve(pos=[(x,ebene[x][z],z),(x+1,ebene[x+1][z],z)],radius=.1,color=color.green)
        curve(pos=[(x,ebene[x][z],z),(x,ebene[x][z+1],z+1)],radius=.1,color=color.green)

stellex = 3
stellez = 2
stelley = sin(stellex)+sin(stellez)

#normalenvektor berechnen
#1. genauer Weg: durch Ableitung
#2. einfacher Weg: folgendes x und z-Glied betrachten
#Ich werde versuche Variante 1 zu programmieren

anfang = (stellex,stelley,stellez)

#Ableitung selbst berechnet
fu = [cos(stellex),0,0] #Funktion auch hier aendern
fw = [0,0,cos(stellez)] #Funktion auch hier aendern
fv = [0,0,0] #wird gleich veraendert
#Kreuzprodukt von fw und fu
fv[0] = fw[1]*fu[2]-fu[1]*fw[2]  
fv[1] = fw[2]*fu[0]-fu[2]*fw[0]
fv[2] = fw[0]*fu[1]-fu[0]*fw[1]
ende = (fu[0],fv[1],fw[2])
print(ende)

normale = curve(pos=[anfang, ende],radius=.05)

Verfasst: Mittwoch 23. Dezember 2009, 23:12
von kame
Zwei Fehler hab ich schon gefunden. Die Ableitung war falsch. Außerdem muss zum Pfeilende noch die Verschiebung vom Anfang aufaddiert werden.
EDIT: Es ist jetzt korrekt. Die Ableitung war total falsch.:/

Code: Alles auswählen

from visual import curve, scene, sphere, color, array
from math import *

scene.center=(10,0,5)

l = 2.5
#Koordinatensystem
curve(pos=[(-l/2,0,0),(2*l,0,0)],radius=0.05,color=color.green)
curve(pos=[(0,-l/2,0),(0,2*l,0)],radius=0.05,color=color.blue)
curve(pos=[(0,0,-l/2),(0,0,2*l)],radius=0.05,color=color.red)

xweite=22
zweite=11
ebene = []
for x in range(xweite):
    ebene.append([])
    for z in range(zweite):
        ebene[x].append(sin(x/4.0)+sin(z/4.0)) #FUNKTION

for x in range(xweite-1):
    for z in range(zweite-1):
        curve(pos=[(x,ebene[x][z],z),(x+1,ebene[x+1][z],z)],radius=.1,color=color.green)
        curve(pos=[(x,ebene[x][z],z),(x,ebene[x][z+1],z+1)],radius=.1,color=color.green)

for i in range(xweite):
    stellex = i
    for j in range(zweite):
        stellez = j
        stelley = sin(stellex/4.0)+sin(stellez/4.0) #Funktion auch hier aendern

        #normalenvektor berechnen
        #1. genauer Weg: durch Ableitung
        #2. einfacher Weg: folgendes x und z-Glied betrachten
        #Ich werde versuche Variante 1 zu programmieren

        anfang = (stellex,stelley,stellez)

        #Ableitung selbst berechnet

        fu = [1,0.25*cos(stellex/4.0),0] #Funktion auch hier aendern
        fw = [0,0.25*cos(stellez/4.0),1] #Funktion auch hier aendern
        fv = [0,0,0] #wird gleich veraendert
        #Kreuzprodukt von fw und fu
        fv[0] = fw[1]*fu[2]-fu[1]*fw[2]  
        fv[1] = fw[2]*fu[0]-fu[2]*fw[0]
        fv[2] = fw[0]*fu[1]-fu[0]*fw[1]
        ende = (fv[0]+stellex,fv[1]+stelley,fv[2]+stellez)

        normale = curve(pos=[anfang, ende])

Verfasst: Donnerstag 24. Dezember 2009, 00:24
von Sr4l
Du kannst z.B auf ein CAS wie http://code.google.com/p/sympy/
setzen das kann unter anderem das Kreuzprodukt ausrechnen wie schon deine andere Post fragt und vieles vieles mehr.

Hier wurde schon über ver. CAS diskutiert:
http://www.python-forum.de/topic-21148.html

Verfasst: Donnerstag 24. Dezember 2009, 00:33
von kame
Also dein sympy brauch ich nicht unbedingt. Trotzdem danke, den es hat mir gezeigt, dass ich falsch partiell abgeleitet habe. Gruß kame

Verfasst: Donnerstag 24. Dezember 2009, 07:47
von BlackJack
@kame: Falls das `visual`-Modul, VPython sein sollte, dann solltest Du da mal in der Dokumentation nachlesen, denn das bietet Vektorfunktionen an.