Nel comando path è prevista la possibilità di disegnare un arco di ellisse adottando la seguente sintassi:
a ra rb w fa fs xb yb
dove a o A è l'iniziale della parola
arco, [ra,rb] sono i semiassi maggiore e minore dell'ellisse, w è l' angolo di rotazione in gradi, fa e
fs sono due indici che possono valere solo 0 o 1 e che condizionano la scelta dell'ellisse per quanto concerne
la posizione del suo centro e la scelta di quale dei due archi disegnare per andare da un punto all'altro,
posti entrambi sull'ellisse. Infine
[ xb, yb ] rappresentano le coordinate relative o assolute del punto finale. Il punto iniziale si assume noto ( è dove è
arrivato a disegnare il pennino ideale che sta tracciando l'arco). Se si fosse usata una lettera maiuscola
ossia se si scrivesse A si intenderebbe che vanno usate coordinate assolute ossia nel sistema di
riferimento del disegno globale mentre se si usa una lettera minuscola ossia a si intende che si usano
coordinate relative al disegno dell'arco in corso e dunque, per definizione, il punto a cui è arrivato il pennino
è considerato l'origine delle coordinate ossia il punto [ 0,0 ]. Le coordinate relative sono molto
utili perchè permettono di spostare una linea complessa, fatta da molti archi o segmenti, con una sola
traslazione dell'inizio della curva. Viceversa le coordinate assolute sono più laboriose da riutilizzare
perché per ripetere la stessa curva in vari punti della tela occorre traslare materialmente ogni punto
di cui è fatta la curva specificata dal comando path ossia cambiare materialmente la coppia di
valori [ xb, yb]. Negli esempi che seguono si farà uso anche del comando:
m xb yb
che fa eseguire al pennino un movimento senza scrittura. La lettera "m" o "M" è l'iniziale di movimento
ed anche in questo caso la maiuscola indica coordinate assolute mentre la minuscola indica coordinate
relative al punto in cui il pennino è arrivato prima. Con [ xb, yb] si intendono le coordinate finali, relative
o assolute.
Si consideri questo primo esempio:
Il comando ha regole non immediatamente evidenti. Se disegno un arco di ellisse con
valori del semiasse maggiore e minore troppo piccoli rispetto alla distanza tra il punto iniziale e quello finale
allora l'arco viene scalato di dimensioni in modo che riesca sempre a congiungere il punto iniziale con quello
finale e per far questo la corda tra punto iniziale e punto finale deve passare per il centro dell'ellisse.
L'indice fa, il primo, in questo caso diventa ininfluente mentre conta sempre il secondo indice
ossia fs. Questo si spiega con il fatto che, se la corda ( ossia il segmento idealmente congiungente
il punto iniziale al punto finale ) basta appena a tagliare l'ellisse passando
per il suo centro, non esistono ambiguità tra le possibili ellissi tracciabili mentre se la corda non passa
per il centro dell'ellisse allora le ellissi con identico asse maggiore, asse minore e gradi di rotazione
sono due e va indicato quale delle due ellissi bisogna disegnare.
Se immaginiamo di spostare il pennino dal punto iniziale al punto finale allora fs=0 vorrà dire che
l'arco dell'ellisse sta alla destra della corda mentre fs=1 vuol dire che l'arco sta alla sinistra.
Il valore di fa influenza la lunghezza dell'arco. Se fa=0 si sceglie l'arco più breve
mentre con fa=1 si sceglie l'arco più lungo. Se la corda passa per il centro ovviamente il valore
di fa non produce cambiamenti perché i due archi sono di identica lunghezza ma naturalmente conta
solo il fatto che l'arco stia alla destra o alla sinistra della corda.
A maggior chiarimento si consideri ora questa situazione:
Quando gli assi maggiore e minore sono molto grandi rispetto alla lunghezza della corda ossia rispetto
alla distanza tra punto iniziale e punto finale, tutti e due gli indici svolgono un ruolo importante.
Qui appare evidente che l'indice fa influisce sulla lunghezza dell'arco mentre l'indice
in influisce sul lato rispetto alla corda che congiunge il punto iniziale a quello finale. Volendo realizzare una
curva convessa costituita da tanti archi non bisogna dunque mai cambiare
l'indice fs tra un arco e l'altro e
scegliere il cammino più diretto possibile e dunque scegliere sempre fa=0.
Arco di ellisse
Nel comando path l'arco viene attuato ponendo:
a rx ry w fa fs xb yb
Se la iniziale "a" è minuscola si usano coordinate relative ossia
il primo punto dell' arco è sempre nell'origine. Se viceversa
l'iniziale è "A" si usano coordinate assolute e il primo punto dell'arco
si trova dove inizialmente si trova il pennino che idealmente sta tracciando
la curva.
Diventa importante saper risolvere i problemi seguenti:
Dati: [ cx, cy,
rx, ry, w,
ta, tb ]
ed essendo dt = tb − ta
trovare: [ xa, ya,
rx, ry, w , fa,
fs, xb, yb
]
Il centro dell'ellisse è dato da [ cx, cy ]
mentre i suoi semiassi sono rx e ry ed ovviamente
il più grande dei due è il semiasse maggiore mentre se sono uguali
l'ellisse è un cerchio. L'angolo w indica la rotazione degli assi attorno al centro
dell'ellisse.
Con [ xa, ya ] si intendono le coordinate cartesiane
dell'inizio dell'arco mentre con [ xb, yb ] si intendono le
coordinate della fine dell'arco e dunque sono misurati in unità di lunghezza
ovvero pixel. Viceversa
ta, tb e w sono angoli e sono espressi
in gradi e frazioni di gradi.
Le formule da applicare sono:
xa = cx + cos(w)·rx·cos(ta) − sin(w)·ry·sin(ta) ya = cy + sin(w)·rx·cos(ta) + cos(w)·ry·sin(ta) xb = cx + cos(w)·rx·cos(tb) − sin(w)·ry·sin(tb) yb = cy + sin(w)·rx·cos(tb) + cos(w)·ry·sin(tb)
se | dt | = | tb − ta | > 180°
allora: fa = 1
se | dt | = | tb − ta | <= 180°
allora: fa = 0
se dt = tb − ta > 0
allora: fs = 1
se dt = tb − ta <= 0
allora: fs = 0
dove si è supposto che le funzioni trigonometriche richiedano angoli espressi
in gradi e frazioni di grado.
Dati: [ xa, ya,
rpx, rpy, w,
fa, fs,
xb, yb ]
trovare: [ cx, cy,
rx, ry, w,
ta, tb ]
Per ipotesi sono diversi da zero sia rpx che rpy. In ogni caso vanno usati i
loro valori assoluti e se almeno uno di essi è nullo si tracci un segmento
rettilineo dal punto iniziale [ xa, ya] al punto finale [xb, yb].
Notare che rpx ed rpy sono i semiassi maggiore e minore solo di tentativo
( e per questo sono indicati così e non come rx ed ry )
perché non è scontato che, dato il punto di partenza [ xa,ya ]
e il punto di arrivo [ xb, yb ], i due semiassi siano tali da
definire una ellisse sufficientemente grande per congiungere gli estremi
del segmanto. Se così non fosse gli assi vengono aumentati mantenendo però
invariato il loro rapporto.
L'equazione si semplifica scegliendo il punto medio [ xm, ym ] calcolato
usando le formule:
Per calcolare ta e tb definiamo una opportuna funzione che,
dato un arbitrario vettore u = [ ux, uy ] e
un secondo arbitrario vettore v = [ vx, vy ]
determina l'angolo tra tali vettori con la seguente formula:
Dati: [ cx, cy,
rx, ry, w ] trovare i fuochi ossia:
[ fx, fy,
gx, gy ]
Ovvero dato il centro dell'ellisse [ cx, cy ], i due semiassi
rx, ry e l'angolo di rotazione dell' ellisse w , trovare i fuochi.
Occorre ricordare che i fuochi dell'ellisse sono due e cadono sull'asse
maggiore. La somme delle distanze di ogni punto dell'ellisse dai fuochi
è una costante pari alla lunghezza dell'asse maggiore ossia la costante
vale 2·rx se
rx > ry altrimenti
2·ry.