Disegno di una superficie con Matlab

mmmmt
Salve a tutti, questo è il mio primo post, quindi perdonatemi qualche strafalcione.
Ho il seguente problema da risolvere con Matlab.

Considerare il quadrato Q=[0,1]x[0,1] del piano (x,y),
disegnare la funzione f(x,y) che vale

1 se sqrt( (x - 1/2)^2 + (y - 1/2)^2 ) <1/2
cioe' all'interno del cerchio di centro ( 1/2 , 1/2 ) e raggio 1/2

0 altrimenti (cioe' nei quattro spicchi di piano del piano z=0
tra Q e la circonferenza)



Posto il codice: ho disegnato la parte di superficie nella quale assume il valore 1,
ma non sono capace di andare avanti.



a=1/2;
b=200;

[u v]= meshgrid( 0 : 1/b : 1 );

x=a+a*cos(2*pi*u).*cos(2*pi*v);
y=a+a*cos(2*pi*u).*sin(2*pi*v);
z=ones(b+1,b+1);


map=((x-a).^2-(y-a).^2);

surf(x,y,z,map);

shading interp;
axis equal;
axis square;
axis([0 1 0 1 0 1]);





Grazie in anticipio per ogni suggerimento.

Risposte
apatriarca
Qualche suggerimento sparso:
1. Per generare un certo numero di valori in un certo intervallo è spesso utile fare ricorso alla funzione linspace. In questo caso si poteva in effetti fare a meno, ma è comodo conoscerla.
2. Supponiamo che la matrice G contenga i valori \( \sqrt{ (x - 1/2)^2 + (y - 1/2)^2 } \) per ogni valore di \( x \) e \( y \). "G < 1/2" (ho usato le virgolette solo per raggruppare l'espressione) è allora una matrice che contiene 1 quando la condizione è vera e 0 altrimenti come desiderato (ma sono dei valori booleani che devono essere convertiti in double per far funzionare surf).

Avrei quindi fatto qualcosa come:
[u v] = meshgrid(linspace(0, 1, 200));
G = realsqrt( (u - 0.5).^2 + (v - 0.5).^2 );
surf(double(G < 0.5));

mmmmt
Grazie mille, il secondo suggerimento è semplice ed efficace quindi geniale, ma c'è un problema:
pur sembrando il codice corrispondente a ciò che mi è richiesto, il disegno viene costruito
sul quadrato R=[0,200]x[0,200] e non riesco a riportarlo sul quadrato Q=[0,1]x[0,1] .

apatriarca
Ciao, errore mio in effetti. Mi sono infatti dimenticato di passare le coordinate alla funzione surf. Devi scrivere:
surf(u, v, double(G < 0.5));

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.