#!/bin/sh # #Beispiel für die Verwendung von VTK 2.0, #Author C. Zerbst email:zerbst@tu-harburg.d400.de # #Starten der erweiterten wish\ exec vtk "$0" "$@" #Für Windows wird die Bibliothek geladen catch {load vtktcl} # get the interactor ui source vtkInt.tcl # Eine Oberfläche wird erzeugt und skaliert vtkPlaneSource plane plane SetXResolution 100 plane SetYResolution 100 vtkTransform transform transform Translate 5 5 0 transform Scale 10 10 1 vtkTransformPolyDataFilter transF transF SetInput [plane GetOutput] transF SetTransform transform transF Update #Es wird die Anzahl der Punkte abgefragt set input [transF GetOutput] set numPts [$input GetNumberOfPoints] # und zwei Arrays der richtigen Größe erstellt vtkPoints newPts vtkScalars scalar # Damit wird eine Datenstruktur aufgebaut vtkPolyData mathe mathe CopyStructure $input mathe SetPoints newPts [mathe GetPointData] SetScalars scalar #Für jeden der Punkte wird ein 3d Punkt berechnet und ein Scalar for {set i 0} {$i < $numPts} {incr i} { set x [$input GetPoint $i] set x0 [lindex $x 0] set x1 [lindex $x 1] # set r [expr 0.01+sqrt($x0*$x0 + $x1*$x1)] # set x2 [expr 10*cos($x0)*0.1/$r] set od 2.5 if {$x0 <= 1e-3} { set x2 0 } else { if {[catch {expr 1/(pow( pow($od/$x0,2)-1, 2) + pow(0.5*$x1,2))} x2]} { set x2 20 } if {$x2 < 1e-10} {set x2 0} if {$x2 > 25} {set x2 25} } puts [format "%g %g %g" $x0 $x1 $x2] newPts InsertPoint $i $x0 $x1 $x2 eval scalar InsertScalar $i $x2 } #newPts Delete #scalar Delete # die Oberfläche wird entsprechend der Funktion verformt vtkWarpScalar warp warp SetInput mathe warp XYPlaneOn warp SetScaleFactor 0.5 #Eine Farbtabelle mit den Farben von rot nach blau vtkLookupTable lut lut SetNumberOfColors 100 lut SetHueRange 0.3333 1 #Die Oberflächen werden auf graphische Primitive abgebildet vtkDataSetMapper mapper mapper SetInput [warp GetOutput] eval mapper SetScalarRange [$input GetScalarRange] mapper SetLookupTable lut vtkActor carpet carpet SetMapper mapper #Eine Kamera wird definiert und die Startposition angegeben vtkCamera aCam aCam SetPosition 10 15 30 aCam ComputeViewPlaneNormal aCam SetViewAngle 30 aCam SetViewUp 0 1 0 #Der Renderer wird erzeugt vtkRenderer ren1 ren1 SetBackground 1 1 1 #Ein 3D-Widget wird erzeugt und mit den Renderer verbunden vtkRenderWindow renWin renWin AddRenderer ren1 #Der Standardmethoden für Zoomen etc. werden erzeugt und an das 3D-Widget #gebunden vtkRenderWindowInteractor iren iren SetRenderWindow renWin #Die Actoren werden an den Renderer gebunden ren1 AddActor carpet ren1 SetActiveCamera aCam renWin SetSize 500 500 #Die Pipeline wird ausgeführt iren Initialize #Ein kleiner Hilfetext, der Knopf zum Beenden message .message -aspect 300 \ -text "Das 3D-Widget hat folgende Bindings:\n\ \n\t dreht in Richtung des Cursors\n \t verschiebt in Richtung des Cursors\n \t zoomt \n " grid .message -columnspan 3 set repres Surface label .repres -text Representation grid .repres -row 1 -column 0 foreach i {Points Wireframe Surface} { radiobutton .[string tolower $i] -text $i -variable repres -value $i\ -anchor w -command { eval [carpet GetProperty] SetRepresentationTo$repres; iren Initialize} grid .[string tolower $i] -column 0 -sticky ew } set interp Gouraud label .interp -text Interpolation grid .interp -row 1 -column 2 set row 2 foreach i {Flat Gouraud Phong} { radiobutton .[string tolower $i] -text $i -variable interp -value $i\ -anchor w -command { eval [carpet GetProperty] SetInterpolationTo$interp; iren Initialize} grid .[string tolower $i] -row $row -column 2 -sticky ew incr row } button .bild -text "Bild abspeichern" -command {renWin SetFileName "mathe.ppm"; renWin SaveImageAsPPM} button .ende -text Beenden -command {destroy .} grid .bild -column 1 -sticky ew grid .ende -column 1 -sticky ew wm title . Mathematik return exit