JCurves

24
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` a di modifica dei diversi tipi di curva (riferirsi alla docu- 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` a di una curva ..... 13 3.4.1 Creazione di una curva speculare ............ 15 3.4.2 Riparametrizzazione di una curva ............ 15 3.5 Funzionalit` a generali ....................... 16 4 Formule matematiche 17 4.1 Curve di Hermite ......................... 17 4.2 Curve di Bezier .......................... 18

description

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...

Transcript of JCurves

Page 1: JCurves

Principi di Computer GraphicsProgetto JCurves

Prof. R. De Amicis, Prof. G. Conti

Manuel Borile - matr. 118179Alida Palmisano - matr. 118198

18 luglio 2006

Sommario

Il progetto consiste in un’interfaccia grafica per la creazione didiversi tipi di curve in 3D (Hermite, Bezier, Spline e BSpline). Ilprogramma permette, inoltre, la modifica in tempo reale di diversiparametri come i punti di controllo, la grandezza della curva, lo stiledella linea, etc.

Il presente documento contiene la descrizione architetturale delprogetto, un piccolo manuale utente per l’utilizzo del software e unaspiegazione delle formule matematiche utilizzate per implementare lefunzionalita di modifica dei diversi tipi di curva (riferirsi alla docu-mentazione Javadoc per i dettagli specifici del codice).

Indice

1 Scopo del progetto 3

2 Caratteristiche tecniche e implementazione 52.1 Organizzazione delle classi . . . . . . . . . . . . . . . . . . . . 6

3 Manuale utente 103.1 Strumenti per la modifica del punto di vista . . . . . . . . . . 113.2 Caricamento / Salvataggio di curve . . . . . . . . . . . . . . . 113.3 Creazione di una nuova curva . . . . . . . . . . . . . . . . . . 123.4 Modifica/visualizzazione delle proprieta di una curva . . . . . 13

3.4.1 Creazione di una curva speculare . . . . . . . . . . . . 153.4.2 Riparametrizzazione di una curva . . . . . . . . . . . . 15

3.5 Funzionalita generali . . . . . . . . . . . . . . . . . . . . . . . 16

4 Formule matematiche 174.1 Curve di Hermite . . . . . . . . . . . . . . . . . . . . . . . . . 174.2 Curve di Bezier . . . . . . . . . . . . . . . . . . . . . . . . . . 18

Page 2: JCurves

4.2.1 Bezier 3 punti . . . . . . . . . . . . . . . . . . . . . . . 184.2.2 Bezier 4 punti . . . . . . . . . . . . . . . . . . . . . . . 194.2.3 Bezier 5 punti . . . . . . . . . . . . . . . . . . . . . . . 20

4.3 Curve Spline . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.3.1 Spline 3 punti . . . . . . . . . . . . . . . . . . . . . . . 214.3.2 Spline 4 punti . . . . . . . . . . . . . . . . . . . . . . . 214.3.3 Spline 5 punti . . . . . . . . . . . . . . . . . . . . . . . 22

4.4 B-Spline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.5 Stretching di una curva . . . . . . . . . . . . . . . . . . . . . . 23

4.5.1 Scaling di una curva . . . . . . . . . . . . . . . . . . . 244.6 Mirroring di una curva rispetto ad un piano . . . . . . . . . . 24

Manuel Borile & Alida Palmisano 2

Page 3: JCurves

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 dellelibrerie Java3D. In particolare, le curve trattate sono dei seguenti tipi:

• curve interpolanti:

– Hermite: 2 punti + 2 derivate prime

– Spline:

3 punti4 punti5 punti

• curve approssimanti:

– Bezier:

3 punti4 punti5 punti

– B-Spline:

N = 4 K = 1, 2, 3, 4N = 5 K = 1, 2, 3, 4N = 6 K = 1, 2, 3, 4

Le funzionalita implementate per i vari tipi di curva sono le seguenti:

• troncamento (riparametrizzazione) della curva

• drag & drop: e possibile selezionare una curva e crearne una sua copiae/o trascinarla all’interno dello spazio 3D

• mirroring: dopo aver selezionato una curva, e possibile posizionare/orien-tare un piano di mirroring e creare, premendo l’opportuno bottone, laspecchiata della curva selezionata

• stretch: dopo aver selezionato una curva e possibile visualizzarne ilbounding box, i cui vertici sono dragger selezionabili e permettono dirimodellare la curva: in particolare, trascinandoli semplicemente nellospazio 3D la curva verra modificata di conseguenza e se durante iltrascinamento viene mantenuto premuto il tasto SHIFT, la curva sararimodellata in maniera proporzionale (altrimenti la curva puo essererimodellata a piacere)

• cancellazione di una o piu curve

• visualizzazione della derivata prima e seconda della curva selezionata

• modifica delle proprieta grafiche della curva selezionata: e possibile,utilizzando gli appositi campi, modificare il nome, la grossezza dellalinea, il suo colore e il suo stile (continuo, tratteggiato, tratto-punto,punteggiato)

Manuel Borile & Alida Palmisano 3

Page 4: JCurves

• modifica delle proprieta geometriche della curva selezionata: e possi-bile modificare i punti di controllo della curva semplicemente agendosui dragger ad essi associati e spostandoli nello spazio 3D (in temporeale si potra osservare l’effetto dello spostamento del punto di control-lo sulla forma della curva). Per le curve di tipo B-Spline e possibile,utilizzando un opportuno strumento, modificare il valore del parametroK, cioe il grado della curva utilizzata per collegare i punti di controllo(per i dettagli, si vedano spiegazioni successive) e i valori del parametrot (cioe i nodi della curva)

• snap: attivando questa funzionalita, tutti i movimenti nello spazio 3D(spostamento di curve, punti di controllo, . . . ) avvengono utilizzandoun intervallo discreto fisso modificabile dall’utente

Le funzionalita generiche implementate sono le seguenti:

• rotazione punto di vista: dopo aver cliccato il bottone opportuno, tenen-do premuto il tasto sinistro e possibile, trascinando il cursore, ruotareil punto di vista, mentre tenendo premuto il tasto destro e trascinandoil cursore e possibile spostare il punto di vista

• zoom: dopo aver cliccato il bottone opportuno, cliccando con il tastodestro si esegue uno zoom positivo nella scena 3D, mentre cliccando iltasto sinistro si esegue uno zoom negativo nella scena 3D

• salvataggio delle curve in file LaTeX: e possibile salvare tutte le curvecreate fino a quel momento in un file LaTeX il cui contenuto specificoverra analizzato in seguito

• salvataggio di una/piu curve in file testuale: e possibile salvare tuttele curve create fino a quel momento in un file .jctxt il cui contenutospecifico verra analizzato in seguito

Manuel Borile & Alida Palmisano 4

Page 5: JCurves

2 Caratteristiche tecniche e implementazione

Come gia accennato, il software e scritto in Java con l’ausilio delle librerieJava3D. Sulla base delle funzionalita da implementare, e risultata opportunala 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 discorrimento/ . . .

2. java3dcurve: contiene tutte le classi che sono dedicate alla costruzionegrafica della curva, alla creazione dello spazio di lavoro 3D nel quale lecurve saranno visualizzate (albero di scena), alla gestione delle macrofunzionalita dell’applicazione ed il behavior che gestisce gli eventi delmouse nello spazio 3D

(a) dragger: (package contenuto nel modulo “java3dcurve”) contienele classi per la creazione dei diversi tipi di dragger disponibili

3. fileManagement: contiene le classi che gestiscono il salvataggio e ilcaricamento delle curve da file

4. theory: contiene le classi che definiscono a livello matematico le variecurve e le funzionalita di mirroring e stretching delle stesse

Manuel Borile & Alida Palmisano 5

Page 6: JCurves

2.1 Organizzazione delle classi

Verranno ora discusse nel dettaglio le classi implementate.

Il modulo gui contiene solo la classe MainFrame, il cui scopo e la creazionedell’interfaccia grafica dell’intero programma.

Il modulo java3dcurve contiene le classi AwtEventBehavior, Curve,DrawingPlane, MirroringPlane, MyBoundingBox, Panel3d e il sotto-packagedragger.

• AwtEventBehavior: la classe e l’estensione della superclasse “Behav-ior”, presente nelle librerie Java3D. Il suo utilizzo e necessario nellagestione degli eventi di input da mouse o tastiera. Nello specifico, ilmetodo “processStimulus()” si occupa di invocare le opportune fun-zioni in seguito ad uno specifico evento. Questa operazione risultapossibile sfruttando le funzionalita di “Picking” delle librerie Java3D,che permettono la selezione di un dato oggetto nello spazio: in base altipo dell’oggetto “pickato” (dragger o curve) e al tipo di movimento in-dividuato (traslazione o rotazione) la funzione richiamera l’esecuzione“matematica” delle opportune azioni (per esempio stretching o scalingdella curva, o spostamento dei suoi punti di controllo, . . . )

• Curve: la classe e la naturale trasposizione in codice di una curva para-metrica. In particolare questa classe definisce tutti i tipi di attributiche caratterizzano univocamente una curva presente nel piano di lavoro.Essendo inoltre un’estensione della classe BranchGroup, essa conterraanche una serie di particolari figli (anch’essi BranchGroup) che ne iden-tificano, per esempio, i punti di controllo, il bounding box, le derivateprima 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 dellacurva

– la geometria della curva (utilizzata dalle librerie di Java3D per lavisualizzazione della curva)

– risoluzione (quantita di punti nei quali la curva viene calcolata)

– grossezza linea, colore linea, tipo di linea (tratteggiata/continua/ecc..)

Manuel Borile & Alida Palmisano 6

Page 7: JCurves

• DrawingPlane: la classe si occupa della creazione dello spazio di lavoro,cioe i piani lungo gli assi x, y, z che aiutano l’utente a posizionare glioggetti nello spazio 3D

• MirroringPlane: la classe si occupa della creazione del piano di mir-roring che potra essere utilizzato per creare una copia “specchiata”della curva stessa

• MyBoundingBox: la classe, partendo da un parametro di tipo “Shape3D”,definisce in modo univoco i vertici del bounding box che contiene lacurva e procede alla creazione visiva della struttura tridimensionale

• Panel3d: la classe e il ponte fra l’interfaccia grafica e l’esecuzione “ma-teriale” delle varie funzionalita. E questa classe che crea l’albero discena e che gestisce le macro funzionalita, richiamando poi il metodospecifico della classe opportuna

• package dragger: contiene le classi Dragger, Plane, RotableDragger,StretchDragger

– Plane: definisce un semplice piano che viene utilizzato nella fasedi picking per permettere il movimento “fluido” dei vari draggera partire dalla posizione 2D del puntatore del mouse

– Dragger: definisce un semplice dragger 3D, che permette cioe lospostamento lungo i 3 assi ortogonali

– RotableDragger: definisce un dragger, che oltre alle funzionalitadella classe Dragger, permette la rotazione rispetto ai tre assi

– StretchDragger: definisce un dragger dalle caratteristiche similialla classe Dragger, ma che contiene anche dei particolari attributinecessari alla gestione delle funzionalita di stretching e scaling

Il modulo fileManagement contiene le seguenti classi:

• Saving: la classe gestisce la funzionalita di salvataggio su file dellecurve 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 estensionedi 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 numerodi curve eventualmente salvate. Lo scopo di entrambe le tipologie equello di creare una stampa “letterale” della situazione presente nellospazio di visualizzazione delle curve.

Manuel Borile & Alida Palmisano 7

Page 8: JCurves

Il formato del file di testo (che puo contenere i dati di una o piu curve)e il seguente:

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 nellarappresentazione delle varie curve salvate: in particolare per ogni curvaverranno salvati i campi visti precedentemente (cioe i dati che deter-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 LaTeXcreato al momento del salvataggio) e il seguente:

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 curvamatrice 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 lavoroprecedentemente salvata in un file testo dalla tipologia 1 e 2. Attraversoil parsing del vari attributi, un metodo della classe procede con lacostruzione delle varie curve nello spazio di lavoro 3D.

Il modulo theory contiene le classi MathCurves, Mirroring e MyStretching.

• MathCurves: la classe contiene tutto cio che riguarda la teoria dellecurve. Per esempio contiene un metodo che permette il calcolo deicoefficienti algebrici delle curve a partire dai punti di controllo, o unsuo metodo che permette la riparametrizzazione della curva, o unafunzione che permette il calcolo delle derivate prima e seconda nei varipunti della curva, . . .

• Mirroring: la classe gestisce la funzionalita di mirroring. La moti-vazione per la quale e stata inserita nel package “theory” e proprio

Manuel Borile & Alida Palmisano 8

Page 9: JCurves

perche sfrutta le formule matematiche del piano e della curva su cuiapplicare il mirroring. Una funzione di questa classe crea l’equazionedi un piano passante per tre punti nello spazio ed un’altra sua funzioneriesce a riflettere uno specifico punto rispetto al piano precedentementecalcolato.

• MyStretching: la classe gestisce la funzionalita di stretching ed e statainclusa nel package “theory” per lo stesso motivo illustrato per la classe“Mirroring”. In questo caso si sfruttano le coordinate del boundingbox e attraverso la risoluzione di un sistema di equazioni, e possibiledefinire una funzione che trasforma le coordinate dei punti di controlloin nuove coordinate che definiscono la curva deformata dall’operazionedi stretching.

Manuel Borile & Alida Palmisano 9

Page 10: JCurves

3 Manuale utente

L’ambiente di lavoro del programma si presenta come in figura 1 (utilizzarepreferibilmente 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 divista (vedi sezione 3.1)

I pannelli a destra contengono le informazioni sulle curve presenti nell’areadi 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 diversitipi di curve (vedi sezione 3.3) e i bottoni per la gestione di altre funzionalitagenerali del programma (vedi sezione 3.5)

Manuel Borile & Alida Palmisano 10

Page 11: JCurves

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 puo osservare che il puntatore hamodificato la sua forma. Tenendo premuto il tasto sinistro delmouse e trascinando il cursore si osservera una rotazione delpunto di vista rispetto al centro dei 3 piani. Tenendo, invece,premuto il tasto destro del mouse e trascinando il cursore, siosservera una traslazione del punto di vista

zoom: cliccando questo bottone e spostandosi nell’area di la-voro si puo osservare che il puntatore ha modificato la suaforma. Cliccando con il tasto sinistro del mouse si effettuerauno zoom positivo della scena 3D, mentre cliccando con iltasto destro del mouse si effettuera uno zoom negativo dellascena 3D

selezione: cliccando questo bottone e spostandosi nell’area dilavoro si puo osservare che il puntatore tornera ad assumere laclassica forma a freccia che consente di selezionare e muoverei vari oggetti presenti nella scena 3D

annulla movimenti: cliccando questo bottone e possibileristabilire la posizione iniziale del punto di vista

3.2 Caricamento / Salvataggio di curve

carica curve da file testuale: cliccando questo bottone siaprira la classica finestra di caricamento file, da cui e possibileselezionare, all’interno del proprio hard-disk, un file di testocon il particolare formato illustrato in una delle sezioni prece-denti. Se il file contiene le informazioni corrette, nell’ambientedi lavoro verranno visualizzate le curve 3D salvate al suo inter-no (ovviamente sara poi possibile modificarle dinamicamentecome spiegato nella sezione 3.4)

salva la curva selezionata in file testuale: cliccando questobottone, se nell’ambiente di lavoro e stata selezionata una cur-va particolare, questa potra essere salvata in un file testualeutilizzando la classica finestra di salvataggio file (ovviamentee necessario assegnare un nome al file e, in via opzionale,un’estensione: se non specificata, l’estensione di default e“.jctxt”)

Manuel Borile & Alida Palmisano 11

Page 12: JCurves

salva tutte le curve in file testuale: questo bottone si compor-ta in modo analogo al bottone per il “salvataggio singolo” mapermette all’utente di salvare tutte le curve correntementepresenti nell’ambiente di lavoro

salva tutte le curve in file LaTeX: cliccando questo bottoneverranno salvate in un file LaTeX (il cui contenuto specifi-co e illustrato in una delle sezioni precedenti) tutte le curvecorrentemente presenti nell’ambiente di lavoro con le relativeinformazioni matematiche sulla loro costruzione. Cliccandoquesto bottone si potra creare il file LaTeX utilizzando laclassica finestra di salvataggio file (ovviamente e necessarioassegnare un nome al file e, in via opzionale, un’estensione:se non specificata, l’estensione di default e “.tex”): compilan-do poi il file salvato e possibile ottenere un file in formato pdfche contiene tutte le informazioni sulle curve disegnate nellascena 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 Kdesiderati utilizzando le opportune barre di scorrimento); nello spazio3D verranno visualizzati un numero di dragger 3D pari al numero dipunti di controllo della curva desiderata

Manuel Borile & Alida Palmisano 12

Page 13: JCurves

2. muovere i punti di controllo fino a quando non hanno raggiunto laposizione desiderata: per muoverli e sufficiente trascinarli con il mousenelle 3 dimensioni utilizzando l’opportuna “maniglia” del dragger

3. quando i punti di controllo si trovano nella posizione desiderata premereil bottone “Draw” in modo da creare la geometria che definisce la curvavoluta

4. all’interno dell’ambiente di lavoro sara visualizzata la curva creata

5. ed essa verra aggiunta alla lista di tutte le curve presenti: successiva-mente, selezionando da questa lista una specifica curva, sara possibilemodificarne le proprieta (vedi sezione 3.4)

3.4 Modifica/visualizzazione delle proprieta di una cur-va

Selezionando una curva dall’elenco di tutte le curve presenti e attivando ilpannello “Modify” si presentera la situazione della figura 3

Figura 3: Modifica delle proprieta di una curva

1. e possibile, in maniera dinamica, modificare il nome della curva (scriven-do il nuovo nome nel campo di testo e premendo il tasto INVIO), lagrossezza della linea (agendo sull’opportuna barra), il colore della curva(agendo sul valore di rosso, verde e blu con le barre associate (i valorivariano da 0 a 255)), e lo stile della linea (selezionando uno dei 4 stilipresenti)

Manuel Borile & Alida Palmisano 13

Page 14: JCurves

2. la lista dei punti di controllo contiene i valori delle coordinate tridimen-sionali dei punti di controllo della curva selezionata

3. e possibile, agendo sulla barra della risoluzione, modificare il numero dipunti in cui viene valutata la curva per essere disegnata: una risoluzionebassa comporta un disegno della curva molto “segmentata”

4. utilizzando questo bottone e possibile visualizzare/nascondere i draggerassociati ai punti di controllo della curva (da notare che la posizionedi questi dragger e modificabile anche dopo la creazione della curva eil loro movimento comportera la modifica dinamica della forma dellacurva)

5. utilizzando il pannello “B-Spline”, se la curva selezionata e di tipo B-Spline, e possibile modificare il parametro K della curva e anche il suoparamatro t

Utilizzando i bottoni opportuni, e possibile visualizzare i valori dellederivate prima e seconda della curva selezionata (es. figura 4)

Figura 4: Derivate prima e seconda

Visualizzando, infine, il bounding-box della curva e possibile agire suidragger che sono posizionati sui suoi vertici in modo da modificare liber-amente la forma della curva (vedi figura 5). Trascinando semplicemente idragger, la curva verra deformata liberamente lungo la direzione seleziona-ta: premendo il tasto SHIFT prima del trascinamento (e mantenendolo pre-muto) la deformazione della curva sara proporzionale (si effettuera, quindi,un’operazione di scaling).

Figura 5: Stretching di una curva

Manuel Borile & Alida Palmisano 14

Page 15: JCurves

3.4.1 Creazione di una curva speculare

Per creare una curva che sia la speculare di una data curva seguire i passiillustrati 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 lavorocompararira un piano con un dragger

3. modificare la posizione del piano utilizzando il dragger: per traslarloutilizzare le maniglie cilindriche e per ruotarlo agire sulle sfere ai loroestremi

4. quando il piano e posizionato nel punto desiderato premere il bottone“Apply mirroring”

5. e apparira una nuova curva che e la speculare della curva di partenza

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

Page 16: JCurves

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 desiderasiano l’inizio e la fine della riparametrizzazione

4. cliccando il bottone “Apply riparam.” la curva verra troncata nei puntiselezionati e verranno ricaricati i valori dei nuovi punti di controllo dellacurva tagliata

3.5 Funzionalita generali

Altre funzionalita implementate sono:

spostamento di una curva: selezionando una curva dall’elencodi tutte le curve create, si visualizzera attorno alla curva ilsuo bounding-box. A quel punto cliccando sulla curva stessae mantenendo premuto il tasto sinistro del mouse, e possibiletrascinare a piacere l’intera curva nello spazio 3D

spostamento discreto: cliccando questo bottone si attivera lamodalita di spostamento discreto che permette di spostare glielementi nella scena 3D (dragger, curve, punti di controllo,. . . ) di intervalli discreti (il valore di questi intervalli discretie personalizzabile dall’utente agendo sull’opportuna barra discorrimento nel pannello “Modify”)

creazione di una copia della curva: cliccando questo bottonesi creera una copia della curva selezionata (ovviamente questanuova curva sara modificabile in modo analogo a tutte le altrecurve e in modo indipendente dalla curva iniziale da cui e statacreata)

cancellazione di una curva: cliccando questo bottone si elim-inera la curva correntemente selezionata. Prima di elim-inare la curva, il programma chiede all’utente la confermadell’operazione.

informazioni sul programma: cliccando questo bottone verravisualizzata la classica finestra “About...” contenente leinformazioni generali sul software

Manuel Borile & Alida Palmisano 16

Page 17: JCurves

4 Formule matematiche

In generale, le curve parametriche trattate possono essere espresse tramiteuna delle seguenti formule:

curva di 2◦ grado: p(u) = au2 + bu + ccurva di 3◦ grado: p(u) = au3 + bu2 + cu + dcurva di 4◦ grado: p(u) = au4 + bu3 + cu2 + du + e

dove:

• u e il parametro che, solitamente, varia nell’intervallo [0, 1]

• a, b, c, d, e sono i coefficienti algebrici e, per le curve 3D, sono della

forma a =

ax

ay

az

Vediamo ora nel dettaglio i diversi tipi di curve implementate.

4.1 Curve di Hermite

Coefficienti geometrici: p0, p1, p′0, p

′1

Funzioni di miscelamento:

F1(u) = 2u3 − 3u2 + 1F2(u) = −2u3 + 3u2

F3(u) = u3 − 2u2 + uF4(u) = u3 − u2

Forma geometrica: p(u) = F1(u)p0 + F2(u)p1 + F3(u)p′0 + F4(u)p

′1

Forma matriciale:0 0 0 11 1 1 10 0 1 03 2 1 0

abcd

=

p0

p1

p′0

p′1

abcd

=

2 −2 1 1−3 3 −2 −10 0 1 01 0 0 0

p0

p1

p′0

p′1

Formule per la riparametrizzazione:

coefficienti geometrici curva iniziale (parametro u):pi, pj, p

′i, p

′j

Manuel Borile & Alida Palmisano 17

Page 18: JCurves

coefficienti geometrici della curva riparametrizzata (parametro v):

qi, qj, q′i, q

′j dove:

qi = pi

qj = pj

q′i =

uj−ui

vj−vip′i

q′j =

uj−ui

vj−vip′j

4.2 Curve di Bezier

Espressione parametrica generale:

p(u) =n∑

i=0

piBi,n(u) con u ∈ [0, 1]

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

C(n, i) =n!

i!(n− i)!

4.2.1 Bezier 3 punti

3 punti di controllo → n = 2

Forma geometrica: p(u) = (1− u)2p0 + 2u(1− u)p1 + u2p2

Forma matriciale coefficienti geometrici/algebrici: 0 0 10 1

21

1 1 1

abc

=

p0

p1

p2

a

bc

=

1 −2 1−2 2 01 0 0

p0

p1

p2

Formule per la riparametrizzazione:

Forma matriciale: p(u) = FP dove F =

1 0 014

12

14

0 0 1

Manuel Borile & Alida Palmisano 18

Page 19: JCurves

e P e il vettore dei coefficienti geometrici della curva iniziale (con parametroche varia tra 0 e 1).

I coefficienti geometrici della curva riparametrizzata (q0, q1, q2) si ricavanodalla seguente operazione: 1 0 0

−12

2 −12

0 0 1

p(u0)p(u 1

2)

p(u1)

=

q0

q1

q2

4.2.2 Bezier 4 punti

4 punti di controllo → n = 3

Forma geometrica: p(u) = (1− u)3p0 + 3u(1− u)2p1 + 3u2(1− u)p2 + u3p3

Forma matriciale coefficienti geometrici/algebrici:0 0 0 10 0 1

31

0 13

23

11 1 1 1

abcd

=

p0

p1

p2

p3

abcd

=

−1 3 −3 13 −6 3 0−3 3 0 01 0 0 0

p0

p1

p2

p3

Formule per la riparametrizzazione:

Forma matriciale: p(u) = FP dove F =

1 0 0 0827

49

29

127

127

29

49

827

0 0 0 1

e P e il vettore dei coefficienti geometrici della curva iniziale (con parametro

che varia tra 0 e 1).

I coefficienti geometrici della curva riparametrizzata (q0, q1, q2, q3) si rica-vano dalla seguente operazione:

1 0 0 0−5

63 −3

213

13

−32

3 −56

0 0 0 1

p(u0)p(u 1

3)

p(u 23)

p(u1)

=

q0

q1

q2

q3

Manuel Borile & Alida Palmisano 19

Page 20: JCurves

4.2.3 Bezier 5 punti

5 punti di controllo → n = 4

Forma geometrica:p(u) = (1− u)4p0 + 4u(1− u)3p1 + 6u2(1− u)2p2 + 4u3(1− u)p3 + u4p4

Forma matriciale coefficienti geometrici/algebrici:0 0 0 0 10 0 0 1

41

0 0 53

12

10 1

412

34

11 1 1 1 1

abcde

=

p0

p1

p2

p3

p4

abcde

=

1 −4 6 −4 1−4 12 −12 4 06 −12 6 0 0−4 4 0 0 01 0 0 0 0

p0

p1

p2

p3

p4

Formule per la riparametrizzazione:

Forma matriciale: p(u) = FP dove F =

1 0 0 0 081256

2764

27128

364

1256

116

14

38

14

116

1256

364

27128

2764

81256

0 0 0 0 1

e P e il vettore dei coefficienti geometrici della curva iniziale (con parametro

che varia tra 0 e 1).

I coefficienti geometrici della curva riparametrizzata (q0, q1, q2, q3, q4) siricavano dalla seguente operazione:

1 0 0 0 0−13

124 −3 4

3−1

41318

−329

203

−329

1318

−14

43

−3 4 −1312

0 0 0 0 1

p(u0)p(u 1

4)

p(u 12)

p(u 34)

p(u1)

=

q0

q1

q2

q3

q4

Manuel Borile & Alida Palmisano 20

Page 21: JCurves

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 114

12

11 1 1

abc

=

p0

p1

p2

a

bc

=

2 −4 2−3 4 −11 0 0

p0

p1

p2

Formule per la riparametrizzazione:

coefficienti geometrici della curva riparametrizzata

q0, q1, q2 dove:

q0 = p(u0)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 1127

19

13

1827

49

23

11 1 1 1

abcd

=

p0

p1

p2

p3

abcd

=

−4.5 13.5 −13.5 4.5

9 −22.5 18 −4.5−5.5 9 −4.5 1

1 0 0 0

p0

p1

p2

p3

Formule per la riparametrizzazione:

coefficienti geometrici della curva riparametrizzata

q0, q1, q2, q3 dove:

q0 = p(u0)q1 = p(u 1

3)

q2 = p(u 23)

q3 = p(u1)

Manuel Borile & Alida Palmisano 21

Page 22: JCurves

4.3.3 Spline 5 punti

5 punti di controllo → grado della curva interpolante = 4

Forma matriciale coefficienti geometrici/algebrici:0 0 0 0 11

256164

116

14

1116

18

14

12

181256

2764

916

34

11 1 1 1 1

abcde

=

p0

p1

p2

p3

abcde

=

323

−1283

64 −1283

323

−803

96 −128 2243

−16703

−2083

76 −1123

223

−253

16 −12 163

−11 0 0 0 0

p0

p1

p2

p3

p4

Formule per la riparametrizzazione:

coefficienti geometrici della curva riparametrizzata

q0, q1, q2, q3, q4 dove:

q0 = p(u0)q1 = p(u 1

4)

q2 = p(u 12)

q3 = p(u 34)

q4 = p(u1)

4.4 B-Spline

p(u) =n∑

j=0

pjNj,k(u)

Ni,k(u) =(u−ti)Ni,k−1(u)

ti+k−1−ti+

(ti+1−u)Ni+1,k−1(u)

ti+k−ti+1Ni,1(u) =

{1 if ti ≤ u < ti+1

0 o.w.

dove:

• ti sono i nodi caso “non periodico” ti =

0 if i < ki− k + 1 if k ≤ i ≤ nn− k + 2 if i > n

• 0 ≤ i ≤ n + k

• tk−1 ≤ u ≤ tn+1

• sia consideri che 00

= 0

Manuel Borile & Alida Palmisano 22

Page 23: JCurves

4.5 Stretching di una curva

La funzionalita di stretching consiste nella possibilita di deformare la curvanelle tre dimensioni.

Per calcolare i nuovi punti di controllo della curva modificata, vengonoutilizzate le coordinate dei vertici della bounding box: sulla base di questipunti costruiamo una matrice di trasformazione che consente l’aggiornamentodelle coordinate dei punti di controllo e di conseguenza la creazione dellanuova curva.

Per fare questo sono necessarie 6 coordinate: 3 che identificano i verticidella bounding box prima della modifica e altri 3 che identificano gli stessivertici 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, facendocomunque attenzione al tipo di coordinate che devono essere inserite nellamatrice.

Per esempio:dati 3 vertici q1, q2, q3 appartenenti alla bounding box di partenzadati 3 vertici r1, r2, r3 appartenenti alla bounding box deformata

se il movimento a cui si e fatto riferimento durante l’operazione di stretchingva ad agire sull’asse x, il sistema da risolvere sara cosi composto:

a11 a12 a1 0 0 0a11 a12 a1 0 0 0a11 a12 a1 0 0 00 0 0 a21 a22 a2

0 0 0 a21 a22 a2

0 0 0 a21 a22 a2

q1x q2x q3x 0 0 0q1y q2y q3y 0 0 01 1 1 0 0 00 0 0 q1x q2x q3x

0 0 0 q1y q2y q3y

0 0 0 1 1 1

=

r1x

r2x

r3x

r1y

r2y

r3y

Risolvendolo, si otterranno i valori di a11, a12, a21, a22, a1, a2 che possono

essere scritti in forma matriciale nel seguente modo:

A =

(a11 a12

a21 a22

)a =

(a1

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 interessatol’asse z, non avremmo dovuto estrarre le coordinate x e y dei punti, bensı lecoordinate y e z.

Manuel Borile & Alida Palmisano 23

Page 24: JCurves

4.5.1 Scaling di una curva

La proprieta da garantire in questo caso e la deformazione uniforme dellacurva, ossia una deformazione che mantenga le proporzioni fra i punti che lacompongono. La strategia adottata e stata quella di eseguire due azioni distretching in sequenza, legando di volta in volta due coordinate rispetto alparticolare risultato che si vuole ottenere dalla scalatura.

Per esempio, supponiamo di voler ingrandire la curva lungo l’asse x: permantenere le proporzioni vogliamo che la curva cresca anche in altezza (lungol’asse y). Definiamo quindi un delta che rappresenta lo spostamento lungol’asse delle ascisse ed eseguiamo un’azione di stretching che allunghi la cur-va: a questo punto eseguiamo nuovamente lo stretching, imponendo peroun movimento che alzi la curva lungo l’asse y dello stesso delta definito inprecedenza.

4.6 Mirroring di una curva rispetto ad un piano

Per eseguire il mirroring di una curva rispetto ad un piano e necessario creareun piano nello spazio (orientabile a piacimento) e selezionare la curva dipartenza: il risultato da ottenere e il disegno di una nuova curva, identica aquella di partenza, ma con le coordinate specchiate rispetto al piano.

Per fare questo sono state utilizzate alcune formule matematiche ed, inparticolare, sono necessari l’equazione aritmetica del piano (equazione chedeve corrispondere all’orientamento della geometria posta nello spazio 3D)e un metodo che permettesse di trovare le coordinate speculari rispetto alpiano di un dato punto di partenza.

Per trovare l’equazione aritmetica del piano e stata utilizzata la formulaper 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 = 0i coefficienti sono calcolabili attraverso i seguenti determinanti:

a =

∣∣∣∣∣∣Ry Rz 1Sy Sz 1Ty Sz 1

∣∣∣∣∣∣ b =

∣∣∣∣∣∣Rz Rx 1Sz Sx 1Tz Tx 1

∣∣∣∣∣∣ c =

∣∣∣∣∣∣Rx Ry 1Sx Sy 1Tx Ty 1

∣∣∣∣∣∣d = −(aRx + bRy + cRz)

Infine, per trovare le coordinate speculari rispetto al piano di un dato puntodi partenza e stato adottato il seguente procedimento:

data l’equazione del piano ax + by + cz + d = 0 e definendo n =

abc

dato un punto P con vettore posizione p, il suo punto speculare rispetto alpiano e Q, con vettore posizione q calcolabile nel seguente modo:

q = p + λn con λ =−2(n • p + d)

n • n

Manuel Borile & Alida Palmisano 24