utils.cpp
Go to the documentation of this file.
1 
29 #include <console_bridge/console.h>
30 #include <octomap/octomap.h>
32 
35 
36 namespace tesseract_geometry
37 {
38 bool isIdentical(const Geometry& geom1, const Geometry& geom2)
39 {
40  if (geom1.getType() != geom2.getType())
41  return false;
42 
43  switch (geom1.getType())
44  {
45  case GeometryType::BOX:
46  {
47  const auto& s1 = static_cast<const Box&>(geom1);
48  const auto& s2 = static_cast<const Box&>(geom2);
49 
50  if (std::abs(s1.getX() - s2.getX()) > std::numeric_limits<double>::epsilon())
51  return false;
52 
53  if (std::abs(s1.getY() - s2.getY()) > std::numeric_limits<double>::epsilon())
54  return false;
55 
56  if (std::abs(s1.getZ() - s2.getZ()) > std::numeric_limits<double>::epsilon())
57  return false;
58 
59  break;
60  }
62  {
63  const auto& s1 = static_cast<const Sphere&>(geom1);
64  const auto& s2 = static_cast<const Sphere&>(geom2);
65 
66  if (std::abs(s1.getRadius() - s2.getRadius()) > std::numeric_limits<double>::epsilon())
67  return false;
68 
69  break;
70  }
72  {
73  const auto& s1 = static_cast<const Cylinder&>(geom1);
74  const auto& s2 = static_cast<const Cylinder&>(geom2);
75 
76  if (std::abs(s1.getRadius() - s2.getRadius()) > std::numeric_limits<double>::epsilon())
77  return false;
78 
79  if (std::abs(s1.getLength() - s2.getLength()) > std::numeric_limits<double>::epsilon())
80  return false;
81 
82  break;
83  }
84  case GeometryType::CONE:
85  {
86  const auto& s1 = static_cast<const Cone&>(geom1);
87  const auto& s2 = static_cast<const Cone&>(geom2);
88 
89  if (std::abs(s1.getRadius() - s2.getRadius()) > std::numeric_limits<double>::epsilon())
90  return false;
91 
92  if (std::abs(s1.getLength() - s2.getLength()) > std::numeric_limits<double>::epsilon())
93  return false;
94 
95  break;
96  }
98  {
99  const auto& s1 = static_cast<const Capsule&>(geom1);
100  const auto& s2 = static_cast<const Capsule&>(geom2);
101 
102  if (std::abs(s1.getRadius() - s2.getRadius()) > std::numeric_limits<double>::epsilon())
103  return false;
104 
105  if (std::abs(s1.getLength() - s2.getLength()) > std::numeric_limits<double>::epsilon())
106  return false;
107 
108  break;
109  }
110  case GeometryType::PLANE:
111  {
112  const auto& s1 = static_cast<const Plane&>(geom1);
113  const auto& s2 = static_cast<const Plane&>(geom2);
114 
115  if (std::abs(s1.getA() - s2.getA()) > std::numeric_limits<double>::epsilon())
116  return false;
117 
118  if (std::abs(s1.getB() - s2.getB()) > std::numeric_limits<double>::epsilon())
119  return false;
120 
121  if (std::abs(s1.getC() - s2.getC()) > std::numeric_limits<double>::epsilon())
122  return false;
123 
124  if (std::abs(s1.getD() - s2.getD()) > std::numeric_limits<double>::epsilon())
125  return false;
126 
127  break;
128  }
129  case GeometryType::MESH:
130  {
131  const auto& s1 = static_cast<const Mesh&>(geom1);
132  const auto& s2 = static_cast<const Mesh&>(geom2);
133 
134  if (s1.getVertexCount() != s2.getVertexCount())
135  return false;
136 
137  if (s1.getFaceCount() != s2.getFaceCount())
138  return false;
139 
140  if (s1.getFaces() != s2.getFaces())
141  return false;
142 
143  if (s1.getVertices() != s2.getVertices())
144  return false;
145 
146  break;
147  }
149  {
150  const auto& s1 = static_cast<const ConvexMesh&>(geom1);
151  const auto& s2 = static_cast<const ConvexMesh&>(geom2);
152 
153  if (s1.getVertexCount() != s2.getVertexCount())
154  return false;
155 
156  if (s1.getFaceCount() != s2.getFaceCount())
157  return false;
158 
159  if (s1.getFaces() != s2.getFaces())
160  return false;
161 
162  if (s1.getVertices() != s2.getVertices())
163  return false;
164 
165  break;
166  }
168  {
169  const auto& s1 = static_cast<const SDFMesh&>(geom1);
170  const auto& s2 = static_cast<const SDFMesh&>(geom2);
171 
172  if (s1.getVertexCount() != s2.getVertexCount())
173  return false;
174 
175  if (s1.getFaceCount() != s2.getFaceCount())
176  return false;
177 
178  if (s1.getFaces() != s2.getFaces())
179  return false;
180 
181  if (s1.getVertices() != s2.getVertices())
182  return false;
183 
184  break;
185  }
187  {
188  const auto& s1 = static_cast<const Octree&>(geom1);
189  const auto& s2 = static_cast<const Octree&>(geom2);
190 
191  const std::shared_ptr<const octomap::OcTree>& octree1 = s1.getOctree();
192  const std::shared_ptr<const octomap::OcTree>& octree2 = s2.getOctree();
193 
194  if (octree1->getTreeType() != octree2->getTreeType())
195  return false;
196 
197  if (octree1->size() != octree2->size())
198  return false;
199 
200  if (octree1->getTreeDepth() != octree2->getTreeDepth())
201  return false;
202 
203  if (octree1->memoryUsage() != octree2->memoryUsage())
204  return false;
205 
206  if (octree1->memoryFullGrid() != octree2->memoryFullGrid())
207  return false;
208 
209  break;
210  }
212  {
213  const auto& s1 = static_cast<const PolygonMesh&>(geom1);
214  const auto& s2 = static_cast<const PolygonMesh&>(geom2);
215 
216  if (s1.getVertexCount() != s2.getVertexCount())
217  return false;
218 
219  if (s1.getFaceCount() != s2.getFaceCount())
220  return false;
221 
222  if (s1.getFaces() != s2.getFaces())
223  return false;
224 
225  if (s1.getVertices() != s2.getVertices())
226  return false;
227 
228  break;
229  }
231  {
232  const auto& s1 = static_cast<const CompoundMesh&>(geom1);
233  const auto& s2 = static_cast<const CompoundMesh&>(geom2);
234 
235  if (s1.getMeshes().size() != s2.getMeshes().size())
236  return false;
237 
238  for (std::size_t i = 0; i < s1.getMeshes().size(); ++i)
239  {
240  if (!isIdentical(*s1.getMeshes()[i], *s2.getMeshes()[i]))
241  return false;
242  }
243 
244  break;
245  }
246  default:
247  {
248  CONSOLE_BRIDGE_logError("This geometric shape type (%d) is not supported", static_cast<int>(geom1.getType()));
249  return false;
250  }
251  }
252 
253  return true;
254 }
255 } // namespace tesseract_geometry
tesseract_geometry::ConvexMesh
Definition: convex_mesh.h:45
tesseract_geometry::GeometryType::COMPOUND_MESH
@ COMPOUND_MESH
tesseract_geometry::Mesh
Definition: mesh.h:45
tesseract_geometry::GeometryType::CONE
@ CONE
tesseract_geometry::Octree
Definition: octree.h:58
tesseract_geometry::Geometry
Definition: geometry.h:69
tesseract_geometry::Plane
Definition: plane.h:44
tesseract_geometry::Sphere
Definition: sphere.h:44
tesseract_geometry::isIdentical
bool isIdentical(const Geometry &geom1, const Geometry &geom2)
Check if two Geometries are identical.
Definition: utils.cpp:38
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_geometry::GeometryType::MESH
@ MESH
tesseract_geometry::GeometryType::CYLINDER
@ CYLINDER
utils.h
Tesseract Geometry Utility Function.
tesseract_geometry::Octree::getOctree
const std::shared_ptr< const octomap::OcTree > & getOctree() const
Definition: octree.cpp:49
tesseract_geometry::SDFMesh
Definition: sdf_mesh.h:45
tesseract_geometry::Cylinder
Definition: cylinder.h:44
tesseract_geometry::GeometryType::PLANE
@ PLANE
tesseract_geometry::GeometryType::SPHERE
@ SPHERE
tesseract_geometry::GeometryType::CAPSULE
@ CAPSULE
tesseract_geometry::Capsule
Definition: capsule.h:44
tesseract_geometry::GeometryType::SDF_MESH
@ SDF_MESH
geometries.h
Tesseract Geometries.
tesseract_geometry::PolygonMesh
Definition: polygon_mesh.h:51
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
tesseract_geometry::Geometry::getType
GeometryType getType() const
Get the geometry type.
Definition: geometry.cpp:42
tesseract_geometry::GeometryType::BOX
@ BOX
tesseract_geometry
Definition: fwd.h:31
tesseract_geometry::GeometryType::OCTREE
@ OCTREE
tesseract_geometry::GeometryType::POLYGON_MESH
@ POLYGON_MESH
tesseract_geometry::GeometryType::CONVEX_MESH
@ CONVEX_MESH
macros.h
tesseract_geometry::Cone
Definition: cone.h:44
tesseract_geometry::Box
Definition: box.h:44
tesseract_geometry::CompoundMesh
This is store meshes that are associated with as single resource.
Definition: compound_mesh.h:49


tesseract_geometry
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:46