Visual Servoing Platform  version 3.0.1
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
vpTmstack.cpp
1 /****************************************************************************
2  *
3  * This file is part of the ViSP software.
4  * Copyright (C) 2005 - 2017 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * ("GPL") version 2 as published by the Free Software Foundation.
9  * See the file LICENSE.txt at the root directory of this source
10  * distribution for additional information about the GNU GPL.
11  *
12  * For using ViSP with software that can not be combined with the GNU
13  * GPL, please contact Inria about acquiring a ViSP Professional
14  * Edition License.
15  *
16  * See http://visp.inria.fr for more information.
17  *
18  * This software was developed at:
19  * Inria Rennes - Bretagne Atlantique
20  * Campus Universitaire de Beaulieu
21  * 35042 Rennes Cedex
22  * France
23  *
24  * If you have questions regarding the use of this file, please contact
25  * Inria at visp@inria.fr
26  *
27  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29  *
30  * Description:
31  * Le module "tmstack.c" contient les procedures de gestion
32  * de la pile de matrices de transformation (Transformation
33  * Matrix STACK).
34  *
35  * Authors:
36  * Jean-Luc CORRE
37  *
38  *****************************************************************************/
39 
40 
41 
42 
43 #include "vpMy.h"
44 #include "vpArit.h"
45 #include "vpTmstack.h"
46 #include <math.h>
47 #include <stdio.h>
48 #include <string.h>
49 #include <visp3/core/vpConfig.h>
50 
51 #ifndef DOXYGEN_SHOULD_SKIP_THIS
52 
53 #define STACKSIZE 32
54 
55 
56 static Matrix stack[STACKSIZE]/* = IDENTITY_MATRIX*/; /* pile */
57 static Matrix *sp = stack; /* sommet */
58 
59 
60 /*
61  * La procedure "get_tmstack" retourne la matrice au sommet
62  * de la pile des matrices de transformation.
63  * Sortie :
64  * Pointeur de la matrice au sommet de la pile.
65  */
66 Matrix *
67 get_tmstack (void)
68 {
69  return (sp);
70 }
71 
72 /*
73  * La procedure "load_tmstack" charge une matrice au sommet
74  * de la pile des matrices de transformation.
75  * Entree :
76  * m Matrice a charger.
77  */
78 void
79 load_tmstack (Matrix m)
80 {
81  //bcopy ((char *) m, (char *) *sp, sizeof (Matrix));
82  memmove ((char *) *sp, (char *) m, sizeof (Matrix));
83 }
84 
85 /*
86  * La procedure "pop_tmstack" depile la matrice au sommet
87  * de la pile des matrices de transformation.
88  */
89 void
90 pop_tmstack (void)
91 {
92  if (sp == stack) {
93  static char proc_name[] = "pop_tmstack";
94  fprintf (stderr, "%s: stack underflow\n", proc_name);
95  return;
96  }
97  else sp--;
98 }
99 
100 /*
101  * La procedure "push_tmstack" empile et duplique le sommet
102  * de la pile des matrices de transformation.
103  */
104 void
105 push_tmstack (void)
106 {
107  if (sp == stack + STACKSIZE - 1) {
108  static char proc_name[] = "push_tmstack";
109  fprintf (stderr, "%s: stack overflow\n", proc_name);
110  return;
111  }
112  sp++;
113  //bcopy ((char *) (sp - 1), (char *) sp, sizeof (Matrix));
114  memmove ((char *) sp, (char *) (sp - 1), sizeof (Matrix));
115 }
116 
117 /*
118  * La procedure "swap_tmstack" echange les deux premieres matrices
119  * de la pile des matrices de transformation.
120  */
121 void
122 swap_tmstack (void)
123 {
124  Matrix *mp, tmp;
125 
126  mp = (sp == stack) ? sp + 1 : sp - 1;
127 // bcopy ((char *) *sp, (char *) tmp, sizeof (Matrix));
128 // bcopy ((char *) *mp, (char *) *sp, sizeof (Matrix));
129 // bcopy ((char *) tmp, (char *) *mp, sizeof (Matrix));
130  memmove ((char *) tmp, (char *) *sp, sizeof (Matrix));
131  memmove ((char *) *sp, (char *) *mp, sizeof (Matrix));
132  memmove ((char *) *mp, (char *) tmp, sizeof (Matrix));
133 }
134 
135 /*
136  * La procedure "postmult_tmstack" postmultiplie la matrice au sommet
137  * de la pile des matrices de transformation.
138  * Entree :
139  * m Matrice multiplicative.
140  */
141 void
142 postmult_tmstack (Matrix m)
143 {
144  postmult_matrix (*sp, m);
145 }
146 
147 /*
148  * La procedure "postrotate_tmstack" postmultiplie la matrice au sommet
149  * de la pile des matrices de transformation par une rotation.
150  * Entree :
151  * vp Vecteur de rotation.
152  */
153 void
154 postrotate_tmstack (Vector *vp)
155 {
156  Matrix m;
157 
158  Rotate_to_Matrix (vp, m);
159  postmult3_matrix (*sp, m);
160 }
161 
162 /*
163  * La procedure "postscale_tmstack" postmultiplie la matrice au sommet
164  * de la pile des matrices de transformation par une homothetie.
165  * Entree :
166  * vp Vecteur d'homothetie.
167  */
168 void
169 postscale_tmstack (Vector *vp)
170 {
171  postscale_matrix (*sp, vp);
172 }
173 
174 /*
175  * La procedure "posttranslate_tmstack" postmultiplie la matrice au sommet
176  * de la pile des matrices de transformation par une translation.
177  * Entree :
178  * vp Vecteur de translation.
179  */
180 void
181 posttranslate_tmstack (Vector *vp)
182 {
183  posttrans_matrix (*sp, vp);
184 }
185 
186 /*
187  * La procedure "premult_tmstack" premultiplie la matrice au sommet
188  * de la pile des matrices de transformation.
189  * Entree :
190  * m Matrice multiplicative.
191  */
192 void
193 premult_tmstack (Matrix m)
194 {
195  premult_matrix (*sp, m);
196 }
197 
198 /*
199  * La procedure "prerotate_tmstack" premultiplie la matrice au sommet
200  * de la pile des matrices de transformation par une rotation.
201  * Entree :
202  * vp Vecteur de rotation.
203  */
204 void
205 prerotate_tmstack (Vector *vp)
206 {
207  Matrix m;
208 
209  Rotate_to_Matrix (vp, m);
210  premult3_matrix (*sp, m);
211 }
212 
213 /*
214  * La procedure "prescale_tmstack" premultiplie la matrice au sommet
215  * de la pile des matrices de transformation par une homothetie.
216  * Entree :
217  * vp Vecteur d'homothetie.
218  */
219 void
220 prescale_tmstack (Vector *vp)
221 {
222  prescale_matrix (*sp, vp);
223 }
224 
225 /*
226  * La procedure "pretranslate_tmstack" premultiplie la matrice au sommet
227  * de la pile des matrices de transformation par une translation.
228  * Entree :
229  * vp Vecteur de translation.
230  */
231 void
232 pretranslate_tmstack (Vector *vp)
233 {
234  pretrans_matrix (*sp, vp);
235 }
236 
237 #endif
238