DMUG-Archiv 2001

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Normalenvektor berechnen und auf Fläche zeichnen.

Hallo Matthias,

so schlimm ist es nicht. An der angegebenen Stelle findet man eine Tabelle in
(4.3.3.2), wo auch für die Angabe der Fläche als z = f(x, y)  die
Parametergleichung
für die Flächennormale steht, da braucht's man's nicht selber rechnen.
Da es gerade regnet let's.do.it.com:

bodeN[fn_, {v1_, v10_, v11_}, {v2_, v20_, v21_}, l0_] :=
  Module[{dv1, dv2, o, dfn1, dfn2, x, y, p, pnorm, pp, pic, pf},
      (* Check fn *)
      If[FreeQ[fn[v1, v2], v1] || FreeQ[fn[v1, v2], v2],
        Print["Function ", fn, " unabhaengig von ", v1, " und/oder ",
          v2 "! Bye."];
        Return[]
        ];
       o = Options[Plot3D, PlotPoints][[1, 2]] - 1;
      dv1 = (v11 - v10)/o;
      dv2 = (v21 - v20)/o;
      dfn1[x_, y_] := Evaluate[D[fn[x, y], x]];
      dfn2[x_,  y_] := Evaluate[D[fn[x, y], y]];
      (* die Fusspunkte des Normalenfeldes - "in" der Flaeche *)
      p =
        Flatten[Table[{x, y, fn[x, y]}, {x, v10, v11, dv1}, {y, v20, v21,
              dv2}], 1];
      (* die Kopfpunkte des Normalenfeldes *)
      pnorm =
        Flatten[Table[
            l0/Sqrt[ dfn1[x, y]^2 + dfn2[x, y]^2 + 1.], {x, v10, v11,
              dv1}, {y, v20, v21, dv2}], 1];
      pp =
        pnorm*Flatten[
            Table[{dfn1[x, y], dfn2[x, y], -1}, {x, v10, v11, dv1}, {y, v20,
                v21, dv2}], 1];
      (* das l0 normierte Normalenrichtungsfeld mit Pfeilen *)
      pf =
        ListPlotVectorField3D[Transpose[{p, pp}], VectorHeads -> True,
          DisplayFunction -> Identity];
      (* die Flaeche z = fn[v1, v2] selbst *)
      pic =
        Plot3D[fn[v1, v2], {v1, v10, v11}, {v2, v20, v21},
          DisplayFunction -> Identity];
      (* Anzeige *)
      Show[{pic, pf}, DisplayFunction -> $DisplayFunction]
      ] /; l0 != 0 && v10 < v11 && v20 < v21 && AtomQ[v1] &&
      AtomQ[v2] && ! StringMatchQ[ToString[v1], ToString[v2]]

Also, für eine gegebene Funktion fn rechnet man die Werte auf einem Raster aus
(Liste p),
dann die "Enden" der Normalenvektoren (Liste pp), gibt das bei
ListPlotVectorField3D ab,
zeichnet noch die Fläche selber und that's it. Mit den pyramidalen
durchsichtigen
VectorHeads werden Sie nicht wirklich froh sein, ich weiss nicht, ob das --
schöne -- aufragende
Pfeile sind. Dann kann man noch fummeln an den BoxRatios ... damits auch
senkrecht aussieht.
Das nb ist im Anhang.

Gruss
Udo.



Matthias.Bode@XXXXXXX.de schrieb:

> Verehrte Kollegen,
>
> ich habe eine Funktion in den Variablen x1 und y1:
>
> Out[27]=
> 19.74211746962547 - 61.78321746073334*
>   <snip>
>
> 1.Wie lassen sich für diese Funktion Normalenvektoren (vgl.
> Bronstein-Semendjajew, 24. Aufl. 1982, 4.3.3.2. Tangentialebene und
> Flächennormale) für diverse Punkte berechnen?
> 2.Wie kekomme ich die Vektoren als schöne, aufragende Pfeile auf die Fläche?
>
> Meine Versuche mit Calculus`VectorAnalysis` und PlotVectorField3D &c.
> scheiterten kläglich.

Attachment: fnormal.nb
Description: Mathematica Notebook document

Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html