Disegno di una superficie con Matlab
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.
Grazie in anticipio per ogni suggerimento.
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
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:
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));
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] .
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] .
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));