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