Вы находитесь на странице: 1из 6

Informe de Matemtica Aplicada a la Computacin -

Graficador de transformaciones lineales


Huaman Canqui, Jair Francesco
17 de octubre de 2017

1. Implementacin
El graficador ha sido implementado con el IDE QT Creator con C++ y OpenGL. El polgono
se grfica mediante la funcin glVertex3f de OpenGl, en la aplicacin principal se manejan dos
variables, un vector de vectores de floats para almacenar los vertices del poligono y un vector
de vectores de floats para almacenar los nuevos vertices luego de que la transformacin lineal es
aplicada.

Figura 1: Vista del programa, insercin de puntos y grfica inicial

1.1. Cdigo custom OpenGL Widget

1 # include " glwidget . h "


2 # include < GL / glut .h >
3
4
5 struct vertex
6 {
7 GLfloat x , y , z ;
8 };
9

1
Figura 2: Grfica al aplicar la transformacin lineal

10 GLWidget :: GLWidget ( QWidget * parent ) :


11 QGLWidget ( parent )
12 {
13 this - > R = 1;
14 this - > wired = false ;
15 this - > ang = 0.5;
16
17 connect ( & timer , SIGNAL ( timeout () ) , this , SLOT ( updateGL () ) ) ;
18 timer . start (16) ;
19 }
20
21 void GLWidget :: initializeGL ()
22 {
23 glClearColor (0.2 , 0.2 , 0.2 , 1) ;
24 glEnable ( GL_DEPTH_TEST ) ;
25 glEnable ( GL_LIGHT0 ) ;
26 glEnable ( GL_LIGHTING ) ;
27 glEnable ( G L_COLOR_ MATERIAL ) ;
28 // Enable vertex arrays
29 g lE n a bl e Cl i en t S ta t e ( GL_VERTEX_ARRAY ) ;
30 }
31
32 void GLWidget :: paintGL ()
33 {
34 glClear ( GL _ CO L O R_ B UF F ER _ B IT | G L _D E P TH _ BU F F ER _ BI T ) ;
35 glLoadIdentity () ;
36 glTranslatef (0.0 , 0.0 , -10.0) ;
37 /*
38
39 */
40 if ( isResult ) {
41 drawResultPoints () ;

2
42 } else {
43 drawPoints () ;
44 }
45
46
47 }
48
49 void GLWidget :: drawResultPoints ()
50 {
51 glBegin ( GL_POLYGON ) ; // Draw A Quad
52 /*
53 glVertex3f ( -1 ,2 ,0) ; // Top Left
54 glVertex3f ( 1.0 f , 10.0 f , 0.0 f ) ; // Top Right
55 glVertex3f ( 1.0 f , -10.0 f , 0.0 f ) ; // Bottom Right
56 glVertex3f ( -1.0 f , -1.0 f , 0.0 f ) ; // Bottom Left
57 */
58 for ( auto it = this - > resultPoints . begin () ; it != this - >
resultPoints . end () ; ++ it ) {
59 glVertex3f (((* it ) . at (0) ) . at (0) ,((* it ) . at (1) ) . at (0) ,0) ;
60 /*
61 for ( auto itArr = (* it ) . begin () ; itArr !=(* it ) . end () ; ++
itArr ) {
62 glVertex3f (((* itArr ) . at (0) ) . at (0) ,((* itArr ) . at (1) ) . at
(0) ,0) ;
63 } */
64 }
65 glEnd () ;
66 }
67
68
69 void GLWidget :: drawPoints ()
70 {
71 glBegin ( GL_POLYGON ) ; // Draw A Quad
72 /*
73 glVertex3f ( -1 ,2 ,0) ; // Top Left
74 glVertex3f ( 1.0 f , 10.0 f , 0.0 f ) ; // Top Right
75 glVertex3f ( 1.0 f , -10.0 f , 0.0 f ) ; // Bottom Right
76 glVertex3f ( -1.0 f , -1.0 f , 0.0 f ) ; // Bottom Left
77 */
78 for ( auto it = this - > points . begin () ; it != this - > points . end () ;
++ it ) {
79 glVertex3f ((* it ) . at (0) ,(* it ) . at (1) ,0) ;
80 /*
81 for ( auto itArr = (* it ) . begin () ; itArr !=(* it ) . end () ; ++
itArr ) {
82
83 } */
84 }
85 glEnd () ;
86
87 }
88
89 void GLWidget :: resizeGL ( int width , int height )
90 {
91 int side = qMin ( width , height ) ;
92 glViewport (( width - side ) / 2 , ( height - side ) / 2 , side , side )
;
93 glMatrixMode ( GL_PROJECTION ) ;

3
94 glLoadIdentity () ;
95 # ifdef QT_OPENGL_ES_1
96 glOrthof ( -2 , +2 , -2 , +20 , 1.0 , 15.0) ;
97 # else
98 glOrtho ( -20 , +20 , -20 , +20 , 1.0 , 15.0) ;
99 # endif
100 glMatrixMode ( GL_MODELVIEW ) ;
101 }

1.2. Cdigo de aplicacin principal

1 # include " mainwindow . h "


2 # include " ui_mainwindow . h "
3
4 MainWindow :: MainWindow ( QWidget * parent ) :
5 QMainWindow ( parent ) ,
6 ui ( new Ui :: MainWindow )
7 {
8 ui - > setupUi ( this ) ;
9 }
10
11 MainWindow ::~ MainWindow ()
12 {
13 delete ui ;
14 }
15
16 void MainWindow :: on _X_value Changed ( double arg1 )
17 {
18 this - > ui - > GLwidget - > x = arg1 ;
19 }
20
21 void MainWindow :: on _Y_value Changed ( double arg1 )
22 {
23 this - > ui - > GLwidget - > y = arg1 ;
24 }
25
26 void MainWindow :: on _Z_value Changed ( double arg1 )
27 {
28 this - > ui - > GLwidget - > z = arg1 ;
29 }
30
31 void MainWindow :: on _R_value Changed ( double arg1 )
32 {
33 this - > ui - > GLwidget - > R = arg1 ;
34 }
35
36 void MainWindow :: o n_ c he c k Bo x _c l ic k e d ( bool checked )
37 {
38 this - > ui - > GLwidget - > wired = checked ;
39 }
40
41 vector < vector < float > > matrix_multiply ( const vector < vector < float > >&
a , int row_a , int cln ,
42 const vector < std :: vector < float > >&b , int cln_b )
43 {
44 vector < vector < float > > c ( row_a , vector < float >( cln_b ) ) ;

4
45 int sum =0;
46 for ( int i = 0; i < row_a ; i ++)
47 for ( int j = 0; j < cln_b ; j ++) {
48 for ( int k = 0; k < cln ; k ++) {
49 sum = sum + a [ i ][ k ]* b [ k ][ j ];
50 }
51 c [ i ][ j ]= sum ;
52 sum =0;
53 }
54
55 return c ;
56
57 }
58
59 void MainWindow :: o n _ b t n A d d P o i n t _ c l i c k e d ()
60 {
61 // std :: array < float ,2 > newPoint { this - > ui - > txtPointX - > text () .
toFloat () , this - > ui - > txtPointY - > text () . toFloat () };
62 std :: vector < float > newPoint ;
63 newPoint . push_back ( this - > ui - > txtPointX - > text () . toFloat () ) ;
64 newPoint . push_back ( this - > ui - > txtPointY - > text () . toFloat () ) ;
65
66 // std :: vector < std :: vector < float > >:: iterator it = this - > points .
begin () ;
67 this - > points . push_back ( newPoint ) ;
68
69 this - > ui - > txtPointsList - > clear () ;
70
71 for ( auto it = this - > points . begin () ; it != this - > points . end () ;
++ it ) {
72 for ( auto itArr = (* it ) . begin () ; itArr !=(* it ) . end () ; ++
itArr ) {
73 this - > ui - > txtPointsList - > append ( QString :: number (* itArr )
+ " ," ) ;
74 }
75 }
76 }
77
78 void MainWindow :: o n _ b t n T r a n s f o r m a r _ c l i c k e d ()
79 {
80 std :: vector < std :: vector < float > > matrix ;
81 std :: vector < float > point ;
82 point . push_back ( this - > ui - > txtMatriz11 - > text () . toFloat () ) ;
83 point . push_back ( this - > ui - > txtMatrix12 - > text () . toFloat () ) ;
84 matrix . push_back ( point ) ;
85 point . clear () ;
86 point . push_back ( this - > ui - > txtMatrix21 - > text () . toFloat () ) ;
87 point . push_back ( this - > ui - > txtMatrix22 - > text () . toFloat () ) ;
88 matrix . push_back ( point ) ;
89
90
91 this - > resultPoints . clear () ;
92
93 for ( auto it = this - > points . begin () ; it != this - > points . end () ;
++ it ) {
94 std :: vector < std :: vector < float > > b ;
95 for ( auto itArr = (* it ) . begin () ; itArr != (* it ) . end () ; ++
itArr ) {

5
96 std :: vector < float > point ;
97 point . push_back (* itArr ) ;
98 b . push_back ( point ) ;
99 }
100 // MATRIZ MULTIPLICATION
101 int row_a = 2;
102 int cln_b = 1;
103 int cln = 2;
104 vector < vector < float > > c ( row_a , vector < float >( cln_b ) ) ;
105 int sum =0;
106 for ( int i = 0; i < row_a ; i ++)
107 for ( int j = 0; j < cln_b ; j ++) {
108 for ( int k = 0; k < cln ; k ++) {
109 sum = sum + matrix [ i ][ k ]*( b ) [ k ][ j ];
110 }
111 c [ i ][ j ]= sum ;
112 sum =0;
113 }
114 this - > resultPoints . push_back ( c ) ;
115 }
116
117
118
119 // this - > resultPoints = c ;
120
121
122 this - > ui - > txtPointsList - > clear () ;
123
124 for ( auto it = this - > resultPoints . begin () ; it != this - >
resultPoints . end () ; ++ it ) {
125 for ( auto itArr = (* it ) . begin () ; itArr !=(* it ) . end () ; ++
itArr ) {
126 for ( auto itArr2 = (* itArr ) . begin () ; itArr2 !=(* itArr ) .
end () ; ++ itArr2 ) {
127 this - > ui - > txtPointsList - > append ( QString :: number (*
itArr2 ) + " ," ) ;
128 }
129 }
130 this - > ui - > txtPointsList - > append ( " - - - - - - - - - - - - - - - - - - - - " ) ;
131 }
132 this - > ui - > GLwidget - > isResult = true ;
133 this - > ui - > GLwidget - > resultPoints = this - > resultPoints ;
134 }
135
136 void MainWindow :: o n _ b t n D r a w O r i g i n a l _ c l i c k e d ()
137 {
138 // Dibujar matriz original
139 this - > ui - > GLwidget - > points = this - > points ;
140 this - > ui - > GLwidget - > isResult = false ;
141
142 }

Вам также может понравиться