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