Informazioni generali

  • A ciascuna delle domande corrisponde una frazione del punteggio complessivo. Si consiglia quindi di rispondere al maggior numero di esse.

  • I compiti dovranno essere inviati per email all’indirizzo apaoluzzi@gmail.com, con intestazione [grafica 2010] compito 2

  • I file di ogni studente dovranno essere contenuti dentro un archivio zip, denominato con il codice-studente di Roma Tre (es 123456.zip). Gli studenti ancora sprovvisti di codice lo invieranno come cognome.zip

  • Lo studente dovrà realizzare piccoli programmi denominati come segue, e per ciascuno scrivere alcune righe di documentazione in un file py corrispondente:

    • risposta1.py,

    • risposta2.py, etc.,

    • doc1.py,

    • doc2.py, etc.

  • Ogni file _deve contenere una docstring (ovvero un commento delimitato da tripli doppi apici) recante

    • cognome, nome, matricola_ nella prima riga;

    • una seconda riga vuota;

    • la descrizione del codice del corrispondente esercizio nelle righe successive.

  • Ogni file rispostai.yy deve terminare con una istruzione VIEW() funzionante. Se questa non apre una finestra corrispondente al modello richiesto, la risposta non sarà presa in considerazione.

  • Il termine di consegna è tassativo. I compiti inviati dopo la scadenza non saranno presi in considerazione.

  • l’ambiente grafico da utilizzare (per chi non lo avesse già installato) è disponibile all’indirizzo http://www.dia.uniroma3.it/~paoluzzi/plasm502/download/plasm_314_2/

  • Ogni variazione dalle presenti specifiche sarà adeguatamente sanzionata in termini di punteggio.

Preliminari

Il compito prevede di utilizzare delle funzioni generatrici di curve che approssimano una polilinea. A questo scopo si applichi la funzione predefinita BEZIERCURVE su una successione di punti. Il risultato è una funzione che può essere applicata ad una partizione dell’intervallo unitario per produrre una approssimazione poligonale della curva. La stessa funzione, se applicata ad una successione crescente di valori nell’intervallo [0,1] produce una lista di punti della curva. Si noti che tali valori numerici devono essere forniti come punti 1D, cioè come liste.

 >>> c = BEZIERCURVE([[0,0],[1,0],[0,1]])
 >>> c([2./3])
 [0.44444444444444448, 0.44444444444444442]
 >>> c([0.5])
 [0.5, 0.25]
 >>> c([0.0])
 [0.0, 0.0]

Per generare una sequenza crescente di numeri nell’intervallo [0,1] si può procedere come segue:

 >>> import numpy
 >>> (1./12 * numpy.array(range(13))).tolist()
 [0.0, 0.083333333333333329, 0.16666666666666666, 0.25, 0.33333333333333331, 0.41666666666666663, 0.5,
 0.58333333333333326, 0.66666666666666663, 0.75, 0.83333333333333326, 0.91666666666666663, 1.0]

Esercizi

Il compito consiste nella costruzione in Python di alcuni semplici programmi di pseudo-animazione che testino la comprensione delle trasformazioni affini e delle strutture gerarchiche. Una psudo-animazione è semplicemente un assieme di configurazioni dell’oggetto mobile o articolato. Diremo uniforme una suddivisione in parti uguali.

La valutazione degli esercizi sarà inversamente proporzionale al numero di linee di codice scritte … :o)

  1. Specificare una curva piana qualsiasi (utilizzando il metodo suggerito in precedenza) e piazzare un (piccolo) cerchio colorato in corrispondenza di ogni punto di un campionamento uniforme della curva (100 punti);

  2. Definire una forma "a freccia" 2D e piazzarne una istanza orientata al posto dei cerchi precedenti. Tali "freccie" siano orientate come la tangente alla curva in ogni punto;

  3. Generare i punti sulla curva in modo tale che la distanza tra ogni coppia di punti consecutivi approssimi (rozzamente) lo spazio percorso da un oggetto mobile con velocità crecente linearmente dal valore iniziale zero. Si illustrino i punti di tale campionamento non uniforme piazzando su ciascuno un piccolo cerchio, come nell’esercizio 1;

  4. Definire un semplicissimo pupazzo 2D (pseudo)antropomorfo con 5 giunti rotazionali (tra torso, testa, gambe e braccia), utilizzando solo quadrati e triangoli;

  5. Generare una pseudo-animazione in 2D, con un grado di libertà traslazionale (nella direzione x) del pupazzo e i 5 rotazionali sopra definiti;

Suggerimenti

Per generare i punti di una curva, ci si può ispirare al seguente esempio. L’operatore MK trasforma un punto in un poliedro 0-dimensionale. La sequenza dei punti di controllo dell’operatore BEZIERCURVE può essere di lunghezza qualunque.

from pyplasm import *
from numpy import array

def sample(intervalSize):
    def sample0(n):
        return (float(intervalSize)/n * array(range(n+1)))
    return sample0

controlPoints = [[0,0],[8,0],[0,8],[8,8]]
c = BEZIERCURVE(controlPoints)
curvepoints = [c([x]) for x in sample(1.0)(24)]

out = STRUCT([ POLYLINE(controlPoints),
               STRUCT([MK(p) for p in curvepoints]) ])
VIEW(out)