2013-05-30 10 views
9

Wykres ten jest tworzony przez Mathematica:Jak produkować interpolowana gładką 3d działki w Matlab

ls = Table[Sinc[x*y], {x, -5, 5, 0.2}, {y, -5, 5, 0.2}]; 
ListPlot3D[ls, InterpolationOrder -> 2, PlotRange -> All, 
Mesh -> None] 

enter image description here

Jak stworzyć wykres takiego w Matlab?

Oto moja próba tak daleko:

>> x=linspace(-5.,5.,51); 
>> y=linspace(-5.,5.,51); 
>> [x,y]=meshgrid(x,y); 
>> z=sinc(x.*y); 
>> surf(x,y,z) 
>> shading interp 

To wygląda zupełnie inaczej, zwłaszcza szczegóły wsady. Czy można stworzyć fabułę podobną do Mathematica, zwłaszcza gładkość, cienie?

enter image description here

+0

Dobre pytanie. Pozwólcie, że wspomnę o wolnym oprogramowaniu, alternatywnym oprogramowaniu Open Source do tych dwóch zastrzeżonych programów: GNU Octave. Co do "Mathematica" i "MATLAB", nie mam pojęcia. – cfa45ca55111016ee9269f0a52e771

+1

Jakiej wersji MATLAB używasz? Dostaję [ładną fabułę] (http://i.imgur.com/WzFHUgn.png) ... –

+0

@EitanT Używam 2012a na Macu. Ale w twojej działce wciąż są zmarszczki i linie w ścianie. – xslittlegrass

Odpowiedz

13

Aby stworzyć miłą oświetlenie i cienie, trzeba dodać światło na swojej działce, i dodać jakieś oświetlenia twarzy. Jeśli rozdzielczość jest zbyt niska, to skończy się nieco spartaczoną fabułą, ponieważ cieniowanie w stylu "interp" wykorzystuje interpolację liniową. Na przykład

n = 51; 
x=linspace(-5., 5., n); 
y=linspace(-5., 5., n); 
[x, y]=meshgrid(x, y); 
sinc = @(x) sin(x)./x; 
z=sinc(x.*y); 
z(isnan(z)) = 1; 
surf(x, y, z, 'LineStyle', 'none', 'FaceColor', 'interp') 
colormap(cool) 
camlight right 
set(gca, 'CameraPosition', [45 35 9.8]) 

która produkuje następujące

enter image description here

Zauważ, że jak gładka powierzchnia wydaje się związane z n. Większe wartości n zwiększą gładkość powierzchni.

Jeżeli dane które produkują jest drogie, aby utworzyć, można zwiększyć rozdzielczość przy użyciu bardziej zaawansowaną formę interpolacji niż liniowy, co następuje

n = 51; 
x=linspace(-5., 5., n); 
y=linspace(-5., 5., n); 
[x, y]=meshgrid(x, y); 
sinc = @(x) sin(x)./x; 
z=sinc(x.*y); 
z(isnan(z)) = 1; 

nn = 401; 
xi = linspace(-5.0, 5.0, nn); 
yi = xi; 
[xi, yi] = meshgrid(xi, yi); 
zi = interp2(x, y, z, xi, yi, 'spline'); 
surf(xi, yi, zi, 'LineStyle', 'none', 'FaceColor', 'interp') 
colormap(cool) 
camlight right 
set(gca, 'CameraPosition', [45 35 9.8]) 

która produkuje następujący obraz

enter image description here

Szczegółowe informacje można znaleźć na następujących stronach pomocy:

+0

Dzięki. Ale czy mógłbyś spróbować mojej funkcji, twoja funkcja wydaje się już bardzo gładka. – xslittlegrass

+0

Zmieniłem swoją odpowiedź, aby użyć Twojej funkcji. – hoogamaphone

+0

Dzięki, ale myślę, że mój problem polega na wykreślaniu istniejącej macierzy, a nie na zwiększaniu liczby punktów w macierzy, ponieważ w moich badaniach ta matryca jest produkowana przy użyciu innego bardzo drogiego programu. – xslittlegrass

3

Proponuję spróbować surfingu/surfl i spróbuj włączyć oświetlenie/wyłączania. Początkowa pozycja kamery jest również ważna, ponieważ używam kamery "reflektor".

x=linspace(-5.,5.,51); 
y=linspace(-5.,5.,51); 
[x,y]=meshgrid(x,y); 
z=sinc(x.*y); 
surfl(x,y,z) %surf(x, y, z) 
shading interp 
colormap cool 
%camlight headlight 
%lighting gouraud 
+0

Dzięki, tak, sprawdziłem twoją odpowiedź, ale na moim komputerze nie wytworzyłem gładkiej interpolowanej fabuły, jak w pytaniu (nie jestem pewien, czy problem jest związany z wersją). – xslittlegrass

+0

Podobało mi się wyjście "surf" + "oświetlenie włączone". Drugie pytanie, które trzeba było ponownie zinterpretować, nie zgadłem –

Powiązane problemy