[MidTerm] Febbraio 2015

Paolo VallesiPaolo Vallesi Posts: 12
Posto qui il testo del MidTerm sia per discuterne insieme per chi sta facendo il midterm (ma anche per chi vuole aiutare) sia per consultazioni future.

DISCLAIMER
L’elaborato deve essere prodotto personalmente e inviato per email indicando nome, cognome, matricola e piattaforma usata per lo sviluppo della soluzione.
È consentito discutere con altri le linee generali dei problemi, purché alla fine ciascuno studente formuli la propria soluzione. 
Ci si aspetta come minimo che ciascuno studente comprenda e sia in grado di spiegare la soluzione che consegna.
È consentito utilizzare strumenti di programmazione (compilatore e debugger) e di analizzare librerie (es. sorgenti di Mono) o documentazione in rete per approfondire le tecniche e le loro implementazioni.
Non è considerato accettabile:

• Sviluppare codice o pseudo-codice insieme con altre persone
• Utilizzare codice scritto da altri
• Consentire ad altri di utilizzare il proprio codice come soluzione ad un esercizio
• Mostrare o esaminare il lavoro di altri studenti.

La violazione di queste regole provocherà l’annullamento della prova e una segnalazione al Presidente del Consiglio di Corsi di Studio.

Si prega ai partecipanti di attenersi alle regole dell'esame.
Va bene quindi discutere di IDEE di soluzione ma è vietato sia postare codice che pseudocodice che risolva interamente o una parte di un esercizio.

MIDTERM 06/02/2015
Esercizio 1
Una easing function (o interpolatore) è una funzione che calcola i valori intermedi di un parametro tra due valori estremi (come ad esempio http://easings.net/). Molti framework di animazione introducono un concetto di timeline in cui si specificano tuple come ad esempio (x, 0, 100, 500, 1000) che si interpretano che la proprietà x deve variare dal valore 0 al valore 100 dopo 500ms dell’avvio della storyboard in 1000ms. Si dia un esempio, in pseudocodice, di easing functions che cambino le proprietà x e y della posizione di un oggetto per descrivere un moto circolare ed uno parabolico.
Esercizio 2
Scrivere una pagina HTML che consenta di selezionare un DIV, lo “rivesta” con un frame che ne consente lo spostamento nella pagina come se fosse una finestra. Con un opportuno link dovrà essere possibile invertire il processo.
Esercizio 3
Si vuole realizzare un controllo grafico che consenta di assemblare un insieme di ingranaggi dentati. Gli ingranaggi dovranno essere realizzati utilizzando un solo GraphicsPath. Si realizzino opportune aree cliccabili per aggiungere ingranaggi ridimensionabili. Gli ingranaggi non dovranno sovrapporsi e potranno avere dimensioni differenti. Quando accostati i denti si allineeranno alle ruote vicine. Un ingranaggio potrà sempre essere selezionato per essere spostato o eliminato. Altre aree cliccabili dovranno consentire zoom, pan e rotate della vista.
Esercizio 4
Si estenda il controllo dell’esercizio 3 con una funzione per indicare un verso di rotazione che sarà evidenziato ciascun ingranaggio (destro, sinistro o libero). Gli ingranaggi che hanno un verso di rotazione non libero sono vincolati a girare nella direzione indicata. Si aggiunga una funzione che animi un sistema di ingranaggi assemblato nel rispetto dei vincoli. L’animazione dovrà tener conto che il sistema accelera fino ad una velocità e poi, quando fermata il sistema dovrà rallentare fino a fermarsi come in presenza di attriti.

Comments

  • Paolo VallesiPaolo Vallesi Posts: 12
    edited February 2015
    Qualcuno che ha idea di come si possa fare il 3 esercizio? L'unica cosa che sono riuscito a fare a creare l'ingranaggio con un solo GraphicsPath.

    Non ho idea di come organizzare la struttura che dovrebbe tenere traccia di tutti quelli che aggiungo, nè come gestire la vista in modo che possa successivamente fare zoom,pan e rotate.

    Per adesso riesco ad aggiungerne solo 1, ma senza cambiare la matrice di trasformazione ergo, tutte le operazioni di rotate, pan e zoom non vanno.

    Sulle altre richieste di questo ese neanche mi ci sono messo (sincronizzazione dei denti, resize ingranaggio e non sovrapponibilità).
  • Non ho idea di come organizzare la struttura che dovrebbe tenere traccia di tutti quelli che aggiungo, nè come gestire la vista in modo che possa successivamente fare zoom,pan e rotate
    Io non sto facendo il midterm ma credo che ti basti una collezione dove salvi gli ingranaggi. Cos'è un ingranaggio? avrà un centro, un numero di denti e tutto quello che preferisci. Per ogni ingranaggio ti salvi una matrice che prende il tuo ingranaggio ideale e lo trasforma (in effetti il centro può essere codificato nella matrice), tramite traslazioni, rotazioni e scalatura.

    Ah, ricordate che Cisternino disse a lezione "conosco i forum che frequentate", quindi cercate di non mettere codice e aiuti esagerati.
  • Nono infatti non chiedo nulla di codici o che
    Comunque l'ingranaggi ero riuscito a farli senza problemi, ora riesco anche a gestirli con una struttura dati (il classico array di lightweight controls) così posso aggiungere e togliere senza noie. Mi danno alcuni problemi quando provo a sportarli nel senso che ogni tanto cercano di ritornare vicino a 0,0 e non capisco ancora perchè. Ho problemi anche quando faccio traslazione,rotazione e zoom della vista che sono quelli soliti che si hanno di correlate.

    Già riuscissi a risolvere questi problemi sarebbe buono XD
    Sincro dei denti e non sovrapposizione degli ingranaggi... è oro che cola per me :D (anche se magari poi è una cavolata)
  • Non so come muoverli senza sovrapporli, però per le varie trasformazioni l'unico modo che ho trovato utile è stato quello di disegnare su un foglio coordinate vista e mondo per verificare i calcoli.
  • Qualcuno che ha idea di come si possa fare il 3 esercizio? L'unica cosa che sono riuscito a fare a creare l'ingranaggio con un solo GraphicsPath.
    Ma sei riuscito a creare tutti gli ingranaggi con un solo GraphicsPath? Perchè ho chiesto al Cisternino e mi ha specificato che ne vuole uno solo per tutti gli ingranaggi...
  • Paolo VallesiPaolo Vallesi Posts: 12
    edited February 2015
    tommaso wrote: »
    Qualcuno che ha idea di come si possa fare il 3 esercizio? L'unica cosa che sono riuscito a fare a creare l'ingranaggio con un solo GraphicsPath.
    Ma sei riuscito a creare tutti gli ingranaggi con un solo GraphicsPath? Perchè ho chiesto al Cisternino e mi ha specificato che ne vuole uno solo per tutti gli ingranaggi...

    ma stai scherzando?? ma come cazzo si fa?
    edit:
    no ma è impossibile, se fosse uno solo come faccio a spostare gli ingranaggi separatamente? o a ridimensionarli separatamente?

    Sicuro che non intedesse che i denti e la ruota devono essere fatti con un unico graphicsPath ma poi ogni ingranaggio è un lightweight control a parte? io ho fatto così altrimenti non so come si possa fare.
    edit2:
    Muller20 wrote: »
    Non so come muoverli senza sovrapporli, però per le varie trasformazioni l'unico modo che ho trovato utile è stato quello di disegnare su un foglio coordinate vista e mondo per verificare i calcoli.

    Si alla fine per le viste ho quasi risolto ma sono veramente roba assurda. Non le ho ancora capite perfettamente (per me è ancora magia oscura asd) però mi rendo conto che sono comode una volta imparato ad usarle bene.
  • Paolo VallesiPaolo Vallesi Posts: 12
    edited February 2015
    No ok, credo di aver capito. Cioè penso di averla fatta bene.
    L'idea è che tu crei 1 LW Control per ogni ingranaggio. In questo modo se il LW Control l'hai fatto bene usi sempre il solito graphicsPath per ogni istanza di LW Control.
    Credo intendesse questo con "usare un solo GraphicsPath"; I punti del GraphicsPath sono sempre i soliti ma chiudendoli in un LW Control questo puoi spostarlo dove ti pare.
  • No ok, credo di aver capito. Cioè penso di averla fatta bene.
    L'idea è che tu crei 1 LW Control per ogni ingranaggio. In questo modo se il LW Control l'hai fatto bene usi sempre il solito graphicsPath per ogni istanza di LW Control.
    Credo intendesse questo con "usare un solo GraphicsPath"; I punti del GraphicsPath sono sempre i soliti ma chiudendoli in un LW Control questo puoi spostarlo dove ti pare.
    Anchio l'ho intesa così. Credo che per il termine completerò i primi 3 punti del mid (i primi 2 già fatti), mentre per il 4 non credo di farcela... forse poche cose
  • io sto per consegnare che non ne posso più. Ho fatto i primi due, il terzo non tutto (mi manca allineamento denti e non sovrapposizione degli ingranaggi). Se basta bene, sennò lo rifarò.
  • MindFlyerMindFlyer Posts: 436
    edited February 2015
    io sto per consegnare che non ne posso più. Ho fatto i primi due, il terzo non tutto (mi manca allineamento denti e non sovrapposizione degli ingranaggi).
    Hmm, peccato perché è la cosa geometricamente più interessante (in effetti è lì tutto il lavoro...). :(

    Diciamo che ogni ruota dentata ha un raggio interno [tex]r[/tex] e un raggio esterno [tex]R[/tex] variabili. Il numero di denti di una ruota sarà proporzionale a [tex]r[/tex] , in modo da fare tutti i denti di tutte le ruote press'a poco della stessa larghezza (se vuoi che tutte le ruote s'incastrino perfettamente, i raggi ammissibili dovranno essere tutti multipli di uno stesso raggio minimo, altrimenti avrai soluzioni approssimate...).

    Non far collidere due ruote dentate significa imporre che i loro centri non distino mai meno del minimo tra [tex]r_1+R_2[/tex] e [tex]R_1+r_2[/tex]. Inoltre, se i centri distano meno di [tex]R_1+R_2[/tex], la ruota che stai manipolando va girata di un angolo opportuno per incastrarsi. Questo pone qualche problema...

    Facciamo prima il caso semplice in cui la tua ruota deve adattarsi a una sola altra ruota. Allora basta girare la tua ruota di un angolo opportuno, che calcolerai semplicemente sapendo di quanto è girata l'altra ruota e dove sono i suoi denti.

    Nel caso generale, tu cercherai di piazzare una ruota che interagisce con un numero arbitrario di altre ruote. In questo caso non basterà più girare solo la tua ruota, ma potresti doverne girare altre, e poi ancora altre, "a catena". Per far questo conviene avere un grafo delle adiacenze tra ruote. Per esempio, ogni ruota può avere una lista di ruote adiacenti, e ogni volta che fai girare una ruota, fai girare anche le ruote nella lista che non sono ancora state girate (per far girare una ruota adiacente, puoi usare lo stesso metodo che usavi sopra per incastrare due ruote). Allora, visitando ciascuna componente del grafo con un algoritmo di visita qualsiasi, farai girare dell'angolo opportuno tutte le sue ruote (attento! non tutte le ruote dello stesso angolo, ma di angoli opportuni calcolati come dicevo prima). Inoltre, se due o più ruote della stessa componente connessa sono adiacenti alla tua ruota, dovrai vedere se le loro rotazioni sono compatibili. Prima farai girare tutte le ruote della componente connessa partendo da una ruota [tex]A[/tex], adiacente alla tua. Quando raggiungerai un'altra ruota [tex]B[/tex] che è adiacente alla tua, vedrai se la rotazione di [tex]B[/tex] è compatibile con la presenza della tua ruota, ovvero se i loro denti s'incastrano. Se non s'incastrano, vorrà dire che la tua ruota non può essere piazzata lì, pur non violando i vincoli di raggio.

    Se hai fatto questo, l'esercizio 4 diventa poco più che banale, perché hai già tutti i metodi per far girare una ruota rispetto all'altra. Nota: non è consigliabile far girare una ruota di un certo delta calcolato in base al delta di una ruota adiacente. Questo perché alla lunga le varie approssimazioni sul delta (in parte dovute all'aritmetica in virgola mobile, in parte dovute al fatto che molte ruote non s'incastrano perfettamente) si sommano dando luogo a errori che si amplificano sempre di più. Invece conviene sempre calcolare l'angolo assoluto di una certa ruota, in base all'angolo assoluto di una ruota adiacente.

    C'è ancora un punto da discutere: la "girabilità" delle ruote. Nota che una ruota gira in un senso (orario o antiorario) se e solo se tutte le sue ruote adiacenti girano nel senso opposto. Quindi, se tutte le ruote possono girare in entrambi i sensi, allora il sistema gira se e solo se il grafo delle adiacenze tra ruote è bipartito. Per verificare ciò, basta 2-colorare il grafo in modo greedy. Però per ipotesi alcune ruote hanno un verso di rotazione assegnato! Allora, una volta verificato che il grafo è 2-colorabile, controllerai che effettivamente le ruote con assegnato lo stesso verso abbiano lo stesso colore. In generale succederà che qualche componente connessa del grafo delle adiacenza possa ruotare e qualche componente no. Quindi farai la verifica di cui sopra su ogni componente connessa, decidendo per ognuna se deve "rimanere bloccata" o girare, e in quale senso.
  • Paolo VallesiPaolo Vallesi Posts: 12
    edited February 2015
    Grazie per la spiegazione!
    Non avrei mai pensato ad una struttura così complessa per evitare la sovrapposizione della figure. Io avrei semplicemente fatto un controllo prendendo i punti generati dal graphicsPath e verificando sull'onMouseMove se questi finiscono dentro un'altro ingranaggio (tutti gli ingranaggi sono memorizzati in un ResizeArray), in tal caso setto una variabile draggable=false e lo spostamento si ferma. Una cosa simile è possibile utilizzarla anche per la rotazione degli ingranaggi.

    Sicuramente la tua soluzione è di gran lunga più accurata, specie la parte sul calcolo della velocità di rotazione che io appunto avrei fatto basandomi su quello della ruota adiacente :D

    edit:
    Comunque alla fine ho fatto una parte del 4°, facendo la rotazione del singolo ingranaggio (senza che interagiscano tra di loro) con il calcolo dell'attrito. Erano giusto una 10ina di righe di codice e mi sembrava stupido non farlo :P
    Spero di aver racimolato qualche punticino pure nel 4°
  • tommasotommaso Posts: 2
    Ma a voi lo ha corretto il midterm? Io ho mandato due mail al prof in questi giorni ma ancora non ricevo risposte...
Sign In or Register to comment.