Flächennormale

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

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)
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

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])
Zuletzt geändert von kame am Donnerstag 24. Dezember 2009, 00:34, insgesamt 1-mal geändert.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

Also dein sympy brauch ich nicht unbedingt. Trotzdem danke, den es hat mir gezeigt, dass ich falsch partiell abgeleitet habe. Gruß kame
BlackJack

@kame: Falls das `visual`-Modul, VPython sein sollte, dann solltest Du da mal in der Dokumentation nachlesen, denn das bietet Vektorfunktionen an.
Antworten