1 Matematica vettoriale

Un vettore indica una quantità, come la velocità o la forza, con direzione e lunghezza. Nei sistemi di coordinate 3D, i vettori sono rappresentati da un gruppo ordinato di tre numeri reali del tipo:

$$\mathbf{\vec v} = <a_1, a_2, a_3>$$

1.1 Rappresentazione vettoriale

In questo documento, le lettere minuscole in grassetto con la freccia in alto indicano i vettori. I componenti vettoriali vengono anche indicati fra parentesi angolari. Le lettere maiuscole indicano i punti. Le coordinate di punti vengono sempre indicate fra parentesi.

Utilizzando un sistema di coordinate e un qualsiasi insieme di punti di ancoraggio, possiamo rappresentare e visualizzare i vettori usando una rappresentazione con segmenti di linee, dove una freccia mostra la direzione del vettore. Una freccia mostra la direzione del vettore.

Ad esempio, se abbiamo un vettore con una direzione parallela all’asse X di un determinato sistema di coordinate 3D e una lunghezza di 5 unità, possiamo scrivere il vettore come segue:

$$\mathbf{\vec v} = <5, 0, 0>$$

Per rappresentare tale vettore, occorre un punto di ancoraggio nel sistema di coordinate. Ad esempio, tutte le frecce della figura seguente sono rappresentazioni uguali dello stesso vettore, nonostante siano ancorate in diversi punti.

Figura (1): Rappresentazione vettoriale nel sistema di coordinate 3D.
Note
Dato un vettore 3D $$\vec v = <a_1, a_2, a_3>$$ , tutti i componenti del vettore $$a_1$$, $$a_2$$, $$a_3$$ sono numeri reali. Inoltre, tutti i segmenti di linea da un punto $$A(x,y,z)$$ a un punto $$B(x+a_1, y+a_2, z+a_3)$$ sono rappresentazioni equivalenti del vettore $$\vec v$$.

Quindi, come possiamo definire i punti di fine del segmento di una retta che rappresenta un determinato vettore? Definiamo un punto di ancoraggio (A) in questo modo:

$$A = (1, 2, 3)$$

E un vettore:

$$\mathbf{\vec v} = <5, 6, 7>$$

La punta $$(B)$$ del vettore viene calcolata sommando i componenti corrispondenti dal punto di ancoraggio e dal vettore $$\vec v$$:

$$B = A + \mathbf{\vec v}$$
$$B = (1+5, 2+6, 3+7) $$
$$B = (6, 8, 10)$$

Figura (2): Rapporto fra un vettore, il punto di ancoraggio di un vettore e il punto che coincide con la posizione della punta del vettore.

Vettore posizione

La rappresentazione di un particolare vettore utilizza il punto di origine $$\text{origin point} (0,0,0)$$ come punto di ancoraggio del vettore. Il vettore posizione $$\mathbf{\vec v} = <a_1,a_2,a_3>$$ è rappresentato con un segmento di linea fra due punti, l’origine e B, quindi:

$$\text{Origin point} = (0,0,0)$$
$$B = (a_1,a_2,a_3)$$

Figura (3): Vettore posizione. Coordinate della punta del vettore uguali ai componenti vettoriali corrispondenti.
Note
Il vettore posizione per un determinato vettore $$\vec v= < a_1,a_2,a_3 >$$ è una determinata rappresentazione di un segmento di linea dal punto di origine $$(0,0,0)$$ al punto $$(a_1, a_2, a_3)$$.

Vettori e punti

Non confondere vettori e punti. Sono concetti molto diversi. Come menzionato, i vettori rappresentano una quantità con una direzione e lunghezza, mentre i punti indicano una posizione. Ad esempio, la direzione nord è un vettore mentre il polo nord è una pozione (punto). Se abbiamo un vettore e un punto che presentano gli stessi componenti, come:

$$\mathbf{\vec v} = <3,1,0>$$
$$P = (3,1,0)$$

Possiamo disegnare il vettore e il punto come segue:

Figura (4): Un vettore definisce una direzione e una lunghezza. Un punto definisce una posizione.

Lunghezza del vettore

Come indicato in precedenza, i vettori presentano una lunghezza. Utilizzeremo $$\vert a \vert$$ per indicare la lunghezza di un determinato vettore $$ a $$. Per esempio:

$$\mathbf{\vec a} = <4, 3, 0>$$
$$\vert \mathbf{\vec a} \vert = \sqrt{4^2 + 3^2 + 0^2}$$
$$\vert \mathbf{\vec a} \vert = 5$$

In generale, la lunghezza di un vettore $$\mathbf{\vec a} <a_1,a_2,a_3>$$ viene calcolata come segue:

$$\vert \mathbf{\vec a} \vert = \sqrt{(a_1)^2 + (a_2)^2 + (a_3)^2} $$
Figura (5): Lunghezza del vettore.

Vettore di unità

Un vettore di unità è un vettore con una lunghezza uguale a una unità. I vettori di unità sono comunemente usati per mettere a confronto le direzioni dei vettori.

Note
Un vettore di unità è un vettore con una lunghezza uguale a un’unità.

Per calcolare un vettore di unità, occorre trovare la lunghezza di un determinato vettore e quindi dividere i componenti del vettore per la lunghezza. Per esempio:

$$\mathbf{\vec a} = <4, 3, 0>$$
   $$\vert \mathbf{\vec a} \vert = \sqrt{4^2 + 3^2 + 0^2}$$
   $$\vert \mathbf{\vec a} \vert = 5 \text{ unit length}$$

If $$\mathbf{\vec b} = \text{unit vector}$$ of $$a$$, then:
   $$\mathbf{\vec b} = <4/5, 3/5, 0/5>$$
   $$\mathbf{\vec b} = <0.8, 0.6, 0>$$
   $$\vert \mathbf{\vec b} \vert = \sqrt{0.8^2 + 0.6^2 + 0^2}$$
   $$\vert \mathbf{\vec b} \vert = \sqrt{0.64 + 0.36 + 0}$$
   $$\vert \mathbf{\vec b} \vert = \sqrt{(1)} = 1 \text{ unit length}$$

In generale:

$$\mathbf{\vec a} = <a_1, a_2, a_3>$$

Il vettore unitario di $$\mathbf{\vec a} = <a_1/\vert \mathbf{\vec a} \vert , a_2/\vert \mathbf{\vec a} \vert , a_3/\vert \mathbf{\vec a} \vert >$$

Figura (6): Vettore di unità uguale alla lunghezza di una unità del vettore.

1.2 Operazioni vettoriali

Operazione scalare di un vettore

L’operazione scalare di un vettore implica moltiplicare un vettore per un numero. Per esempio:

$$\mathbf{\vec a} = <4, 3, 0>$$
$$2* \mathbf{\vec a} = <24, 23, 2*0> $$
$$2*\mathbf{\vec a} = <8, 6, 0>$$

Figura (7): Operazione scalare di un vettore

In generale, dato un vettore $$\mathbf{\vec a} = <a_1, a_2, a_3>$$ e un numero reale $$t$$

$$t*\mathbf{\vec a} = < t* a_1, t* a_2, t* a_3 >$$

Somma vettoriale

La somma vettoriale coinvolge due vettori e ne crea un terzo. Sommiamo i vettori sommando i loro componenti.

Note
I vettori vengono sommati sommando i loro componenti.

Ad esempio, se abbiamo due vettori:

$$\mathbf{\vec a} = <1, 2, 0> $$
$$\mathbf{\vec b} = <4, 1, 3> $$
$$\mathbf{\vec a} = <+4, +1, 0>$$
$$\mathbf{\vec a}+\mathbf{\vec b} = <5, 3, 3>$$

Figura (8): Somma vettoriale.

In generale, la somma vettoriale dei due vettori a e b viene calcolata come segue:

$$\mathbf{\vec a} = <a_1, a_2, a_3>$$
$$\mathbf{\vec b} = <b_1, b_2, b_3>$$
$$\mathbf{\vec a}+\mathbf{\vec b} = <a_1+b_1, a_2+b_2, a_3+b_3>$$

La somma vettoriale è utile per trovare la direzione media di due o più vettori. In questo caso, usiamo di solito vettori della stessa lunghezza. Ecco un esempio che mostra la differenza fra usare vettori della stessa lunghezza e vettori di lunghezza diversa nella somma vettoriale che ne risulta:

Figura (9): Somma di vari vettori di lunghezza (a sinistra). Somma di vettori della stessa lunghezza (a destra) per ottenere la direzione media.

I vettori di input non sono probabilmente della stessa lunghezza. Per trovare la direzione media, occorre usare il vettore di unità dei vettori di input. Come menzionato in precedenza, il vettore di unità è un vettore con lunghezza pari a 1.

Sottrazione vettoriale

La sottrazione vettoriale coinvolge due vettori e ne crea un terzo. Sottraiamo due vettori sottraendo i componenti corrispondenti. Ad esempio, se abbiamo due vettori $$\mathbf{\vec a}$$ e $$\mathbf{\vec b}$$ e sottraiamo $$\mathbf{\vec b}$$ da $$\mathbf{\vec a}$$, allora:

$$\mathbf{\vec a} = <1, 2, 0> $$
$$\mathbf{\vec b} = <4, 1, 4> $$
$$\mathbf{\vec a}-\mathbf{\vec b} = <1-4, 2-1, 0-4>$$
$$\mathbf{\vec a}-\mathbf{\vec b} = <-3, 1, -4> = \mathbf{\mathbf{\vec b}a}$$

Se si sottrae $$\mathbf{\vec b}$$ da $$\mathbf{\vec a}$$, otteniamo un risultato diverso:

$$\mathbf{\vec b} - \mathbf{\vec a} = <4-1, 1-2, 4-0>$$
$$\mathbf{\vec b} - \mathbf{\vec a} = <3, -1, 4> = \mathbf{\mathbf{\vec a}b}$$

Nota: il vettore $$\mathbf{\vec b} - \mathbf{\vec a}$$ presenta la stessa lunghezza del vettore $$\mathbf{\vec a} - \mathbf{\vec b}$$, ma va nella direzione opposta.

Figura (10): Sottrazione del vettore.

In generale, se abbiamo due vettori, $$\mathbf{\vec a}$$ and $$\mathbf{\vec b}$$, then $$\mathbf{\vec a} - \mathbf{\vec b}$$ è un vettore che viene calcolato come segue:

$$\mathbf{\vec a} = <a_1, a_2, a_3>$$
$$\mathbf{\vec b} = <b_1, b_2, b_3>$$
$$\mathbf{\vec a}-\mathbf{\vec b} = <a_1 - b_1, a_2 - b_2, a_3 - b_3> = \mathbf{\mathbf{\vec b}a}$$

La sottrazione vettoriale è comunemente usata per trovare vettori fra punti. Per trovare un vettore che va dalla punta al vettore posizione $$\mathbf{\vec b}$$ alla punta del vettore posizione $$\mathbf{\vec a}$$, usiamo quindi la sottrazione $$(\mathbf{\vec a}-\mathbf{\vec b})$$ come mostrato nella figura (11).

Figura (11): Usare la sottrazione vettoriale per trovare un vettore fra due punti.

Proprietà vettoriali

I vettori presentano otto proprietà. Se a, b e c sono vettori ed s e t sono numeri, allora:

$$\mathbf{\vec a} + \mathbf{\vec b} = \mathbf{\vec b} + \mathbf{\vec a}$$
$$\mathbf{\vec a} + 0 = a$$
$$s * (\mathbf{\vec a} + \mathbf{\vec b}) = s * a + s * \mathbf{\vec b}$$
$$s * t * (\mathbf{\vec a}) = s * (t * \mathbf{\vec a})$$
$$\mathbf{\vec a} + (\mathbf{\vec b} + \mathbf{\vec c}) = (\mathbf{\vec a} + \mathbf{\vec b}) + \mathbf{\vec c}$$
$$\mathbf{\vec a} + (-\mathbf{\vec a}) = 0$$
$$(s + t) * \mathbf{\vec a} = s * \mathbf{\vec a} + t * \mathbf{\vec a}$$
$$1 * \mathbf{\vec a} = \mathbf{\vec a}$$

Prodotto scalare del vettore

Il prodotto scalare coinvolge due vettori e crea un numero. Ad esempio, se abbiamo due vettori a e b, allora:

$$\mathbf{\vec a} = <1, 2, 3> $$
$$\mathbf{\vec b} = <5, 6, 7>$$

Quindi, il prodotto scalare è la somma della moltiplicazione dei componenti, come segue:

$$\mathbf{\vec a} · \mathbf{\vec b} = 1 * 5 + 2 * 6 + 3 * 7$$
$$\mathbf{\vec a} · \mathbf{\vec b} = 38$$

In generale, dati due vettori a e b:

$$\mathbf{\vec a} = <a_1, a_2, a_3>$$
$$\mathbf{\vec b} = <b_1, b_2, b_3>$$
$$\mathbf{\vec a} · \mathbf{\vec b} = a_1 * b_1 + a_2 * b_2 + a_3 * b_3$$

Otteniamo sempre un numero positivo per il prodotto scalare fra due vettori quando vanno nella stessa direzione generale. Un prodotto scalare fra due vettori indica che i due vettori vanno nella direzione generale opposta.

Figura (12): Quando due vettori vanno nella stessa direzione (a sinistra), il risultato è un prodotto scalare positivo. Quando i due vettori vanno nella direzione opposta (a destra), il risultato è un prodotto scalare negativo.

Quando calcoliamo il prodotto scalare di due vettori di unità, il risultato è sempre compreso fra 1 e +1. Per esempio:

$$\mathbf{\vec a} = <1, 0, 0>$$
$$\mathbf{\vec b} = <0.6, 0.8, 0>$$
$$\mathbf{\vec a} · \mathbf{\vec b} = (1 * 0.6, 0 * 0.8, 0 * 0) = 0.6$$

Inoltre, il prodotto scalare di un vettore in sé è uguale alla lunghezza di tale vettore secondo il potere di due. Per esempio:

$$\mathbf{\vec a} = <0, 3, 4>$$
$$\mathbf{\vec a} · \mathbf{\vec a} = 0 * 0 + 3 * 3 + 4 * 4 $$
$$\mathbf{\vec a} · \mathbf{\vec a} = 25$$

Calcolare la lunghezza della radice quadrata di un vettore $$\mathbf{\vec a}$$ :

$$\vert \mathbf{\vec a} \vert = \sqrt{4^2 + 3^2 + 0^2}$$
$$\vert \mathbf{\vec a} \vert = 5$$
$$\vert \mathbf{\vec a} \vert 2 = 25$$

Prodotto scalare del vettore, lunghezze e angoli

Esiste un rapporto fra il prodotto scalare di due vettori e l’angolo fra di loro.

Note
Il prodotto scalare di due vettori di unità validi (diversi da zero) uguali al coseno dell’angolo fra di loro.

In generale:

$$\mathbf{\vec a} · \mathbf{\vec b} = \vert \mathbf{\vec a} \vert * \vert \mathbf{\vec b} \vert * cos(ө)$$ oppure
$$\mathbf{\vec a} · \mathbf{\vec b} / (\vert \mathbf{\vec a} \vert * \vert \mathbf{\vec b} \vert) = cos(ө)$$

Dove:

$$ө$$ è l’angolo incluso fra i vettori.

Se i vettori a e b sono vettori di unità, possiamo affermare che:

$$\mathbf{\vec a} · \mathbf{\vec b} = cos(ө)$$

E poiché il coseno di un angolo di 90 gradi è uguale a 0, possiamo affermare che:

Note
I vettori $$\vec a$$ and $$\vec b$$ sono ortogonali se, e solo se $$\vec{a} \cdot \vec{b} = 0$$.

Ad esempio, se calcoliamo il prodotto scalare di due vettori ortogonali, l’asse X e l’asse Y del sistema assoluto, il risultato sarà uguale a zero.

$$\mathbf{\vec x} = <1, 0, 0>$$
$$\mathbf{\vec y} = <0, 1, 0>$$
x · y = (1 * 0) + (0 * 1) + (0 * 0)
$$\mathbf{\vec x} · \mathbf{\vec y} = 0$$

Esiste inoltre un rapporto fra il prodotto scalare e la lunghezza della proiezione di un vettore su un altro. Per esempio:

$$\mathbf{\vec a} = <5, 2, 0>$$
$$\mathbf{\vec b} = <9, 0, 0>$$
$$unit(\mathbf{\vec b}) = <1, 0, 0>$$
$$\mathbf{\vec a} · unit(\mathbf{\vec b}) = (5 * 1) + (2 * 0) + (0 * 0) $$
$$\mathbf{\vec a} · unit(\mathbf{\vec b}) = 2 (\text{which is equal to the projection length of mathbf{\vec a} onto mathbf{\vec b}})$$

Figura (13): Il prodotto scalare è uguale alla lunghezza della proiezione di un vettore su un vettore di unità diverso da zero.

In generale, dato un vettore a e un vettore diverso da zero b, possiamo calcolare la lunghezza della proiezione pL del vettore a sul vettore b usando il prodotto scalare.

$$pL = \vert \mathbf{\vec a} \vert * cos(ө) $$
$$pL = \mathbf{\vec a} · unit(\mathbf{\vec b})$$

Proprietà del prodotto scalare

Se $$\mathbf{\vec a}$$, $$\mathbf{\vec b}$$ e $$\mathbf{\vec c}$$ sono vettori e s è un numero, allora:

$$\mathbf{\vec a} · \mathbf{\vec a} = \vert \mathbf{\vec a} \vert ^2$$
$$\mathbf{\vec a} · (\mathbf{\vec b} + \mathbf{\vec c}) = \mathbf{\vec a} · \mathbf{\vec b} + \mathbf{\vec a} · \mathbf{\vec c}$$
$$0 · \mathbf{\vec a} = 0$$
$$\mathbf{\vec a} · \mathbf{\vec b} = \mathbf{\vec b} · \mathbf{\vec a}$$
$$(s * \mathbf{\vec a}) · \mathbf{\vec b} = s * (\mathbf{\vec a} · \mathbf{\vec b}) = \mathbf{\vec a} · (s * \mathbf{\vec b})$$

Prodotto vettoriale

Il prodotto vettoriale coinvolge due vettori e ne crea un terzo che è ortogonale a entrambi.

Figura (14): Calcolare il prodotto vettoriale di due vettori.

Ad esempio, se abbiamo due vettori su un piano assoluto XY, il loro prodotto vettoriale è un vettore perpendicolare al piano XY, che va sia nella direzione positiva che negativa dell’asse Z. Per esempio:

$$\mathbf{\vec a} = <3, 1, 0>$$
$$\mathbf{\vec b} = <1, 2, 0>$$
$$\mathbf{\vec a} × \mathbf{\vec b} = < (1 * 0 – 0 * 2), (0 * 1 - 3 * 0), (3 * 2 - 1 * 1) > $$
$$\mathbf{\vec a} × \mathbf{\vec b} = <0, 0, 5>$$

Note
Il vettore $$\vec a \times \vec b$$ è ortogonale sia a $$\vec a$$ che a $$\vec b$$.

Probabilmente, non sarà necessario calcolare manualmente il prodotto vettoriale di due vettori, quindi è possibile ignorare questa sezione. Gli utenti interessati al calcolo del prodotto vettoriale possono continuare a leggere per un maggiore approfondimento. Il prodotto vettoriale $$a × b$$ viene definito usando determinanti. Ecco una semplice illustrazione su come calcolare un determinante usando i vettori di base standard:

$$ \color {red}{i} = <1, 0, 0>$$
$$ \color {blue}{j} = <0,1, 0>$$
$$ \color {green}{k} = <0, 0, 1>$$

Il prodotto vettoriale di due vettori $$\mathbf{\vec a} = <a1, a2, a3>$$ e $$\mathbf{\vec b} = <b1, b2, b3>$$ viene calcolato come segue usando il diagramma precedente:

$$\mathbf{\vec a} × \mathbf{\vec b} = \color {red}{i (a_2 * b_3)} + \color {blue}{ j (a_3 * b_1)} + \color {green}{k(a_1 * b_2)} - \color {green}{k (a_2 * b_1)} - \color {red}{i (a_3 * b_2)} -\color {blue}{ j (a_1 * b_3)}$$
$$\mathbf{\vec a} × \mathbf{\vec b} = \color {red}{i (a_2 * b_3 - a_3 * b_2)} + \color {blue}{j (a_3 * b_1 - a_1 * b_3)} +\color {green}{k (a_1 * b_2 - a_2 * b_1)}$$
$$\mathbf{\vec a} × \mathbf{\vec b} = <\color {red}{a_2 * b_3 – a_3 * b_2}, \color {blue}{a_3 * b_1 - a_1 * b_3}, \color {green}{a_1 * b_2 - a_2 * b_1} >$$

Prodotto vettoriale e angolo fra vettori

Esiste un rapporto fra l’angolo, fra i due vettori e la lunghezza del prodotto vettoriale. Quanto più piccolo è l’angolo (seno più piccolo), tanto minore sarà il prodotto vettoriale. L’ordine degli operandi è importante nel prodotto vettoriale. Per esempio:

$$\mathbf{\vec a} = <1, 0, 0>$$
$$\mathbf{\vec b} = <0, 1, 0>$$
$$\mathbf{\vec a} × \mathbf{\vec b} = <0, 0, 1>$$
$$\mathbf{\vec b} × \mathbf{\vec a} = <0, 0, -1>$$

Figura (15): Rapporto fra il seno dell'angolo tra i due vettori e lunghezza del prodotto vettoriale.

Nel sistema destrorso di Rhino, la direzione di $$\mathbf{\vec a} × \mathbf{\vec b}$$ è data dalla regola della mano destra (dove $$\mathbf{\vec a}$$ = dito indice, $$\mathbf{\vec b}$$ = dito medio e $$\mathbf{\vec a} × \mathbf{\vec b}$$ = pollice).

In generale, per qualsiasi paio di vettori 3D $$\mathbf{\vec a}$$ and $$\mathbf{\vec b}$$:

$$\vert \mathbf{\vec a} × \mathbf{\vec b} \vert = \vert \mathbf{\vec a} \vert \vert \mathbf{\vec b} \vert sin(ө)$$

Dove:

$$Ө$$ è l’angolo compreso tra i vettori posizione di $$\mathbf{\vec a}$$ and $$\mathbf{\vec b}$$

Se a e b sono vettori di unità, possiamo quindi affermare semplicemente che la lunghezza del loro prodotto vettoriale è uguale al seno dell’angolo fra di loro. In altre parole:

$$\vert \mathbf{\vec a} × \mathbf{\vec b} \vert = sin(ө)$$

Il prodotto vettoriale fra due vettori ci aiuta a determinare se due vettori sono paralleli. Ciò è dovuto al risultato che è sempre un vettore uguale a zero.

Note
I vettori $$\vec a$$ e $$\vec b$$ sono paralleli e se, e solo se, $$a \times b = 0$$.

Proprietà del prodotto vettoriale

Se $$\mathbf{\vec a}$$, $$\mathbf{\vec b}$$ e $$\mathbf{\vec c}$$ sono vettori e $$s$$ è un numero, allora:
$$\mathbf{\vec a} × \mathbf{\vec b} = -\mathbf{\vec b} × \mathbf{\vec a}$$
$$(s * \mathbf{\vec a}) × \mathbf{\vec b} = s * (\mathbf{\vec a} × \mathbf{\vec b}) = \mathbf{\vec a} × (s * \mathbf{\vec b})$$
$$\mathbf{\vec a} × (\mathbf{\vec b} + \mathbf{\vec c}) = \mathbf{\vec a} × \mathbf{\vec b} + \mathbf{\vec a} × \mathbf{\vec c}$$
$$(\mathbf{\vec a} + \mathbf{\vec b}) × \mathbf{\vec c} = \mathbf{\vec a} × \mathbf{\vec c} + \mathbf{\vec b} × \mathbf{\vec c}$$
$$\mathbf{\vec a} · (\mathbf{\vec b} × \mathbf{\vec c}) = (\mathbf{\vec a} × \mathbf{\vec b}) · \mathbf{\vec c}$$
$$\mathbf{\vec a} × (\mathbf{\vec b} × \mathbf{\vec c}) = (\mathbf{\vec a} · \mathbf{\vec c}) * \mathbf{\vec b} – (\mathbf{\vec a} · \mathbf{\vec b}) * \mathbf{\vec c}$$

1.3 Equazione vettoriale di una retta

L’equazione vettoriale di una retta è usata nelle applicazioni di modellazione 3D e computer grafica.

Figura (16): Equazione vettoriale di una retta.

Ad esempio, se conosciamo la direzione di una retta e di un punto su tale retta, allora possiamo trovare qualsiasi altro punto sulla retta usando i vettori, come di seguito:

$$\overline{L} = line$$
$$\mathbf{\vec v} = <a, b, c>$$ vettore unitario di direzione della retta
$$Q = (x_0, y_0, z_0)$$ punto di posizione della retta
$$P = (x, y, z)$$ qualsiasi punto sulla retta

Sappiamo che:

$$\mathbf{\vec a} = t *\mathbf{\vec v}$$ (2)
$$\mathbf{\vec p} = \mathbf{\vec q} + \mathbf{\vec a}$$ (1)

Da 1 e 2:

$$\mathbf{\vec p} = \mathbf{\vec q} + t * \mathbf{\vec v}$$ (3)

Tuttavia, possiamo scrivere (3) quanto segue:

$$<x, y, z> = <x_0, y_0, z_0> + <t * a, t * b, t * c>$$
$$<x, y, z> = <x_0 + t * a, y_0 + t * b, z_0 + t * c>$$

Quindi:

$$x = x_0 + t * a$$
$$y = y_0 + t * b$$
$$z = z_0 + t * c$$

Che equivale a:

$$P = Q + t * \mathbf{\vec v}$$
Note
Dato un punto $$Q$$ e una direzione $$\vec v$$ su una retta, qualsiasi punto $$P$$ sulla retta può essere calcolato usando l’equazione vettoriale di una retta $$P = Q + t * \vec v$$ where $$t$$ è un numero.

Un altro esempio comune è trovare un punto medio fra due punti. L’esempio seguente mostra come trovare il punto medio usando l’equazione vettoriale di una retta:

$$\mathbf{\vec q}$$ è il vettore posizione per il punto $$Q$$
$$\mathbf{\vec p}$$ è il vettore posizione per il punto $$P$$
$$\mathbf{\vec a}$$ è il vettore che va da $$Q \rightarrow P$$

Della sottrazione vettoriale, sappiamo che:

$$\mathbf{\vec a} = \mathbf{\vec p} - \mathbf{\vec q}$$

Dell’equazione della retta, sappiamo che:

$$M = Q + t * \mathbf{\vec a}$$

E visto che dobbiamo trovare un punto medio, allora:

$$t = 0.5$$

Possiamo quindi affermare che:

$$M = Q + 0.5 * \mathbf{\vec a}$$
Figura (17): Trovare il punto medio fra due punti di input.

In generale, è possibile trovare qualsiasi punto fra $$Q$$ e $$P$$ cambiando il valore $$t$$ fra 0 e 1 usando l’equazione generale:

$$M = Q + t * (P - Q)$$
Note
Dati due punti
$$Q$$ e $$P$$, qualsiasi punto $$M$$ fra due punti viene calcolato usando l’equazione $$M = Q + t * (P - Q)$$ dove t è un numero compreso fra 0 e 1.

1.4 Equazione vettoriale di un piano

Un modo per definire un piano è usare un punto e un vettore perpendicolare al piano. Il riferimento di tale vettore è di solito la normale al piano. La normale punta nella direzione al di sopra del piano.

Un esempio di come calcolare la normale a un piano è conoscere tre punti non lineari sul piano.

La figura (16) mostra quanto segue:

$$A$$ = il primo punto sul piano.
$$B$$ = il secondo punto sul piano.
$$C$$ = il terzo punto sul piano.

E:

$$\mathbf{\vec a} $$ = vettore posizione di un punto $$A$$
$$\mathbf{\vec b}$$ = vettore posizione di un punto $$B$$
$$\mathbf{\vec c}$$ = vettore posizione di un punto $$C$$

Possiamo trovare il vettore normale $$\mathbf{\vec n}$$ come segue:

$$\mathbf{\vec n} = (\mathbf{\vec b} - \mathbf{\vec a}) × (\mathbf{\vec c} - \mathbf{\vec a})$$
Figura (18): Vettori e piani

Possiamo anche derivare l’equazione scalare del piano usando il prodotto scalare:

$$\mathbf{\vec n} · (\mathbf{\vec b} - \mathbf{\vec a}) = 0$$

Se:

$$\mathbf{\vec n} = <a, b, c>$$
$$\mathbf{\vec b} = <x, y, z>$$
$$ \mathbf{\vec a} = <x_0, y_0, z_0>$$

Possiamo quindi ampliare quanto indicato precedentemente:

$$<a, b, c> · <x-x_0, y-y_0, z-z_0 > = 0$$

Risolvendo il prodotto scalare, otteniamo l’equazione scalare generale di un piano:

$$a * (x - x_0) + b * (y - y_0) + c * (z - z_0) = 0$$

1.5 Tutorial

Tutti i concetti spiegati in questo capitolo hanno applicazione diretta nella risoluzione dei comuni problemi di geometria riscontrati durante la modellazione. I seguenti tutorial spiegano passo a passo come usare i concetti appresi in Rhinoceros e Grasshopper (GH).

1.5.1 Direzione delle facce

Dato un punto e una superficie, come possiamo determinare se il punto è rivolto verso il lato anteriore o posteriore della superficie?

Input:

  1. Una superficie.
  2. Un punto.

Parametri:

La direzione è definita dalla direzione alla normale della superficie. Saranno necessarie le seguenti informazioni:

  • La direzione della normale al punto della superficie più vicino al punto di input.
  • La direzione vettoriale dal punto più vicino al punto di input.

Confronta le due direzioni indicate sopra, se vanno nella stessa direzione, il punto è rivolto verso il lato anteriore altrimenti è rivolto verso il lato posteriore.

Soluzione:

1. Trova la posizione del punto più vicino sulla superficie relativo al punto di input usando il componente Pull. In questo modo, troveremo la posizione uv del punto più vicino, utile per valutare la superficie e trovarne le direzioni alla normale.

2. Possiamo ora usare il punto più vicino per disegnare un vettore che va verso il punto di input. Possiamo anche disegnare quanto segue:

3. Possiamo confrontare i due vettori usando il prodotto scalare. Se il risultato è positivo, il punto è di fronte alla superficie. Se il risultato è negativo, il punto si trova dietro la superficie.

I passi sopra indicati possono anche essere eseguiti usando altri linguaggi di scripting. Usare il componente VB per Grasshopper:

Private Sub RunScript(ByVal pt As Point3d, ByVal srf As Surface, ByRef A As Object)

  'Declare variables
  Dim u, v As Double
  Dim closest_pt As Point3d

  'get closest point u, v
  srf.ClosestPoint(pt, u, v)

  'get closest point
  closest_pt = srf.PointAt(u, v)

  'calculate direction from closest point to test point
  Dim dir As New Vector3d(pt - closest_pt)

  'calculate surface normal
  Dim normal = srf.NormalAt(u, v)

  'compare the two directions using the dot product
  A = dir * normal
End Sub

Usare il componente Grasshopper Python con RhinoScriptSyntax:

import rhinoscriptsyntax as rs #import RhinoScript library

#find the closest point
u, v = rs.SurfaceClosestPoint(srf, pt)

#get closest point
closest_pt = rs.EvaluateSurface(srf, u, v)

#calculate direction from closest point to test point
dir = rs.PointCoordinates(pt) - closest_pt

#calculate surface normal
normal = rs.SurfaceNormal(srf, [u, v])

#compare the two directions using the dot product
A = dir * normal

Usare il componente Grasshopper Python solo con RhinoCommon:

#find the closest point
found, u, v = srf.ClosestPoint(pt)

if found:

    #get closest point
    closest_pt = srf.PointAt(u, v)

    #calculate direction from closest point to test point
    dir = pt - closest_pt

    #calculate surface normal
    normal = srf.NormalAt(u, v)

    #compare the two directions using the dot product
    A = dir * normal

Usare il componente C# per Grasshopper:

private void RunScript(Point3d pt, Surface srf, ref object A)
{
  //Declare variables
  double u, v;
  Point3d closest_pt;

  //get closest point u, v
  srf.ClosestPoint(pt, out u, out v);

  //get closest point
  closest_pt = srf.PointAt(u, v);

  //calculate direction from closest point to test point
  Vector3d dir = pt - closest_pt;

  //calculate surface normal
  Vector3d normal = srf.NormalAt(u, v);

  //compare the two directions using the dot product
  A = dir * normal;
}

1.5.2 Esplodere un parallelepipedo

Il seguente tutorial mostra come esplodere una polisuperficie. Il parallelepipedo esploso ha il seguente aspetto:

Input:

Identifica l’input che corrisponde a un parallelepipedo. Useremo il parametro Box in GH:

Parametri:

  • Considera tutti i parametri necessari per seguire questo tutorial.
  • Il centro dell’esplosione.
  • Le facce del parallelepipedo da esplodere.
  • La direzione verso cui si sposta ciascuna faccia.

Una volta identificati i parametri, si tratta di metterli insieme per trovare una soluzione in base a passi logici che conducono alla risposta.

Soluzione:

1. Trovare il centro del parallelepipedo usando il componente Box Properties in GH:

2. Estrarre le facce del parallelepipedo con il componente Deconstruct Brep:

3. La parte più difficile riguarda la direzione verso cui spostiamo le facce. Anzitutto, occorre trovare il centro di ciascuna faccia, quindi definire la direzione dal centro del parallelepipedo verso il centro di ciascuna faccia, come segue:

4. Una volta eseguito lo script per tutti i parametri, possiamo usare il componente Move per spostare le facce nella direzione appropriata. Assicurati di impostare i vettori sull’ampiezza desiderata.

I passi sopra indicati possono essere eseguiti usando scripting VB, C# o Python. Di seguito, la soluzione usando i tre linguaggi di scripting.

Usare il componente VB per Grasshopper:

Private Sub RunScript(ByVal box As Brep, ByVal dis As Double, ByRef A As Object)

    'get the brep center
    Dim area As Rhino.Geometry.AreaMassProperties
    area = Rhino.Geometry.AreaMassProperties.Compute(box)

    Dim box_center As Point3d
    box_center = area.Centroid

    'get a list of faces
    Dim faces As Rhino.Geometry.Collections.BrepFaceList = box.Faces

    'decalre variables
    Dim center As Point3d
    Dim dir As Vector3d
    Dim exploded_faces As New List( Of Rhino.Geometry.Brep )
    Dim i As Int32
    'loop through all faces

    For i = 0 To faces.Count() - 1
      'extract each of the face
      Dim extracted_face As Rhino.Geometry.Brep = box.Faces.ExtractFace(i)

      'get the center of each face
      area = Rhino.Geometry.AreaMassProperties.Compute(extracted_face)
      center = area.Centroid

      'calculate move direction (from box centroid to face center)
      dir = center - box_center
      dir.Unitize()
      dir *= dis

      'move the extracted face
      extracted_face.Transform(Transform.Translation(dir))

      'add to exploded_faces list
      exploded_faces.Add(extracted_face)
    Next

    'assign exploded list of faces to output
    A = exploded_faces
  End Sub

Usare il componente Grasshopper Python con RhinoCommon:

import Rhino

#get the brep center
area = Rhino.Geometry.AreaMassProperties.Compute(box)
box_center = area.Centroid

#get a list of faces
faces = box.Faces

#decalre variables
exploded_faces = []

#loop through all faces
for i, face in enumerate(faces):

	#get a duplicate of the face
	extracted_face = faces.ExtractFace(i)
	
	#get the center of each face
	area = Rhino.Geometry.AreaMassProperties.Compute(extracted_face)
	center = area.Centroid
	
	#calculate move direction (from box centroid to face center)
	dir = center - box_center
	dir.Unitize()
	dir *= dis
	
	#move the extracted face
	move = Rhino.Geometry.Transform.Translation(dir)
	extracted_face.Transform(move)
	
	#add to exploded_faces list
	exploded_faces.append(extracted_face)

#assign exploded list of faces to output
A = exploded_faces

Usare il componente C# per Grasshopper:

private void RunScript(Brep box, double dis, ref object A)
{

    //get the brep center
  Rhino.Geometry.AreaMassProperties area =        Rhino.Geometry.AreaMassProperties.Compute(box);
  Point3d box_center = area.Centroid;

  //get a list of faces
  Rhino.Geometry.Collections.BrepFaceList faces = box.Faces;

  //decalre variables
  Point3d center;   Vector3d dir;
  List<Rhino.Geometry.Brep> exploded_faces = new List<Rhino.Geometry.Brep>();

  //loop through all faces   for( int i = 0; i < faces.Count(); i++ )
  {
    //extract each of the face
    Rhino.Geometry.Brep extracted_face = box.Faces.ExtractFace(i);

    //get the center of each face
    area = Rhino.Geometry.AreaMassProperties.Compute(extracted_face);
    center = area.Centroid;

    //calculate move direction (from box centroid to face center)
    dir = center - box_center;
    dir.Unitize();
    dir *= dis;

    //move the extracted face
    extracted_face.Transform(Transform.Translation(dir));

    //add to exploded_faces list
    exploded_faces.Add(extracted_face);
  }

  //assign exploded list of faces to output
  A = exploded_faces;
}

1.5.3 Sfere tangenti

Questo tutorial mostra come creare due sfere tangenti fra due punti di input. Ecco come appare il risultato:

Input:
Due punti ( $$A$$ e $$B$$) nel sistema di coordinate 3D.

Parametri: Di seguito, un diagramma dei parametri necessari per risolvere il problema: $$A$$ punto tangente  $$D$$ fra le due sfere, nel parametro $$t$$ (0-1) tra i punti $$A$$ e  $$B$$.

  • Il centro della prima sfera o il punto medio  $$C1$$ fra $$A$$ e  $$D$$.
  • Il centro della seconda sfera o il punto medio  $$C2$$ fra $$D$$ e  $$B$$.
  • Il raggio della prima sfera $$(r1)$$ o la distanza fra $$A$$ e  $$C1$$.
  • Il raggio della seconda sfera $$(r2)$$ o la distanza fra  $$D$$ e  $$C2$$.

Soluzione:

1. Utilizzare il componente Expression per definire il punto $$D$$ fra $$A$$ e $$B$$ in un parametro $$t$$. L’espressione che useremo si basa sull’equazione vettoriale di una retta:

$$D = A + t*(B-A)$$

$$B-A$$ : è il vettore che va da $$B$$ a

$$A (\vec{BA}) usando l’operazione di sottrazione.

$$

t*(B-A) $$ : dove $$t

$$ è compreso fra 0 e 1 per ottenere una posizione sul vettore.

$$

A+t*(B-A)

$$ : ottiene un punto sul vettore A e B.

2. Usa il componente Expression per definire inoltre i punti medi $$

C1 $$ e $$C2

$$.

3. Il raggio della prima sfera $$

(r1) $$ e il raggio della seconda sfera $$(r2)

$$ possono essere calcolati usando il componente Distance.

4. Il passo finale implica la creazione della sfera da un piano di base e un raggio. Occorre assicurarsi che le origini siano collegate a $$

C1 $$ e $$C2 $$ e il raggio da $$r1 $$ e $$r2$$.

Usare il componente VB per Grasshopper:

Private Sub RunScript(ByVal A As Point3d, ByVal B As Point3d, ByVal t As Double, ByRef S1 As Object, ByRef S2 As Object)

  'declare variables
  Dim D, C1, C2 As Rhino.Geometry.Point3d
  Dim r1, r2 As Double

  'find a point between A and B
  D = A + t * (B - A)

  'find mid point between A and D
  C1 = A + 0.5 * (D - A)

  'find mid point between D and B
  C2 = D + 0.5 * (B - D)
  'find spheres radius
  r1 = A.DistanceTo(C1)
  r2 = B.DistanceTo(C2)

  'create spheres and assign to output
  S1 = New Rhino.Geometry.Sphere(C1, r1)
  S2 = New Rhino.Geometry.Sphere(C2, r2)

End Sub

Usare il componente Python:

import Rhino

#find a point between A and B
D = A + t * (B - A)

#find mid point between A and D
C1 = A + 0.5 * (D - A)

#find mid point between D and B
C2 = D + 0.5 * (B - D)

#find spheres radius
r1 = A.DistanceTo(C1)
r2 = B.DistanceTo(C2)

#create spheres and assign to output
S1 = Rhino.Geometry.Sphere(C1, r1)
S2 = Rhino.Geometry.Sphere(C2, r2)

Usare il componente C# per Grasshopper:

private void RunScript(Point3d A, Point3d B, double t, ref object S1, ref object S2)
{
  //declare variables
  Rhino.Geometry.Point3d D, C1, C2;
  double r1, r2;

  //find a point between A and B
  D = A + t * (B - A);

  //find mid point between A and D
  C1 = A + 0.5 * (D - A);

  //find mid point between D and B
  C2 = D + 0.5 * (B - D);

  //find spheres radius
  r1 = A.DistanceTo(C1);
  r2 = B.DistanceTo(C2);

  //create spheres and assign to output
  S1 = new Rhino.Geometry.Sphere(C1, r1);
  S2 = new Rhino.Geometry.Sphere(C2, r2);
}

Download dei file di esempio

Download del file math-samplesandtutorials.zip contenente tutti gli esempi di Grasshopper e i file del codice menzionati in questa guida.

Passi successivi

Ora che conosciamo la matematica vettoriale, possiamo dare un’occhiata alla guida Matrici e trasformazioni per ulteriori informazioni sugli oggetti da spostare, ruotare e scalare.