DMUG-Archiv 2005

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

Re: Interpolation strukturierter 3D-Oberflächendaten (Package "BsplinesCurvesSurfaces" v. Chero)

Hallo,

a) ein B-Spline interpoliert nicht, die Kontroll-Punkte liegen auch nicht
  auf der Fläche wie man in der letzten Graphik sehr gut sieht
b) es wird also nie eine Interpolation geben, falls man aber eine Matrix
  mit Punkten haben will, die auf der Spline-Fläche liegen so liefert

Clear[MakeTable]
MakeTable[f_, {u_, u0_, u1_}, {v_, v0_, v1_}, nu_Integer, nv_Integer] :=
 Table[f, {u, u0, u1, (u1 - u0)/nu}, {v, v0, v1, (v1 - v0)/nv}]

wie man an

pnts = MakeTable[s, 32, 32];
Show[Graphics3D[Map[Point, pnts, {2}]]]

sieht das gewünschte Ergebnis.

Gruß

 Jens




----- Original Message ----- From: "Isam Tahhan" <tahhan@XXXXXXX.de>
To: <demug@XXXXXXX.ch>
Sent: Wednesday, February 16, 2005 6:01 PM
Subject: Interpolation strukturierter 3D-Oberflächendaten (Package "BsplinesCurvesSurfaces" v. Chero)


Hallo,

für folgendes Problem suche ich eine Lösung:

Ich habe eine 3D-Matrix aus (X,Y,Z)-Werten, die eine Oberfläche beschreiben.
Die Daten sind strukturiert, liegen aber auf einem Grid, der nicht genau
rechtwinklig ist und keine gleichmäßigen Abstände hat. Die Fläche ist
annähernd rechteckig und relativ glatt sowie stetig.

Ich möchte nun Werte zwischen den bekannten Stützpunkten interpolieren, wozu
vermutlich eine Spline-Oberfläche am besten geeignet sein dürfte.

Hierzu liegt mir ein Package NumericalMath`BsplinesCurvesSurfaces` von
Robert Ipanaque vor, welches aus der MathSource stammt
(http://library.wolfram.com/infocenter/MathSource/5132/). Es existiert auch
ein kleines Notebook, welche unter anderem die Funktion "surface"
beschreibt. Dieses Beispiel habe ich hier aufgelistet:

<< NumericalMath`BsplinesCurvesSurfaces`
p = {
{{0, 0, 0}, {1, 0, 0}, {2, 0, 0}, {3, 0, 0}, {4, 0, 0}, {5, 0, 0}, {6,
0, 0}},
{{0, 1, 0}, {1, 1, 1}, {2, 1, 1}, {3, 1, 1}, {4, 1, 1}, {5, 1, 1}, {6,
1, 0}},
{{0, 2, 0}, {1, 2, 1}, {2, 2, 1}, {3, 2, 1}, {4, 2, 1}, {5, 2, 1}, {6,
2, 0}},
{{0, 3, 0}, {1, 3, 1}, {2, 3, 1}, {3, 3, 1}, {4, 3, 1}, {5, 3, 1}, {6,
3, 0}},
{{0, 4, 0}, {1, 4, 1}, {2, 4, 1}, {3, 4, 1}, {4, 4, 1}, {5, 4, 1}, {6,
4, 0}},
{{0, 5, 0}, {1, 5, 1}, {2, 5, 1}, {3, 5, 1}, {4, 5, 1}, {5, 5, 1}, {6,
5, 0}},
{{0, 6, 0}, {1, 6, 0}, {2, 6, 0}, {3, 6, 0}, {4, 6, 0}, {5, 6, 0}, {6,
6, 0}}
     };

s = Surface[p];

PiecewiseForm[{s}];
g = ParametricPlot3D[s // Evaluate, PlotPoints -> {15, 15}];

Show[g,
 Graphics3D[{RGBColor[1, 0, 0], Map[Line, p],
     Map[Line, p // Transpose]}]
 ]

Der ausgegebene Plot zeigt eine gute Interpolation der vorgegebenen
Oberfläche (aus p), die "Feinheit" kann man mit den Parametern in PlotPoints
steuern.

Leider ist es mir trotz einigen Probierens nicht gelungen, die grafisch
offensichtich vorhandenen Interpolationsdaten als Zahlenwerte in der Form Z=
f(X,Y) den vorliegenden Zeilen zu entlocken. Anfragen beim Urheber blieben
bisher auch unbeantwortet, daher würde ich mich sehr über Hilfe in dieser
Frage freuen.

Alternativ wäre mit natürlich auch mit jeder anderen Strategie, die obige
Interpolation leistet und Zwischenwerte zugänglich macht, zufrieden.

Eine Alternative, die sich mir leider nicht erschließt, wäre die Umleitung
der grafischen Werte in ein Listfile, allerdings gelingt mir dies nur in der
Form von Polygonen, die zur einfachen Weiterverarbeitung nicht taugen;
einfache (X,Y,Z)-Punkte in einer entsprechend feineren Matrix als der
Stützpunktmatrix wären das Ziel.

Auf Wunsch kann ich die oben angesprochenen Dateien auch zumailen, sie sind
jedoch auf MathSource (s.o.) frei zugänglich.

Danke im Voraus,
I.Tahhan






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

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