Robitex's Blog

Ideas in the web

METAPOST ed il prodotto scalare


Se la geometria aiuta

Recentemente riflettevo come raramente il grande pubblico televisivo sente parlare di matematica. Eppure è una scienza fondamentale per l’evoluzione della nostra specie. La tecnologia, dai telefonini alla robotica, la medicina, dagli scenari epidemici alla genetica, l’economia, dalla teoria dei giochi ai mercati finanziari, sono mosse dai numeri e dalle loro relazioni.

Prodotto scalare

Dunque, appena oltre la geometria elementare fatta di triangoli e circonferenze, si trova l’algebra lineare, ovvero il mondo dei vettori.
Una delle prime operazioni che si imparano dei vettori è quella del prodotto scalare, detto così perché riceve due vettori per fornire un numero, che è una grandezza scalare in distinzione da quelle vettoriali.

Si tratta di moltiplicare le lunghezze dei due vettori per il coseno dell’angolo da essi formato. Esiste anche una forma algebrica che consiste nella somma dei prodotti delle corrispondenti componenti dei vettori.

In formule, l’espressione geometrica è:

\displaystyle u \cdot v = uv\cos{\theta}

mentre quella algebrica è:

\displaystyle u \cdot v = u_1v_1+u_2v_2+u_3v_3

L’equazione della retta ed il prodotto scalare

Se l’angolo formato dai vettori è l’angolo retto, il coseno sarà zero e quindi anche il loro prodotto scalare.

Noto quindi un vettore n, i punti Q della retta ortogonale ad n e passante per il punto P soddisfano l’equazione:

\displaystyle n \cdot PQ=0

Se nel piano le componenti di n sono (a,b), quelle di PQ sono (x-x_p,y-y_p), l’equazione della retta si può scrivere nella forma lineare standard (assegnando a c la parte costante dell’espressione):

\displaystyle n \cdot PQ= a(x-x_p)+b(y-y_p)= ax+by+c=0

Applicazione in Metapost

La domanda è già nell’aria: perché non utilizzare le capacità di Metapost di risolvere sistemi lineari per rappresentare una retta a partire da un vettore?

(xpart r - x.P) * xpart n + (ypart r - y.P) * ypart n = 0;
 xpart r = 150;

Il codice completo è il seguente, in cui si è definito una funzione chiamata drawline, che prende un vettore (ed un colore), risolve il sistema come prodotto scalare e disegna il risultato con tanto di etichette.

outputtemplate:="scalar.mps";
beginfig(1);

% solve function to draw the line
def drawline(expr n, col)=
  pair r;

  % linear system
  (xpart r - x.P) * xpart n + (ypart r - y.P) * ypart n = 0;
   xpart r = 150;
  
  drawoptions(withcolor col withpen pencircle scaled 1.4);
  draw (-1.5)[z.P, r] -- 1.28[z.P, r];
  drawarrow origin -- n;
  drawoptions(withcolor black);
  
  % labels
  dotlabel.bot(btex $R$ etex, r);
  label.lft(btex $n$ etex,0.5[origin,n]);
enddef;

% punto di aggancio rette
z.P = (50,100);

pair a;
a := (0,75);

drawline(a rotated  20, blue);
drawline(a rotated -20, 0.7red);
drawline(a rotated -45, green);

dotlabel.bot(btex $P$ etex, z.P);

% ascissa limite
draw (150,-30)--(150,160) dashed evenly;

% draw axis
dim := 200;
dim1 := 12;

drawarrow origin -- (dim,0); % x
drawarrow origin -- (0,dim); % y

label.bot(btex $x$ etex,(dim-dim1,0));
label.lft(btex $y$ etex,(0,dim-dim1));
label.llft(btex $O$ etex,origin);

endfig;
end;
Scalar product: a Metapost example

Scalar product: a Metapost example

Punti e semipiani

Se pensiamo all’equazione della retta nella forma vista del prodotto scalare, è facile rendersi conto che è possibile determinare a quale dei due semipiani appartenga un punto qualsiasi.

Un punto al di sopra della retta (rispetto al vettore (a,b) chiamiamolo “generatore”), formerà un angolo con il vettore generatore inferiore all’angolo retto, per cui il prodotto scalare risulterà positivo. Viceversa se il punto è sotto la retta l’angolo è superiore all’angolo retto pertanto il prodotto scalare sarà negativo.

In definitiva, un punto di coordinate (x,y) sarà sopra o sotto la retta a seconda del segno del valore dell’espressione lineare ax+by+c.

Nello spazio

In “3D” l’espressione lineare ax+by+cz+d=0 è l’equazione del piano ortogonale al vettore (a,b,c), e sottoforma di prodotto scalare permette di capire come assegnare ad un punto qualsiasi il semispazio di appartenenza.
Non male per una banale moltiplicazione.

Ciao, alla prossima.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: