Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 29 ancora MMeditor,

Slides:



Advertisements
Presentazioni simili
1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
Advertisements

Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
Esercizio 2. Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni di classe.
MultiSet, Liste Ordinate
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Introduzione al linguaggio C
Programmazione Procedurale in Linguaggio C++
J0 1 Marco Ronchetti Java Threads & Sincronizzazione.
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Xml for dummies Parte 2
Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 26 XML read e write / Gl Selection e picking
Costruzione di Interfacce Lezione 4 Geometria per la grafica
Costruzione di Interfacce Lezione 18 Qt Tutorial 2
Costruzione di Interfacce Lezione 19 Qt Tutorial Designer
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce Lezione 20 Qt + Opengl
Costruzione di Interfacce Lezione 12 C++STL
22 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Texturing
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 24 Scene Graphs e Xml for dummies
6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 anatomia di uno screen saver
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 30 MMeditor e collision detection
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball
Costruzione di Interfacce Lezione 16 Qt
1 Costruzione di Interfacce Primi passi in OpenGL
2 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 23 Scene Graphs, Object Loading
Costruzione di Interfacce Lezione 8 Rasterizzazione
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
// PROTOTIPI void costruisciLista(Pnodo &, string &); void stampaLista(Pnodo ); void creaNodo (int, Pnodo&); Pnodo inserisciNodoTesta (int,Pnodo &); Pnodo.
JAVA C import java.util.*; #include <stdio.h>
6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
Selezione (=scelta) con “if-else”
Array Ricerca Ordinamento Fusione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
AN Fondam98 Sorting Ricerca in un vettore ordinato.
1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)
Programmazione in Java Claudia Raibulet
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Diagramma di flusso del problema del Supermercato.
(1) Sistemi Operativi Prof. P. Cattaneo ufficio: L Ricevimento: Martedì14.00 –
void binario(int n); …………………
Ese 2 (del 31 Marzo 2004). Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni.
Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,
Piero Scotto - C141 C14 SINTASSI DEL C VARIABILI e COSTANTI.
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Picking - OpenGL Disegno della scena (display) Impostazione parametri selezione Ripristino parametri Loop Selezione.
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Collection & Generics in Java
Esercizi.
ALGORITMI Un algoritmo è un insieme di istruzioni: -ordinate -non ambigue -effettivamente computabili.
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Costruzione di Interfacce Lezione 18 MFC e OpenGL
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Ereditarietà in C++
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball, Generazione TexCoords
Definizione di algoritmo: Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile.
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici.
Programmazione in Java
Esercitazione sull’ ordinamento 20 maggio 2003
Dalla programmazione tradizionale al paradigma OO
Passaggio di parametri per indirizzo
Transcript della presentazione:

Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 29 ancora MMeditor,

Costruzione di Interfacce - Paolo Cignoni2 Cambiamo il mouse  Qcursor  Classe che incapsula un cursore del mouse  Img standard (freccia, clessidra, ecc.)  Img custom  QWidget.setCursor()  Ogni widget puo’ decidere quale sia il cursore da far vedere quando il mouse attraversa lo spazio del widget if(val) setCursor(QCursor(Qt::PointingHandCursor)); else setCursor(QCursor(Qt::SizeAllCursor));

Costruzione di Interfacce - Paolo Cignoni3 zoom nella trackball  si usa la rotella del mouse  solito meccanismo si fa override di una funzione virtuale  notare che il movimento della rotella e’ espresso in 120-esimi  ad ogni scatto della rotellina corrisponde un delta di 120.  serve per futuri mouse con la rotella non a scatti  void CIGLWidget::wheelEvent(QWheelEvent*e)

Costruzione di Interfacce - Paolo Cignoni4 zoom void CIGLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT ); glMatrixMode (GL_MODELVIEW); glLoadIdentity(); gluLookAt(2,5,6,0,0,0,0,1,0); glMultMatrix(rot); QTime tm; glScalef(zoomFactor,zoomFactor,zoomFactor); if(sg) sg->drawGL(tm.elapsed()/1000.0f); }

Costruzione di Interfacce - Paolo Cignoni5 void CIGLWidget::wheelEvent(QWheelEvent*e) { const int WHEEL_DELTA =120; if(!editing) { int notch = e->delta()/ WHEEL_DELTA; for(int i=0; i<abs(notch);++i) if(notch<0) zoomFactor*=1.2f; else zoomFactor/=1.2f; update(); }

Costruzione di Interfacce - Paolo Cignoni6 picking  per ora a noi interessa fare picking di una mattonella.  usiamo gluunproject e facciamoci dare il punto 3d della superficie  abbiamo bisogno  di salvarci le matrici al posto giusto  di leggere lo zbuf al momento giusto.  aggiungiamo un po di campi a  CIGLWidget per ricordarsi che si vuole piccare  CIGrid per fare effettivamente il picking

Costruzione di Interfacce - Paolo Cignoni7 Picking  Quindi  Nella mousePressEvent Ci si segna il punto dello schermo dove fare il picking  Nella paintGL Si fa effettivamente il picking chiamando la CIGrid::pickGL DOPO aver disegnato tutto.  La CIGrid::pickGL determina la posizione del punto 3d cliccato e da quello capisce la cella selezionata.

Costruzione di Interfacce - Paolo Cignoni8 void CIGLWidget::mousePressEvent(QMouseEvent*e) { if(!editing) { tb.MouseDown( e->x(), e->y(), 0 ); update(); } else { pickPos=Point2i( e->x(), e->y()); update(); }

Costruzione di Interfacce - Paolo Cignoni9 void CIGLWidget::paintGL() { glMatrixMode (GL_MODELVIEW);... QTime tm; glScalef(zoomFactor,zoomFactor,zoomFactor); if(sg) sg->drawGL(tm.elapsed()/1000.0f); if(pickPos != Point2i(0,0)){ Point2i out; bool ret=sg->g->pickGL(pickPos,out); if(ret) sg->g->G(out[0],out[1]).selected =! sg->g- >G(out[0],out[1]).selected; pickPos = Point2i(0,0); }

Costruzione di Interfacce - Paolo Cignoni10 pickGL bool CIGrid::pickGL(Point2i in, Point2i &pos){ float z; glReadPixels(in[0],vp[3]-in[1],1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&z); return pickGL(Point3d(in[0],vp[3]-in[1],z),pos); } bool CIGrid::pickGL(Point3d in, Point2i &pos) { Point3d o; gluUnProject(in[0],in[1],in[2],mm,mp,vp,&o[0],&o[1],&o[2]); qDebug("picked %f %f %f\n",o[0],o[1],o[2]); if(o[0] sx ) return false; if(o[1] sy ) return false; pos[0]=o[0]; pos[1]=o[1]; return true; }

Costruzione di Interfacce - Paolo Cignoni11 selezione  per far vedere la selezione si cambia semplicemente il colore di base che viene blendato con la texture  per rialzare gli elementi selezionati  void CIGrid::raiseSelected(float f)  {  vector ::iterator ii;  for (ii=g.begin();ii!=g.end();++ii)  if((*ii).selected)  for(int k=0;k<4;++k)  (*ii).V[k].z()+=f;  }

Costruzione di Interfacce - Paolo Cignoni12 RubberBanding  selezione di aree rettangolari  necessita di un altro stato nel widget.  ci si deve salvare il punto di inizio di inizio.  e un po’ di funz di appoggio nella grid  clear selection  select rect.

Costruzione di Interfacce - Paolo Cignoni13 paint e rubberbanding void CIGLWidget::paintGL()... if(sg) sg->drawGL(tm.elapsed()/1000.0f); if(rubberBanding && pickPos!=Point2i(0,0)){ Point2i out; bool ret=sg->g->pickGL(pickPos,out); if(ret) { if(rbStart==Point2i(-1,-1)) rbStart=out; Point2i rbEnd= out; sg->g->clearSelection(); sg->g->selectRect(rbStart,rbEnd); pickPos = Point2i(0,0); }

Costruzione di Interfacce - Paolo Cignoni14 funzioni di editing  Come prima cosa colleghiamo la wheel del mouse all’altezza dell’area selezionata  Aggiungiamo alla classe CIGrid un metodo per alzare la zona selezionata void CIGrid::raiseSelected(float f) { vector ::iterator ii; for (ii=g.begin();ii!=g.end();++ii) if((*ii).selected) for(int k=0;k<4;++k) (*ii).V[k].z()+=f; }  E invochiamo questo metodo direttamento nell’handler del evento mouse wheel

Costruzione di Interfacce - Paolo Cignoni15 void CIGLWidget::wheelEvent(QWheelEvent*e) { const int WHEEL_DELTA =120; int notch = e->delta()/ WHEEL_DELTA; if(!editing) { for(int i=0; i<abs(notch);++i) if(notch<0) zoomFactor*=1.2f; else zoomFactor/=1.2f; update(); } else { sg->g->raiseSelected(notch); update(); }

Costruzione di Interfacce - Paolo Cignoni16 Flatten  Altre funzioni di editing: Flatten  la zona selezionata viene appiattita sull’altezza media.  Aggiungiamo, nella classe cella,  Funzione per restituire l’altezza media della cella. class CICell { public: bool selected; Point3f V[4]; Point3f n; float tmpH[4]; void ComputeNormal(); void drawGL(); float AvgH() {return (V[0][2]+V[1][2]+V[2][2]+V[3][2])/4.0f;} }

Costruzione di Interfacce - Paolo Cignoni17 Flatten  Aggiungiamo  Uno slot flatten alla CIWidget che chiama  Una funzione flattenSelected alla classe CIGrid  Un pulsante sul tab  Un collegamento tra il release del pulsante e lo slot della widget  La funzione flattenSelected fa due passate,  prima calcola l’altezza media.  Poi la setta sull’area selezionata

Costruzione di Interfacce - Paolo Cignoni18 flatten void CIGrid::flattenSelected() {// first step compute average height int i,j; int cnt=0; float avgH=0; for(i=0;i<sx;++i) for(j=0;j<sy;++j) if(G(i,j).selected){ avgH+=G(i,j).avgH(); ++cnt; } avgH/=cnt;// second step apply the compute average height vector ::iterator ii; for (ii=g.begin();ii!=g.end();++ii) if((*ii).selected) for(int k=0;k<4;++k) (*ii).V[k][2]=avgH; }

Costruzione di Interfacce - Paolo Cignoni19 Smooth  Aggiungiamo una funzione che faccia uno smoothing della zona selezionata  Significa mediare ogni valore con gli adiacenti  Serve a far sparire gradini e fare pendi morbidi…  Aggiungiamo alla classe cella,  campi temporanei per mantenere valori intermedi di altezze nelle celle

Costruzione di Interfacce - Paolo Cignoni20 Smooth  Ogni cella della griglia ha 4 vertici  Ad ogni vertice si assegna la media delle avgH() delle celle selezionate intorno a lui  Per ridurre il codice  esprimo ogni vertice di cella come offset rispetto alla cella stessa (eg il vert rosso in fig e’ (1,1) )  Esprimo gli adiacenti come offset rispetto a alla stessa

Costruzione di Interfacce - Paolo Cignoni21 smooth void CIGrid::smoothSelected() { int bp[4][2]={{0,0},{1,0},{1,1},{0,1}}; // base position of each vertex of the cell int dp[4][2]={{-1,-1},{0,-1},{0,0},{-1,0}}; // delta of the four adj of a cell vertex int i,j,k,q; int cnt; float tH; for(i=0;i<sx;++i) for(j=0;j<sy;++j) if(G(i,j).selected) for(k=0;k<4;++k) //for each cell vertex; { tH=0;cnt=0; for(q=0;q<4;++q) // foreach adj of a cell vertex if(G(i+bp[k][0]+dp[q][0],j+bp[k][1]+dp[q][1]).selected){ tH+=G(i+bp[k][0]+dp[q][0],j+bp[k][1]+dp[q][1]).avgH(); ++cnt; } G(i,j).tmpH[k]=tH/cnt; } for(i=0;i<sx;++i) for(j=0;j<sy;++j)if(G(i,j).selected) for(int k=0;k<4;++k) G(i,j).V[k][2]=G(i,j).tmpH[k]; }