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