Visual Servoing Platform  version 3.6.1 under development (2024-11-15)
vpBound.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 fichier "bound.c" contient les procedures de gestion des scenes de
33  *modele geometrique surfacique.
34  *
35  * Authors:
36  * Jean-Luc CORRE
37  *
38 *****************************************************************************/
39 
40 #include <visp3/core/vpConfig.h>
41 #include <visp3/core/vpException.h>
42 
43 #ifndef DOXYGEN_SHOULD_SKIP_THIS
44 #include "vpArit.h"
45 #include "vpBound.h"
46 #include "vpMy.h"
47 #include <errno.h>
48 #include <math.h>
49 #include <stdio.h>
50 #include <stdlib.h>
51 #include <string.h>
52 
53 BEGIN_VISP_NAMESPACE
54 /*
55  * La procedure "free_Bound" libere la memoire d'une surface.
56  * Les champs "bound.face.edge" ne sont pas utilises.
57  * Entree :
58  * bp Surface a liberer.
59  */
60 void free_Bound(Bound *bp)
61 {
62  Face *fp = bp->face.ptr;
63  Face *fend = fp + bp->face.nbr;
64 
65  for (; fp < fend; fp++) { /* libere les polygones */
66  if (fp->vertex.ptr != fp->vertex.tbl)
67  free((char *)fp->vertex.ptr);
68  }
69  if (bp->face.ptr != NULL) { /* libere les faces */
70  free((char *)bp->face.ptr);
71  bp->face.ptr = NULL;
72  }
73  if (bp->point.ptr != NULL) { /* libere les points */
74  free((char *)bp->point.ptr);
75  bp->point.ptr = NULL;
76  }
77 #ifdef face_normal
78  if (bp->normal.ptr != NULL) { /* libere les vecteurs */
79  free((char *)bp->normal.ptr);
80  bp->normal.ptr = NULL;
81  }
82 #endif /* face_normal */
83  bp->is_display = FALSE;
84 }
85 
86 /*
87  * La procedure "free_huge_Bound" libere une surface de taille maximale.
88  * La particularite de cette surface est le tableau unique des sommets.
89  * Entree :
90  * bp Surface a liberer.
91  */
92 void free_huge_Bound(Bound *bp)
93 {
94  bp->face.nbr = 1; /* pour la liberation en une fois */
95  free_Bound(bp);
96 }
97 
98 /*
99  * La procedure "free_Bound_scene" libere une scene de surfaces.
100  * Entree :
101  * bsp Scene a liberer.
102  */
103 void free_Bound_scene(Bound_scene *bsp)
104 {
105  Bound *bp = bsp->bound.ptr;
106  Bound *bend = bp + bsp->bound.nbr;
107 
108  for (; bp < bend; bp++) { /* libere les surfaces */
109  free_Bound(bp);
110  }
111  if (bsp->name != NULL) { /* libere le nom */
112  free((char *)bsp->name);
113  bsp->name = NULL;
114  }
115  if (bsp->bound.ptr != NULL) { /* libere le tableau */
116  free((char *)bsp->bound.ptr);
117  bsp->bound.ptr = NULL;
118  }
119 }
120 
121 /*
122  * La procedure "malloc_Bound" alloue une surface.
123  * Les champs "bound.face.edge" ne sont pas utilises.
124  * Entree :
125  * bp Surface a allouer.
126  * type Type de la surface.
127  * polygonal Booleen indiquant si la surface est polygonale.
128  * fn Nombre de faces de la surface.
129  * pn Nombre de points de la surface.
130  */
131 void malloc_Bound(Bound *bp, Type type, int polygonal, Index fn, Index pn)
132 {
133  static char proc_name[] = "malloc_Bound";
134 
135  if ((bp->face.nbr = fn) == 0) /* faces */
136  bp->face.ptr = NULL;
137  else if ((bp->face.ptr = (Face *)malloc(fn * sizeof(Face))) == NULL) {
138  perror(proc_name);
139  throw vpException(vpException::fatalError, "Error in malloc_Bound");
140  }
141 
142  if ((bp->point.nbr = pn) == 0) /* points */
143  bp->point.ptr = NULL;
144  else if ((bp->point.ptr = (Point3f *)malloc(pn * sizeof(Point3f))) == NULL) {
145  perror(proc_name);
146  throw vpException(vpException::fatalError, "Error in malloc_Bound");
147  }
148 
149 #ifdef face_normal
150  /* normales aux sommets */
151  if ((bp->normal.nbr = (bp->is_polygonal ? 0 : pn)) == 0)
152  bp->normal.ptr = NULL;
153  else if ((bp->normal.ptr = (Vector *)malloc(pn * sizeof(Vector))) == NULL) {
154  perror(proc_name);
155  throw vpException(vpException::fatalError, "Error in malloc_Bound");
156  }
157 #endif /* face_normal */
158 
159  bp->type = type;
160  bp->is_display = TRUE;
161  bp->is_polygonal = (unsigned)polygonal;
162 }
163 
164 /*
165  * La procedure "malloc_huge_Bound" alloue une surface de taille maximale.
166  * La surface est adaptee pour la reception de tout type de surface.
167  * La surface allouee peut etre utilisee comme une surface de travail.
168  * Sa taille est definie par les macros "..._NBR" de "world.h".
169  * FACE_NBR : son nombre de faces
170  * POINT_NBR : son nombre de points
171  * VECTOR_NBR : son monbre de vecteurs
172  * VERTEX_NBR : son nombre de sommets par face.
173  * La particularite de la surface vient de l'allocation en une seule fois
174  * d'un tableau de sommets. Les polygones des faces ne sont pas initialiser,
175  * exepte celui de la premiere face qui est la base du tableau des sommets.
176  * Les champs "bound.face.edge" ne sont pas utilises.
177  * Entree :
178  * bp Surface maximale a allouer.
179  */
180 void malloc_huge_Bound(Bound *bp)
181 {
182 
183 #ifdef face_normal
184  malloc_Bound(bp, (Type)BND_NULL, FALSE, FACE_NBR, POINT_NBR);
185 #else
186  malloc_Bound(bp, (Type)BND_NULL, TRUE, FACE_NBR, POINT_NBR);
187 #endif /* face_normal */
188  if ((bp->face.ptr->vertex.ptr = (Index *)malloc(FACE_NBR * VERTEX_NBR * sizeof(Index))) == NULL) {
189  static char proc_name[] = "malloc_Huge_Bound";
190  perror(proc_name);
191  throw vpException(vpException::fatalError, "Error in malloc_huge_Bound");
192  }
193 }
194 
195 /*
196  * La procedure "malloc_Bound_scene" alloue une scene de surfaces.
197  * Stocke le nom de la scene et alloue l'espace memoire necessaire.
198  * Les champs "bound.face.edge" ne sont pas utilises.
199  * Entree :
200  * bsp Scene a allouer.
201  * name Nom de la scene.
202  * bn Nombre de surfaces de la scene.
203  */
204 void malloc_Bound_scene(Bound_scene *bsp, const char *name, Index bn)
205 {
206  static char proc_name[] = "malloc_Bound_scene";
207 
208  if ((bsp->name = (char *)malloc((strlen(name) + 1) * sizeof(char))) == NULL) {
209  perror(proc_name);
210  exit(1);
211  }
212  if ((bsp->bound.nbr = bn) == 0)
213  bsp->bound.ptr = NULL;
214  else if ((bsp->bound.ptr = (Bound *)malloc(bn * sizeof(Bound))) == NULL) {
215  perror(proc_name);
216  throw vpException(vpException::fatalError, "Error in malloc_Bound_scene");
217  }
218  strcpy(bsp->name, name);
219  bsp->bound.nbr = 0;
220 }
221 END_VISP_NAMESPACE
222 #endif
error that can be emitted by ViSP classes.
Definition: vpException.h:60
@ fatalError
Fatal error.
Definition: vpException.h:72