Verwendung des Werkzeugs zur 3D-Darstellung von Parameterwerten
(c) 1996 by Jens Potschadtke

Enthält folgende Funktionen:
höhendreieck[dr_Polygon,ticks_List] Unterteilt das Dreick dr in gefärbte Flächen um, deren Höhe durch ticks gegeben ist. Farbfunktion ist Hue.

farbdreick[dr_Polygon] ruft höhendreieck auf, mit "ticklist" als zweites Argument.

punkteAusMeßdaten[datei_String] liest die Meßwerte aus der Datei ein und wandelt sie in eine Liste von Point[] um.

flächeAusMeßdaten[datei_String] liest die Meßwerte aus der Datei ein und wandelt sie in eine Liste von Polygon[] um, so daß eine geschlossene Fläche entsteht. 
(Mit Map[farbdreieck,flächeAusMeßdaten["datei"]] kann man dann Höhenlinien einfügen)

zeigeFlächeAusMeßdaten[datei_String] Zeigt die Datei als Fläche an (fertig eingefärbt).

zeigePunkteAusMeßdaten[datei_String] Zeigt die Datei als Punkte an.

animationDesBetrachters[graf3d_Graphics3D] Dreht die 3D-Grafik einmal um ihre Achse für Animationen. Gibt eine Liste von Graphics3D-Objekten zurück.

Definitionsteil

<<Graphics`Graphics`
<<Statistics`DataManipulation`
<<Statistics`DescriptiveStatistics`
<<Calculus`VectorAnalysis`
<<LinearAlgebra`Orthogonalisation`

Einfärben eines Dreiecks nach einer Tickliste

ClearAll[höhendreieck,winkelliste,polygondreh,ineinheit];
(*höhendreieck[x_,y_]:={};*)
höhendreieck[dr_Polygon,ticks_List]:=Module[{ebenengleich,rulelist,selrulelist,geordnetepunkte,farblist,
testlist,farbeimerselekt,farbseppunkte,zeichenlist,winkelliste,polygondreh,ineinheit,normalenvektor,gibwinkel
 },
  gibwinkel[vektest_,vek0_,vek1_]:=Module[{n1,n0,winkel},
    n1=Normalize[vektest].Normalize[vek0 ~CrossProduct~ vek1];
    n0=Normalize[vektest].Normalize[vek0];
    If[n0!=0.,winkel=ArcTan[n1/n0],winkel= -0.5 N[Pi] Sign[n1] ];
    If[(n0<=0.),winkel += N[Pi],  If[(n1<0.)&&(n0>0.), winkel+= 2N[Pi] ] ];
    winkel
  ];
  winkelliste[x_List/;Length[x]>=3]:=Transpose[{x,Table[gibwinkel[(x[[i]]-(Plus@@x/Length[x])), (x[[1]]-(Plus@@x/Length[x])),normalenvektor],{i,Length[x]}]} ];   
  polygondreh[x_List]:=Polygon[Column[Sort[winkelliste[x] , (#1[[2]] <= #2[[2]])&],1]] ;
  polygondreh[{}]:=Polygon[{}];
  ineinheit[{x_Rule,y_Rule}]:=((x[[2]]>=0.)&&(x[[2]]<=1.)&&(y[[2]]>=0.)&&(y[[2]]<=1.) );
  ebenengleich=dr[[1,1]]+l (dr[[1,2]]-dr[[1,1]])+ m  (dr[[1,3]]-dr[[1,2]]);
  normalenvektor=((dr[[1,2]]-dr[[1,1]]) ~CrossProduct~ (dr[[1,3]]-dr[[1,2]]))//Normalize;
  rulelist=Flatten[Table[Solve[Reduce[ebenengleich[[3]]==ticks[[i]],{l,m}]&&(( l==1.)||(l==m )||(m==0. ) ),{l,m} ],{i,Length[ticks]}],1];
  rulelist=Union[rulelist,{{l->0,m->0},{l->1.,m->0},{l->1.,m->1.}}];
 
  selrulelist=BooleanSelect[rulelist , Map[ineinheit,rulelist]];
  geordnetepunkte=Map[RotateLeft, Map[RotateRight,ebenengleich/.selrulelist]//Sort];
  farblist=Hue/@((ticks-Min[ticks])/Max[ticks] );
  testlist=Table[((#[[3]]>=ticks[[i]]-2 $MachineEpsilon)&&(#[[3]]<=ticks[[i+1]]+2 $MachineEpsilon))& ,{i,Length[ticks]-1}];
  farbeimerselekt=Table[Map[testlist[[i]],geordnetepunkte ],{i,Length[testlist]} ];
  farbseppunkte=Table[BooleanSelect[geordnetepunkte,farbeimerselekt[[i]]],{i,Length[testlist]}];
  
  zeichenlist=Table[{farblist[[i]],polygondreh[farbseppunkte[[i]]]},{i,Length[testlist]}];
  DeleteCases[zeichenlist,{Hue[_],Polygon[{}]} ]  (*Ausgabe *)
]; (*Module*)

farbdreieck[x_Polygon]:=höhendreieck[x,ticklist];

Erstellen einer Liste von Dreiecken aus den Meßdaten

punkteAusMeßdaten[datei_String]:=Module[
{
  textlist,
  komma,
  numlist,
  sortlist,
  ticklist,
  belastlist,
  fraklist,
  zeilehoch,
  zeilerunter,
  koordlist,
  trianglelist

},
textlist=ReadList[datei, Word, 
WordSeparators->{" ","\t"},RecordSeparators->{"\n","\r"},RecordLists->True];
komma[x_String]:=ToExpression[StringReplace[x,","->"."]];
numlist=Map[komma,textlist,{2}];
sortlist=Sort[numlist];
Map[Point,sortlist,1]
];



flächeAusMeßdaten[datei_String]:=Module[
{
  textlist,
  komma,
  numlist,
  sortlist,
  belastlist,
  fraklist,
  zeilehoch,
  zeilerunter,
  koordlist,
  trianglelist

},
textlist=ReadList[datei, Word, 
WordSeparators->{" ","\t"},RecordSeparators->{"\n","\r"},RecordLists->True];
komma[x_String]:=ToExpression[StringReplace[x,","->"."]];
numlist=Map[komma,textlist,{2}];
sortlist=Sort[numlist];
ticklist=Column[LinearScale[Min[Column[numlist,3]]-0.2,Max[Column[numlist,3]]+0.1,20 ],1]+0.0001;
belastlist=Map[Part[#,1]&,sortlist]//Union;
fraklist=Table[BooleanSelect[sortlist,Map[(#[[1]]==belastlist[[i]])&,sortlist]],{i,Length[belastlist]}];
zeilehoch[x0_List,i_Integer]:=Table[{x0[[i,i0]],x0[[i,i0+1]],x0[[i+1,i0]]},{i0,Min[Length[x0[[i]]],1+Length[x0[[i+1]] ] ]-1}];
zeilerunter[x0_List,i_Integer]:=Table[{x0[[i+1,i0]],x0[[i+1,i0+1]],x0[[i,i0+1]]},{i0,Min[1+Length[x0[[i]]],Length[x0[[i+1]] ] ]-1}];
koordlist=Flatten[Table[
  {zeilehoch[fraklist,i],zeilerunter[fraklist,i]},{i,Length[fraklist]-1}],2];
trianglelist=Map[Polygon,koordlist,1]
];
opt={PlotRange->All, Boxed->True, BoxRatios->{1,-1,1}, Axes->True,
FaceGrids->{{1,0,0},{0,-1,0},{0,0,-1}},
(*AxesLabel->{"Belastung in W","Schlagfrequenz in bpm","Parameteramplitude"},*)
ViewPoint->{-1.621,2.680,1.280},Lighting->False};

zeigeFlächeAusMeßdaten[datei_String]:=Show[Graphics3D[farbdreieck /@ flächeAusMeßdaten[datei]],opt];
zeigePunkteAusMeßdaten[datei_String]:=Show[Graphics3D[{PointSize[0.05],punkteAusMeßdaten[datei]}],opt];

animationDesBetrachters[graf3d_Graphics3D]:=Module[
{view,
 viewinter,
 animtable 
},
  view={ {-2.972,-1.245,1.033},{-0.908,2.848,1.586} ,{2.538,1.396,1.750} ,
  {1.743,-2.237,1.845} ,{-2.972,-1.245,1.033} }//Transpose;
  viewinter=Interpolation/@view;
  Off[Polygon::list];
  animtable=Table[
    Show[graf3d,FaceGrids->{{1,0,0},{0,1,0},{0,0,-1}},Lighting->True,
      Ticks->{Automatic,Automatic,LinearScale[4,8,20]},  
      ViewPoint->{viewinter[[1]][i],viewinter[[2]][i],viewinter[[3]][i]},
      SphericalRegion->True,Axes->False
    ],{i,1,4.9,0.1}
  ];
  On[Polygon::list];
  animtable
];

Beispiel

Timing[
flach=zeigeFlächeAusMeßdaten["ne05.txt"];
punkt=zeigePunkteAusMeßdaten["ne05.txt"];
graf3=Show[flach,punkt];
]

animationsliste=animationDesBetrachters[graf3]