A graphical interface for creating different types of 3D curves (Hermite, Bezier, Spline and BSpline). Written in Java with support of Java3D libraries, it enables the real-time manipulation of different parameters such as control points, the size of the curve, the style line etc...
La seconda guerra mondiale per licei e scuole medie
JCurves
1. Principi di Computer Graphics
Progetto JCurves
Prof. R. De Amicis, Prof. G. Conti
Manuel Borile - matr. 118179
Alida Palmisano - matr. 118198
18 luglio 2006
Sommario
Il progetto consiste in un’interfaccia grafica per la creazione di
diversi tipi di curve in 3D (Hermite, Bezier, Spline e BSpline). Il
programma permette, inoltre, la modifica in tempo reale di diversi
parametri come i punti di controllo, la grandezza della curva, lo stile
della linea, etc.
Il presente documento contiene la descrizione architetturale del
progetto, un piccolo manuale utente per l’utilizzo del software e una
spiegazione delle formule matematiche utilizzate per implementare le
funzionalit` di modifica dei diversi tipi di curva (riferirsi alla docu-
a
mentazione Javadoc per i dettagli specifici del codice).
Indice
1 Scopo del progetto 3
2 Caratteristiche tecniche e implementazione 5
2.1 Organizzazione delle classi . . . . . . . . . . . . . . . . . . . . 6
3 Manuale utente 10
3.1 Strumenti per la modifica del punto di vista . . . . . . . . . . 11
3.2 Caricamento / Salvataggio di curve . . . . . . . . . . . . . . . 11
3.3 Creazione di una nuova curva . . . . . . . . . . . . . . . . . . 12
3.4 Modifica/visualizzazione delle propriet` di una
a curva . . . . . 13
3.4.1 Creazione di una curva speculare . . . . . . . . . . . . 15
3.4.2 Riparametrizzazione di una curva . . . . . . . . . . . . 15
3.5 Funzionalit` generali . . . . . . . . . . . . . .
a . . . . . . . . . 16
4 Formule matematiche 17
4.1 Curve di Hermite . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2 Curve di Bezier . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3. 1 Scopo del progetto
Il progetto prevede la realizzazione di un software per la creazione e la ges-
tione di curve 3D. Il programma, scritto in Java, ha richiesto l’utilizzo delle
librerie Java3D. In particolare, le curve trattate sono dei seguenti tipi:
• curve interpolanti:
– Hermite: 2 punti + 2 derivate prime
3 punti
– Spline: 4 punti
5 punti
• curve approssimanti:
3 punti
– Bezier: 4 punti
5 punti
N = 4 K = 1, 2, 3, 4
– B-Spline: N = 5 K = 1, 2, 3, 4
N = 6 K = 1, 2, 3, 4
Le funzionalit` implementate per i vari tipi di curva sono le seguenti:
a
• troncamento (riparametrizzazione) della curva
• drag & drop: ` possibile selezionare una curva e crearne una sua copia
e
e/o trascinarla all’interno dello spazio 3D
• mirroring: dopo aver selezionato una curva, ` possibile posizionare/orien-
e
tare un piano di mirroring e creare, premendo l’opportuno bottone, la
specchiata della curva selezionata
• stretch: dopo aver selezionato una curva ` possibile visualizzarne il
e
bounding box, i cui vertici sono dragger selezionabili e permettono di
rimodellare la curva: in particolare, trascinandoli semplicemente nello
spazio 3D la curva verr` modificata di conseguenza e se durante il
a
trascinamento viene mantenuto premuto il tasto SHIFT, la curva sar` a
rimodellata in maniera proporzionale (altrimenti la curva pu` essere
o
rimodellata a piacere)
• cancellazione di una o pi` curve
u
• visualizzazione della derivata prima e seconda della curva selezionata
• modifica delle propriet` grafiche della curva selezionata: ` possibile,
a e
utilizzando gli appositi campi, modificare il nome, la grossezza della
linea, il suo colore e il suo stile (continuo, tratteggiato, tratto-punto,
punteggiato)
Manuel Borile & Alida Palmisano 3
4. • modifica delle propriet` geometriche della curva selezionata: ` possi-
a e
bile modificare i punti di controllo della curva semplicemente agendo
sui dragger ad essi associati e spostandoli nello spazio 3D (in tempo
reale si potr` osservare l’effetto dello spostamento del punto di control-
a
lo sulla forma della curva). Per le curve di tipo B-Spline ` possibile,
e
utilizzando un opportuno strumento, modificare il valore del parametro
K, cio` il grado della curva utilizzata per collegare i punti di controllo
e
(per i dettagli, si vedano spiegazioni successive) e i valori del parametro
t (cio` i nodi della curva)
e
• snap: attivando questa funzionalit`, tutti i movimenti nello spazio 3D
a
(spostamento di curve, punti di controllo, . . . ) avvengono utilizzando
un intervallo discreto fisso modificabile dall’utente
Le funzionalit` generiche implementate sono le seguenti:
a
• rotazione punto di vista: dopo aver cliccato il bottone opportuno, tenen-
do premuto il tasto sinistro ` possibile, trascinando il cursore, ruotare
e
il punto di vista, mentre tenendo premuto il tasto destro e trascinando
il cursore ` possibile spostare il punto di vista
e
• zoom: dopo aver cliccato il bottone opportuno, cliccando con il tasto
destro si esegue uno zoom positivo nella scena 3D, mentre cliccando il
tasto sinistro si esegue uno zoom negativo nella scena 3D
• salvataggio delle curve in file LaTeX: ` possibile salvare tutte le curve
e
create fino a quel momento in un file LaTeX il cui contenuto specifico
verr` analizzato in seguito
a
• salvataggio di una/pi` curve in file testuale: ` possibile salvare tutte
u e
le curve create fino a quel momento in un file .jctxt il cui contenuto
specifico verr` analizzato in seguito
a
Manuel Borile & Alida Palmisano 4
5. 2 Caratteristiche tecniche e implementazione
Come gi` accennato, il software ` scritto in Java con l’ausilio delle librerie
a e
Java3D. Sulla base delle funzionalit` da implementare, ` risultata opportuna
a e
la gestione dell’architettura attraverso quattro moduli distinti:
1. gui: contiene la classe per la creazione dell’interfaccia grafica e la ges-
tione degli eventi associati ai diversi bottoni/campi di testo/barre di
scorrimento/ . . .
2. java3dcurve: contiene tutte le classi che sono dedicate alla costruzione
grafica della curva, alla creazione dello spazio di lavoro 3D nel quale le
curve saranno visualizzate (albero di scena), alla gestione delle macro
funzionalit` dell’applicazione ed il behavior che gestisce gli eventi del
a
mouse nello spazio 3D
(a) dragger: (package contenuto nel modulo “java3dcurve”) contiene
le classi per la creazione dei diversi tipi di dragger disponibili
3. fileManagement: contiene le classi che gestiscono il salvataggio e il
caricamento delle curve da file
4. theory: contiene le classi che definiscono a livello matematico le varie
curve e le funzionalit` di mirroring e stretching delle stesse
a
Manuel Borile & Alida Palmisano 5
6. 2.1 Organizzazione delle classi
Verranno ora discusse nel dettaglio le classi implementate.
Il modulo gui contiene solo la classe MainFrame, il cui scopo ` la creazione
e
dell’interfaccia grafica dell’intero programma.
Il modulo java3dcurve contiene le classi AwtEventBehavior, Curve,
DrawingPlane, MirroringPlane, MyBoundingBox, Panel3d e il sotto-package
dragger.
• AwtEventBehavior: la classe ` l’estensione della superclasse “Behav-
e
ior”, presente nelle librerie Java3D. Il suo utilizzo ` necessario nella
e
gestione degli eventi di input da mouse o tastiera. Nello specifico, il
metodo “processStimulus()” si occupa di invocare le opportune fun-
zioni in seguito ad uno specifico evento. Questa operazione risulta
possibile sfruttando le funzionalit` di “Picking” delle librerie Java3D,
a
che permettono la selezione di un dato oggetto nello spazio: in base al
tipo dell’oggetto “pickato” (dragger o curve) e al tipo di movimento in-
dividuato (traslazione o rotazione) la funzione richiamer` l’esecuzione
a
“matematica” delle opportune azioni (per esempio stretching o scaling
della curva, o spostamento dei suoi punti di controllo, . . . )
• Curve: la classe ` la naturale trasposizione in codice di una curva para-
e
metrica. In particolare questa classe definisce tutti i tipi di attributi
che caratterizzano univocamente una curva presente nel piano di lavoro.
Essendo inoltre un’estensione della classe BranchGroup, essa conterr` a
anche una serie di particolari figli (anch’essi BranchGroup) che ne iden-
tificano, per esempio, i punti di controllo, il bounding box, le derivate
prima e seconda, ecc..
Nello specifico i principali campi contenuti sono i seguenti:
– nome curva
– tipo curva
– numero dei punti di controllo
– coordinate dei punti di controllo
– valori di N e K (utilizzati solo per le curve di tipo B-Spline)
– valori dei coefficienti algebrici per l’equazione parametrica della
curva
– la geometria della curva (utilizzata dalle librerie di Java3D per la
visualizzazione della curva)
– risoluzione (quantit` di punti nei quali la curva viene calcolata)
a
– grossezza linea, colore linea, tipo di linea (tratteggiata/continua/ecc..)
Manuel Borile & Alida Palmisano 6
7. • DrawingPlane: la classe si occupa della creazione dello spazio di lavoro,
cio` i piani lungo gli assi x, y, z che aiutano l’utente a posizionare gli
e
oggetti nello spazio 3D
• MirroringPlane: la classe si occupa della creazione del piano di mir-
roring che potr` essere utilizzato per creare una copia “specchiata”
a
della curva stessa
• MyBoundingBox: la classe, partendo da un parametro di tipo “Shape3D”,
definisce in modo univoco i vertici del bounding box che contiene la
curva e procede alla creazione visiva della struttura tridimensionale
• Panel3d: la classe ` il ponte fra l’interfaccia grafica e l’esecuzione “ma-
e
a `
teriale” delle varie funzionalit`. E questa classe che crea l’albero di
scena e che gestisce le macro funzionalit`, richiamando poi il metodo
a
specifico della classe opportuna
• package dragger: contiene le classi Dragger, Plane, RotableDragger,
StretchDragger
– Plane: definisce un semplice piano che viene utilizzato nella fase
di picking per permettere il movimento “fluido” dei vari dragger
a partire dalla posizione 2D del puntatore del mouse
– Dragger: definisce un semplice dragger 3D, che permette cio` lo
e
spostamento lungo i 3 assi ortogonali
– RotableDragger: definisce un dragger, che oltre alle funzionalit` a
della classe Dragger, permette la rotazione rispetto ai tre assi
– StretchDragger: definisce un dragger dalle caratteristiche simili
alla classe Dragger, ma che contiene anche dei particolari attributi
necessari alla gestione delle funzionalit` di stretching e scaling
a
Il modulo fileManagement contiene le seguenti classi:
• Saving: la classe gestisce la funzionalit` di salvataggio su file delle
a
curve create nello spazio di lavoro.
In particolare vengono gestiti 3 tipi di salvataggio:
1. salvataggio di una specifica curva in un file di testo (con estensione
di default .jctxt)
2. salvataggio di tutte le curve visualizzate in un file di testo
3. salvataggio di tutte le curve visualizzate in un file LaTeX
La prima e la seconda tipologia differiscono unicamente per il numero
di curve eventualmente salvate. Lo scopo di entrambe le tipologie ` e
quello di creare una stampa “letterale” della situazione presente nello
spazio di visualizzazione delle curve.
Manuel Borile & Alida Palmisano 7
8. Il formato del file di testo (che pu` contenere i dati di una o pi` curve)
o u
` il seguente:
e
nome della curva
tipologia
valori di N e K (per le BSpline)
risoluzione
numero dei punti di controllo
coordinate dei vari punti di controllo
La terza tipologia di salvataggio prevede un maggior dettaglio nella
rappresentazione delle varie curve salvate: in particolare per ogni curva
verranno salvati i campi visti precedentemente (cio` i dati che deter-
e
minano la costruzione matematica della curva) ed una parte generale,
con considerazioni aritmetiche sul particolare tipo di curva in esame.
Il formato del file pdf (derivante dalla compilazione del file LaTeX
creato al momento del salvataggio) ` il seguente:
e
nome
tipologia
valori di N e K (per le BSpline)
numero dei punti di controllo
coordinate dei punti di controllo
espressione parametrica della curva
valori dei coefficienti algebrici (per le BSpline invece si
indicano i valori delle funzioni Ni,k )
considerazioni generali sul tipo di curva
matrice di supporto per il calcolo dei coefficienti
matrice inversa
espressione parametrica generale
indicazione dei range di valori ammessi
• Loading: la classe permette il ripristino di una situazione di lavoro
precedentemente salvata in un file testo dalla tipologia 1 e 2. Attraverso
il parsing del vari attributi, un metodo della classe procede con la
costruzione delle varie curve nello spazio di lavoro 3D.
Il modulo theory contiene le classi MathCurves, Mirroring e MyStretching.
• MathCurves: la classe contiene tutto ci` che riguarda la teoria delle
o
curve. Per esempio contiene un metodo che permette il calcolo dei
coefficienti algebrici delle curve a partire dai punti di controllo, o un
suo metodo che permette la riparametrizzazione della curva, o una
funzione che permette il calcolo delle derivate prima e seconda nei vari
punti della curva, . . .
• Mirroring: la classe gestisce la funzionalit` di mirroring. La moti-
a
vazione per la quale ` stata inserita nel package “theory” ` proprio
e e
Manuel Borile & Alida Palmisano 8
9. perch` sfrutta le formule matematiche del piano e della curva su cui
e
applicare il mirroring. Una funzione di questa classe crea l’equazione
di un piano passante per tre punti nello spazio ed un’altra sua funzione
riesce a riflettere uno specifico punto rispetto al piano precedentemente
calcolato.
• MyStretching: la classe gestisce la funzionalit` di stretching ed ` stata
a e
inclusa nel package “theory” per lo stesso motivo illustrato per la classe
“Mirroring”. In questo caso si sfruttano le coordinate del bounding
box e attraverso la risoluzione di un sistema di equazioni, ` possibile
e
definire una funzione che trasforma le coordinate dei punti di controllo
in nuove coordinate che definiscono la curva deformata dall’operazione
di stretching.
Manuel Borile & Alida Palmisano 9
10. 3 Manuale utente
L’ambiente di lavoro del programma si presenta come in figura 1 (utilizzare
preferibilmente la risoluzione dello schermo 1024 x 768 o risoluzioni superiori)
Figura 1: Interfaccia grafica del programma
Il pannello centrale contiene l’area di lavoro 3D in cui vengono visualiz-
zate le curve.
Il pannello a sinistra contiene gli strumenti per la modifica del punto di
vista (vedi sezione 3.1)
I pannelli a destra contengono le informazioni sulle curve presenti nell’area
di lavoro e permettono di modificare le informazioni di una curva selezionata
(vedi sezione 3.4)
Il pannello in alto contiene i bottoni per la gestione di caricamento-
salvataggio delle curve (vedi sezione 3.2), i bottoni per la creazione di diversi
tipi di curve (vedi sezione 3.3) e i bottoni per la gestione di altre funzionalit`
a
generali del programma (vedi sezione 3.5)
Manuel Borile & Alida Palmisano 10
11. 3.1 Strumenti per la modifica del punto di vista
rotazione del punto di vista: cliccando questo bottone e spo-
standosi nell’area di lavoro si pu` osservare che il puntatore ha
o
modificato la sua forma. Tenendo premuto il tasto sinistro del
mouse e trascinando il cursore si osserver` una rotazione del
a
punto di vista rispetto al centro dei 3 piani. Tenendo, invece,
premuto il tasto destro del mouse e trascinando il cursore, si
osserver` una traslazione del punto di vista
a
zoom: cliccando questo bottone e spostandosi nell’area di la-
voro si pu` osservare che il puntatore ha modificato la sua
o
forma. Cliccando con il tasto sinistro del mouse si effettuer`
a
uno zoom positivo della scena 3D, mentre cliccando con il
tasto destro del mouse si effettuer` uno zoom negativo della
a
scena 3D
selezione: cliccando questo bottone e spostandosi nell’area di
lavoro si pu` osservare che il puntatore torner` ad assumere la
o a
classica forma a freccia che consente di selezionare e muovere
i vari oggetti presenti nella scena 3D
annulla movimenti: cliccando questo bottone ` possibile
e
ristabilire la posizione iniziale del punto di vista
3.2 Caricamento / Salvataggio di curve
carica curve da file testuale: cliccando questo bottone si
aprir` la classica finestra di caricamento file, da cui ` possibile
a e
selezionare, all’interno del proprio hard-disk, un file di testo
con il particolare formato illustrato in una delle sezioni prece-
denti. Se il file contiene le informazioni corrette, nell’ambiente
di lavoro verranno visualizzate le curve 3D salvate al suo inter-
no (ovviamente sar` poi possibile modificarle dinamicamente
a
come spiegato nella sezione 3.4)
salva la curva selezionata in file testuale: cliccando questo
bottone, se nell’ambiente di lavoro ` stata selezionata una cur-
e
va particolare, questa potr` essere salvata in un file testuale
a
utilizzando la classica finestra di salvataggio file (ovviamente
` necessario assegnare un nome al file e, in via opzionale,
e
un’estensione: se non specificata, l’estensione di default ` e
“.jctxt”)
Manuel Borile & Alida Palmisano 11
12. salva tutte le curve in file testuale: questo bottone si compor-
ta in modo analogo al bottone per il “salvataggio singolo” ma
permette all’utente di salvare tutte le curve correntemente
presenti nell’ambiente di lavoro
salva tutte le curve in file LaTeX: cliccando questo bottone
verranno salvate in un file LaTeX (il cui contenuto specifi-
co ` illustrato in una delle sezioni precedenti) tutte le curve
e
correntemente presenti nell’ambiente di lavoro con le relative
informazioni matematiche sulla loro costruzione. Cliccando
questo bottone si potr` creare il file LaTeX utilizzando la
a
classica finestra di salvataggio file (ovviamente ` necessario
e
assegnare un nome al file e, in via opzionale, un’estensione:
se non specificata, l’estensione di default ` “.tex”): compilan-
e
do poi il file salvato ` possibile ottenere un file in formato pdf
e
che contiene tutte le informazioni sulle curve disegnate nella
scena 3D
3.3 Creazione di una nuova curva
Per creare una nuova curva seguire i passi illustati in figura 2
Figura 2: Creazione di una nuova curva
1. cliccare il bottone associato al tipo di curva che si desidera creare (nota:
per la creazione delle curve di tipo B-Spline selezionare i valori di N e K
desiderati utilizzando le opportune barre di scorrimento); nello spazio
3D verranno visualizzati un numero di dragger 3D pari al numero di
punti di controllo della curva desiderata
Manuel Borile & Alida Palmisano 12
13. 2. muovere i punti di controllo fino a quando non hanno raggiunto la
posizione desiderata: per muoverli ` sufficiente trascinarli con il mouse
e
nelle 3 dimensioni utilizzando l’opportuna “maniglia” del dragger
3. quando i punti di controllo si trovano nella posizione desiderata premere
il bottone “Draw” in modo da creare la geometria che definisce la curva
voluta
4. all’interno dell’ambiente di lavoro sar` visualizzata la curva creata
a
5. ed essa verr` aggiunta alla lista di tutte le curve presenti: successiva-
a
mente, selezionando da questa lista una specifica curva, sar` possibile
a
modificarne le propriet` (vedi sezione 3.4)
a
3.4 Modifica/visualizzazione delle propriet` di una cur-
a
va
Selezionando una curva dall’elenco di tutte le curve presenti e attivando il
pannello “Modify” si presenter` la situazione della figura 3
a
Figura 3: Modifica delle propriet` di una curva
a
1. ` possibile, in maniera dinamica, modificare il nome della curva (scriven-
e
do il nuovo nome nel campo di testo e premendo il tasto INVIO), la
grossezza della linea (agendo sull’opportuna barra), il colore della curva
(agendo sul valore di rosso, verde e blu con le barre associate (i valori
variano da 0 a 255)), e lo stile della linea (selezionando uno dei 4 stili
presenti)
Manuel Borile & Alida Palmisano 13
14. 2. la lista dei punti di controllo contiene i valori delle coordinate tridimen-
sionali dei punti di controllo della curva selezionata
3. ` possibile, agendo sulla barra della risoluzione, modificare il numero di
e
punti in cui viene valutata la curva per essere disegnata: una risoluzione
bassa comporta un disegno della curva molto “segmentata”
4. utilizzando questo bottone ` possibile visualizzare/nascondere i dragger
e
associati ai punti di controllo della curva (da notare che la posizione
di questi dragger ` modificabile anche dopo la creazione della curva e
e
il loro movimento comporter` la modifica dinamica della forma della
a
curva)
5. utilizzando il pannello “B-Spline”, se la curva selezionata ` di tipo B-
e
Spline, ` possibile modificare il parametro K della curva e anche il suo
e
paramatro t
Utilizzando i bottoni opportuni, ` possibile visualizzare i valori delle
e
derivate prima e seconda della curva selezionata (es. figura 4)
Figura 4: Derivate prima e seconda
Visualizzando, infine, il bounding-box della curva ` possibile agire sui
e
dragger che sono posizionati sui suoi vertici in modo da modificare liber-
amente la forma della curva (vedi figura 5). Trascinando semplicemente i
dragger, la curva verr` deformata liberamente lungo la direzione seleziona-
a
ta: premendo il tasto SHIFT prima del trascinamento (e mantenendolo pre-
muto) la deformazione della curva sar` proporzionale (si effettuer`, quindi,
a a
un’operazione di scaling).
Figura 5: Stretching di una curva
Manuel Borile & Alida Palmisano 14
15. 3.4.1 Creazione di una curva speculare
Per creare una curva che sia la speculare di una data curva seguire i passi
illustrati in figura 6
Figura 6: Creare una curva speculare
1. selezionare la curva di partenza e andare nel pannello “Modify”
2. cliccare il bottone “Mirroring plane”: al centro del piano di lavoro
compararir` un piano con un dragger
a
3. modificare la posizione del piano utilizzando il dragger: per traslarlo
utilizzare le maniglie cilindriche e per ruotarlo agire sulle sfere ai loro
estremi
4. quando il piano ` posizionato nel punto desiderato premere il bottone
e
“Apply mirroring”
5. e apparir` una nuova curva che ` la speculare della curva di partenza
a e
3.4.2 Riparametrizzazione di una curva
Per riparametrizzare una curva seguire i passi illustrati in figura 7
Figura 7: Riparametrizzazione di una curva
Manuel Borile & Alida Palmisano 15
16. 1. selezionare la curva di partenza e andare nel pannello “Modify”
2. cliccare il bottone “Riparametrize”
3. cliccare due volte sulla curva, posizionando cos` i punti che si desidera
ı
siano l’inizio e la fine della riparametrizzazione
4. cliccando il bottone “Apply riparam.” la curva verr` troncata nei punti
a
selezionati e verranno ricaricati i valori dei nuovi punti di controllo della
curva tagliata
3.5 Funzionalit` generali
a
Altre funzionalit` implementate sono:
a
spostamento di una curva: selezionando una curva dall’elenco
di tutte le curve create, si visualizzer` attorno alla curva il
a
suo bounding-box. A quel punto cliccando sulla curva stessa
e mantenendo premuto il tasto sinistro del mouse, ` possibile
e
trascinare a piacere l’intera curva nello spazio 3D
spostamento discreto: cliccando questo bottone si attiver` la a
modalit` di spostamento discreto che permette di spostare gli
a
elementi nella scena 3D (dragger, curve, punti di controllo,
. . . ) di intervalli discreti (il valore di questi intervalli discreti
` personalizzabile dall’utente agendo sull’opportuna barra di
e
scorrimento nel pannello “Modify”)
creazione di una copia della curva: cliccando questo bottone
si creer` una copia della curva selezionata (ovviamente questa
a
nuova curva sar` modificabile in modo analogo a tutte le altre
a
curve e in modo indipendente dalla curva iniziale da cui ` stata
e
creata)
cancellazione di una curva: cliccando questo bottone si elim-
iner` la curva correntemente selezionata. Prima di elim-
a
inare la curva, il programma chiede all’utente la conferma
dell’operazione.
informazioni sul programma: cliccando questo bottone verr`
a
visualizzata la classica finestra “About...” contenente le
informazioni generali sul software
Manuel Borile & Alida Palmisano 16
17. 4 Formule matematiche
In generale, le curve parametriche trattate possono essere espresse tramite
una delle seguenti formule:
curva di 2◦ grado: p(u) = au2 + bu + c
curva di 3◦ grado: p(u) = au3 + bu2 + cu + d
curva di 4◦ grado: p(u) = au4 + bu3 + cu2 + du + e
dove:
• u ` il parametro che, solitamente, varia nell’intervallo [0, 1]
e
• a, b, c, d, e sono coefficienti algebrici e, per le curve 3D, sono della
i
ax
forma a = ay
az
Vediamo ora nel dettaglio i diversi tipi di curve implementate.
4.1 Curve di Hermite
Coefficienti geometrici: p0 , p1 , p0 , p1
F1 (u) = 2u3 − 3u2 + 1
F2 (u) = −2u3 + 3u2
Funzioni di miscelamento:
F3 (u) = u3 − 2u2 + u
F4 (u) = u3 − u2
Forma geometrica: p(u) = F1 (u)p0 + F2 (u)p1 + F3 (u)p0 + F4 (u)p1
Forma matriciale:
0 0 0 1 a p0
1 1 1 1 p1
b
0 0 1 0
=
c p0
3 2 1 0 d p1
a 2 −2 1 1 p0
b −3 3 −2 −1 p1
=
c 0 0 1 0 p0
d 1 0 0 0 p1
Formule per la riparametrizzazione:
coefficienti geometrici curva iniziale (parametro u):
p i , pj , pi , pj
Manuel Borile & Alida Palmisano 17
18. coefficienti geometrici della curva riparametrizzata (parametro v):
qi = p i
qj = p j
qi , qj , qi , qj dove: uj −ui
qi = vj −vi pi
q = uj −ui p
j vj −vi j
4.2 Curve di Bezier
Espressione parametrica generale:
n
p(u) = pi Bi,n (u) con u ∈ [0, 1]
i=0
dove:
• n = il grado del polinomio
• pi = gli (n+1) punti di controllo
• Bi,n (u) = le funzioni di miscelamento date dai polinomi di Bernstein
Bi,n (u) = C(n, i)ui (1 − u)n−i
n!
C(n, i) =
i!(n − i)!
4.2.1 Bezier 3 punti
3 punti di controllo → n = 2
Forma geometrica: p(u) = (1 − u)2 p0 + 2u(1 − u)p1 + u2 p2
Forma matriciale coefficienti geometrici/algebrici:
0 0 1 a p0
0 1 1 b = p1
2
1 1 1 c p2
a 1 −2 1 p0
b = −2 2 0 p1
c 1 0 0 p2
Formule per la riparametrizzazione:
1 0 0
1 1 1
Forma matriciale: p(u) = F P dove F = 4 2 4
0 0 1
Manuel Borile & Alida Palmisano 18
19. e P ` il vettore dei coefficienti geometrici della curva iniziale (con parametro
e
che varia tra 0 e 1).
I coefficienti geometrici della curva riparametrizzata (q0 , q1 , q2 ) si ricavano
dalla seguente operazione:
1 0 0 p(u0 ) q0
− 1 2 − 1 ∗ p(u 1 ) = q1
2 2 2
0 0 1 p(u1 ) q2
4.2.2 Bezier 4 punti
4 punti di controllo → n = 3
Forma geometrica: p(u) = (1 − u)3 p0 + 3u(1 − u)2 p1 + 3u2 (1 − u)p2 + u3 p3
Forma matriciale coefficienti geometrici/algebrici:
0 0 0 1 a p0
0 0 1 1 b p1
3
0 1 2 1 c = p2
3 3
1 1 1 1 d p3
a −1 3 −3 1 p0
b 3 −6 3 0 p1
=
c −3 3 0 0 p2
d 1 0 0 0 p3
Formule per la riparametrizzazione:
1 0 0 0
8 4 2 1
Forma matriciale: p(u) = F P dove F = 27 9 9 27
1 2 4 8
27 9 9 27
0 0 0 1
e P ` il vettore dei coefficienti geometrici della curva iniziale (con parametro
e
che varia tra 0 e 1).
I coefficienti geometrici della curva riparametrizzata (q0 , q1 , q2 , q3 ) si rica-
vano dalla seguente operazione:
p(u0 )
1 0 0 0 q0
− 5 3 − 3 1 p(u 1 ) q1
16 2 3 ∗ 3 =
3
− 3 3 − 5 p(u 2 )
2 6
q2
3
0 0 0 1 p(u1 ) q3
Manuel Borile & Alida Palmisano 19
20. 4.2.3 Bezier 5 punti
5 punti di controllo → n = 4
Forma geometrica:
p(u) = (1 − u)4 p0 + 4u(1 − u)3 p1 + 6u2 (1 − u)2 p2 + 4u3 (1 − u)p3 + u4 p4
Forma matriciale coefficienti geometrici/algebrici:
0 0 0 0 1 a p0
0 0 0 1 1 b p1
4
0 0 5 1 1 c = p2
3 2
0 1 1 3 1 d p3
4 2 4
1 1 1 1 1 e p4
a 1 −4 6 −4 1 p0
b
−4 12 −12 4 0 p1
c =
6 −12 6 0 0 p2
d −4 4 0 0 0 p3
e 1 0 0 0 0 p4
Formule per la riparametrizzazione:
1 0 0 0 0
81 27 27 3 1
256 64 128 64 256
1 1 3 1 1
Forma matriciale: p(u) = F P dove F =
16 4 8 4 16
1 3 27 27 81
256 64 128 64 256
0 0 0 0 1
e P ` il vettore dei coefficienti geometrici della curva iniziale (con parametro
e
che varia tra 0 e 1).
I coefficienti geometrici della curva riparametrizzata (q0 , q1 , q2 , q3 , q4 ) si
ricavano dalla seguente operazione:
p(u0 )
1 0 0 0 0 q0
− 13 4 −3 4 − 1 p(u 4 ) q1
1
13 12 3 4
181 − 32 20 − 32 18 ∗ p(u 1 ) = q2
9 3 9
13
2
4
−
4 3
−3 4 − 13 p(u 3 ) q3
12 4
0 0 0 0 1 p(u1 ) q4
Manuel Borile & Alida Palmisano 20
21. 4.3 Curve Spline
Le curve di tipo Spline interpolano tutti i punti di controllo della curva.
4.3.1 Spline 3 punti
3 punti di controllo → grado della curva interpolante = 2
Forma matriciale coefficienti geometrici/algebrici:
0 0 1 a p0
1 1 1 b = p1
4 2
1 1 1 c p2
a 2 −4 2 p0
b = −3 4 −1 p1
c 1 0 0 p2
Formule per la riparametrizzazione:
coefficienti geometrici della curva riparametrizzata
q0 = p(u0 )
q0 , q1 , q2 dove: q1 = p(u 1 )
2
q2 = p(u1 )
4.3.2 Spline 4 punti
4 punti di controllo → grado della curva interpolante = 3
Forma matriciale coefficienti geometrici/algebrici:
0 0 0 1 a p0
1 1 1 1 b p1
27 9 2 3 =
8 4 1 c p2
27 9 3
1 1 1 1 d p3
a −4.5 13.5 −13.5 4.5 p0
b 9
= −22.5 18 −4.5
p1
c −5.5 9 −4.5 1 p2
d 1 0 0 0 p3
Formule per la riparametrizzazione:
coefficienti geometrici della curva riparametrizzata
q0 = p(u0 )
q = p(u 1 )
1
q0 , q1 , q2 , q3 dove: 3
q2 = p(u 2 )
3
q3 = p(u1 )
Manuel Borile & Alida Palmisano 21
22. 4.3.3 Spline 5 punti
5 punti di controllo → grado della curva interpolante = 4
Forma matriciale coefficienti geometrici/algebrici:
0 0 0 0 1 a
1 1 1 1 p0
256 64 16 4 1 p1
b
1 1 1 1
16 27 4 2 1 c = p2
8
81 9 3
1 d
256 64 16 4 p3
1 1 1 1 1 e
32 −128 −128 32
a 3 3
64 3 3
p0
−80 224
b
3
96 −128 3
−16 p1
−208 −112
70
22
c =
3 3
76 3 3
p2
−25
16
d
3
16 −12 3
−1 p3
e 1 0 0 0 0 p4
Formule per la riparametrizzazione:
coefficienti geometrici della curva riparametrizzata
q0 = p(u0 )
q1 = p(u 1 )
4
q0 , q1 , q2 , q3 , q4 dove: q2 = p(u 1 )
2
q3 = p(u 3 )
q = p(u 4)
4 1
4.4 B-Spline
n
p(u) = pj Nj,k (u)
j=0
(u−ti )Ni,k−1 (u) (ti+1 −u)Ni+1,k−1 (u) 1 if ti ≤ u < ti+1
Ni,k (u) = ti+k−1 −ti
+ ti+k −ti+1
Ni,1 (u) =
0 o.w.
dove:
0 if i < k
• ti sono i nodi caso “non periodico” ti = i − k + 1 if k ≤ i ≤ n
n − k + 2 if i > n
• 0≤i≤n+k
• tk−1 ≤ u ≤ tn+1
0
• sia consideri che 0
=0
Manuel Borile & Alida Palmisano 22
23. 4.5 Stretching di una curva
La funzionalit` di stretching consiste nella possibilit` di deformare la curva
a a
nelle tre dimensioni.
Per calcolare i nuovi punti di controllo della curva modificata, vengono
utilizzate le coordinate dei vertici della bounding box: sulla base di questi
punti costruiamo una matrice di trasformazione che consente l’aggiornamento
delle coordinate dei punti di controllo e di conseguenza la creazione della
nuova curva.
Per fare questo sono necessarie 6 coordinate: 3 che identificano i vertici
della bounding box prima della modifica e altri 3 che identificano gli stessi
vertici dopo la deformazione.
Sebbene lo spazio di lavoro sia in 3D, scegliendo opportunamente i ver-
tici dal gruppo di 8 punti, riusciamo a ridurre il problema in 2D, facendo
comunque attenzione al tipo di coordinate che devono essere inserite nella
matrice.
Per esempio:
dati 3 vertici q1, q2, q3 appartenenti alla bounding box di partenza
dati 3 vertici r1, r2, r3 appartenenti alla bounding box deformata
se il movimento a cui si ` fatto riferimento durante l’operazione di stretching
e
va ad agire sull’asse x, il sistema da risolvere sar` cosi composto:
a
a11 a12 a1 0 0 0 q1x q2x q3x 0 0 0 r1x
a11 a12 a1 0 0 0 q1y q2y q3y 0 0 0
r2x
a11 a12 a1 0 0 0 1 1 1 0 0 0 r3x
=
0 0 0 a21 a22 a2 0 0 0 q1x q2x q3x r1y
0 0 0 a21 a22 a2 0 0 0 q1y q2y q3y r2y
0 0 0 a21 a22 a2 0 0 0 1 1 1 r3y
Risolvendolo, si otterranno i valori di a11 , a12 , a21 , a22 , a1 , a2 che possono
essere scritti in forma matriciale nel seguente modo:
a11 a12 a1
A= a=
a21 a22 a2
A questo punto le coordinate dei nuovi punti di controllo (p ) della curva
deformata possono essere messi in relazione ai punti di controllo di partenza
(p) attraverso la seguente formula:
p = Ap + a
Naturalmente, nel caso in cui l’operazione di stretching avesse interessato
l’asse z, non avremmo dovuto estrarre le coordinate x e y dei punti, bens` le
ı
coordinate y e z.
Manuel Borile & Alida Palmisano 23
24. 4.5.1 Scaling di una curva
La propriet` da garantire in questo caso ` la deformazione uniforme della
a e
curva, ossia una deformazione che mantenga le proporzioni fra i punti che la
compongono. La strategia adottata ` stata quella di eseguire due azioni di
e
stretching in sequenza, legando di volta in volta due coordinate rispetto al
particolare risultato che si vuole ottenere dalla scalatura.
Per esempio, supponiamo di voler ingrandire la curva lungo l’asse x: per
mantenere le proporzioni vogliamo che la curva cresca anche in altezza (lungo
l’asse y). Definiamo quindi un delta che rappresenta lo spostamento lungo
l’asse delle ascisse ed eseguiamo un’azione di stretching che allunghi la cur-
va: a questo punto eseguiamo nuovamente lo stretching, imponendo per` o
un movimento che alzi la curva lungo l’asse y dello stesso delta definito in
precedenza.
4.6 Mirroring di una curva rispetto ad un piano
Per eseguire il mirroring di una curva rispetto ad un piano ` necessario creare
e
un piano nello spazio (orientabile a piacimento) e selezionare la curva di
partenza: il risultato da ottenere ` il disegno di una nuova curva, identica a
e
quella di partenza, ma con le coordinate specchiate rispetto al piano.
Per fare questo sono state utilizzate alcune formule matematiche ed, in
particolare, sono necessari l’equazione aritmetica del piano (equazione che
deve corrispondere all’orientamento della geometria posta nello spazio 3D)
e un metodo che permettesse di trovare le coordinate speculari rispetto al
piano di un dato punto di partenza.
Per trovare l’equazione aritmetica del piano ` stata utilizzata la formula
e
per il calcolo di un piano passante per tre punti dati.
Dati R, S, T (punti con coordinate note),
dalla definizione dell’equazione del piano ax+by+cz+d = 0
i coefficienti sono calcolabili attraverso i seguenti determinanti:
Ry Rz 1 Rz Rx 1 Rx Ry 1
a= Sy S z 1 b= Sz Sx 1 c= S x Sy 1
Ty Sz 1 Tz Tx 1 Tx Ty 1
d = −(aRx + bRy + cRz )
Infine, per trovare le coordinate speculari rispetto al piano di un dato punto
di partenza ` stato adottato il seguente procedimento:
e
a
data l’equazione del piano ax + by + cz + d = 0 e definendo n = b
c
dato un punto P con vettore posizione p, il suo punto speculare rispetto al
piano ` Q, con vettore posizione q calcolabile nel seguente modo:
e
−2(n • p + d)
q = p + λn con λ =
n•n
Manuel Borile & Alida Palmisano 24