[MATLAB] graficare retta per due punti
Salve a tutti,
perdonate l'ignoranza, esiste un metodo veloce per disegnare una retta passante per due punti in un plot di matlab? Ad esempio in questo momento ho un grafico aperto, e vorrei aggiungere una retta passante per l'origine ed il punto [1,2]. Mi servirebbe anche sapere come traslare la retta su di un altro punto.
Grazie.
perdonate l'ignoranza, esiste un metodo veloce per disegnare una retta passante per due punti in un plot di matlab? Ad esempio in questo momento ho un grafico aperto, e vorrei aggiungere una retta passante per l'origine ed il punto [1,2]. Mi servirebbe anche sapere come traslare la retta su di un altro punto.
Grazie.
Risposte
Supponi che (x1,y1) ed (x2,y2) siano le coordinate cartesiane (nel piano) dei due punti. Allora puoi usare il seguente script (e richiamarlo dal prompt dei comandi di Matlab - ad es., salvando l'm-file associato all'interno della cartella corrente):
function myfunc(x1,y1,x2,y2,n) % varia n per controllare la risoluzione del grafico if x1 ~ x2 x = linspace(x1,x2,n); y = y1 + (y2-y1)*(x-x1)/(x2-x1); else y = linspace(y1,y2,n); x = x1*ones(1,n); end plot(x,y,'-k')
Grazie mille!
E per traslarla?
E per traslarla?

Che intendi?
"Gabriel":
Che intendi?
Cerco di essere un po' più chiaro

Per le applicazioni che uso io, mi serve disegnare la direzione di diversi vettori, ma queste direzioni sono sempre centrate nell'origine (in pratica conosco un solo punto, l'altro è sempre [0,0]). Queste direzioni poi vanno "spostate" su determinati punti.
Posso ovviamente fare tutti i calcoli a mano, ma sarebbe grandioso se esistesse uno script che riceve in ingresso 2 punti e che faccia le seguenti operazioni:
* si segna l'equazione della retta che passa per [0,0] e il primo punto che gli ho assegnato;
* sposta la retta in maniera da farla passare per il secondo punto (mantenendo il coefficiente angolare, ovviamente) e la disegni sul grafico.
Spero stavolta di essermi spiegato.
Ancora grazie per il gentile aiuto

Se ho capito bene, supponiamo che (x1,y1), (x2,y2) e (x3,y3) siano le coordinate cartesiane di tre punti nel piano, assunto (x1,y1) $\ne$ (x2,y2). Si tratta, anzitutto, di tracciare la retta per (x1,y1) ed (x2,y2), quindi traslarla di modo che passi per (x3,y3), mantenendo l'inclinazione verso gli assi. In tal caso ...
Qualcosa che si dovrebbe migliorare è, di sicuro, il dimensionamento automatico del box degli assi. Per il resto, mi pare possa andare.
function myfunc2(x1,y1,x2,y2,n,x3,y3) % La funzione è scritta di modo che gli ultimi due % argomenti in ingresso si possano omettere. % Il parametro n serve a controllare la risoluzione % del grafico. if nargin < 6, x3 = 0; y3 = 0; end if nargin < 7, y3 = 0; end % riordiniamo, se necessario, i punti if x1 > x2 temp = x1; x1 = x2; x2 = temp; temp = y1; y1 = y2; y2 = temp; clear temp end % h = figure('visible','off'); grid on hold on if x1 ~= x2 x = linspace(x1-abs(x1), ... x2+abs(x2),2*n); m = (y2-y1)/(x2-x1); y = y1 + m*(x-x1); plot(x,y,'-b',x1,y1,'or',x2,y2,'or',x3,y3,'or') x = linspace(x3-x2+x1,x3+x2-x1,2*n); y = y3 + m*(x-x3); else y1 = min([y1,y2,y3]); y3 = max([y1,y2,y3]); y = linspace(y1-abs(y1),y3+abs(y3),2*n); x = x1*ones(1,2*n); plot(x,y,'-b',x1,y1,'or',x2,y2,'or',x3,y3,'or') x = x3*ones(1,2*n); end plot(x,y,'-g') hold off set(h,'visible','on')
Qualcosa che si dovrebbe migliorare è, di sicuro, il dimensionamento automatico del box degli assi. Per il resto, mi pare possa andare.
Adesso già va meglio, grazie!
Lo script fa il suo sporco lavoro, ma non ho capito a che serve il parametro "n" (per valori <1 non mi disegna le rette, mentre per valori >1 anche molto grandi le rette sono sempre le stesse). In pratica i miglioramenti che renderebbero "perfetto" lo script sono i seguenti:
1. possibilità di non disegnare la retta passante per l'origine
2. possibilità di "allungare le rette all'infinito (così come sono mi appaiono dei segmenti).
Grazie ancora!!!

Lo script fa il suo sporco lavoro, ma non ho capito a che serve il parametro "n" (per valori <1 non mi disegna le rette, mentre per valori >1 anche molto grandi le rette sono sempre le stesse). In pratica i miglioramenti che renderebbero "perfetto" lo script sono i seguenti:
1. possibilità di non disegnare la retta passante per l'origine
2. possibilità di "allungare le rette all'infinito (così come sono mi appaiono dei segmenti).
Grazie ancora!!!

Come è scritto nel commento immediatamente successivo alla testata della funzione, il parametro n (un intero > 1) serve a controllare la qualità del grafico (i.e., il numero di punti utilizzati per disegnare le tue rette). Ovviamente, esiste un valore di soglia N per cui, se n > N, l'aspetto del grafico apparentemente non cambia - in quanto la retta è sopracampionata rispetto alla capacità dell'occhio di distinguerne due punti contigui. In effetti, però, c'è da dire che le opzioni di formattazione '-b' e '-g' adottate per diagrammare le curve del problema e la particolare natura rettilinea rendono, di fatto, vuoto di sensi l'intero discorso - adesso che ci penso -, dacché - tutto considerato - il Matlab interpola i vettori x ed y, una volta riportati sugli assi della figura, mediante segmenti (interpolazione lineare). Il codice, perciò, si può semplificare come segue:
In quanto alla richiesta n.ro 2, temo ci sia poco da fare, nel senso che le rette a forza vanno tracciate come segmenti!
function myfunc3(x1,y1,x2,y2,x3,y3,bl) % La funzione è scritta di modo che gli ultimi due % argomenti in ingresso si possano omettere. % Se impostato ad 1, il parametro booleano bl % plotta la retta per i punti (x1,y1) e (x2,y2), % che altrimenti, di default, viene nascosta. if nargin < 5, x3 = 0; y3 = 0; bl = 0; end if nargin < 6, y3 = 0; bl = 0; end if nargin < 7, bl = 0; end % riordiniamo i punti, di modo che x1 < x2 if x1 > x2 temp = x1; x1 = x2; x2 = temp; temp = y1; y1 = y2; y2 = temp; clear temp end h = figure('visible','off'); grid on hold on if x1 ~= x2 m = (y2-y1)/(x2-x1); if bl x = [x1-abs(x1),x2+abs(x2)]; y = y1 + m*(x-x1); plot(x,y,'-b') end x = [x3-x2+x1,x3+x2-x1]; y = y3 + m*(x-x3); else y1 = min([y1,y2,y3]); y3 = max([y1,y2,y3]); y = [y1-abs(y1),y3+abs(y3)]; if bl x = x1*ones(1,2); plot(x,y,'-b') end x = x3*ones(1,2); end plot(x,y,'-g',x1,y1,'or',x2,y2,'or',x3,y3,'or') hold off set(h,'visible','on')
In quanto alla richiesta n.ro 2, temo ci sia poco da fare, nel senso che le rette a forza vanno tracciate come segmenti!
Beh, che dire... Sei stato gentilissimo, grazie mille!!!
