28 #ifndef opengl_CPolyhedron_H
29 #define opengl_CPolyhedron_H
37 using namespace mrpt::utils;
38 using namespace mrpt::poses;
81 if (e.
v1==v1&&e.
v2==v2)
return true;
82 else return e.
v1==v2&&e.
v2==v1;
87 double length(
const vector<TPoint3D> &vs)
const;
116 double area(
const vector<TPoint3D> &vertices)
const;
120 void getCenter(
const vector<TPoint3D> &vertices,
TPoint3D &p)
const;
157 vector<TPolyhedronFace> aux;
158 for (vector<vector<uint32_t> >::
const_iterator it=faces.begin();it!=faces.end();++it) {
163 return Create(vertices,aux);
176 static CPolyhedronPtr Create(
const std::vector<math::TPolygon3D> &polys);
190 CPolyhedronPtr tetra=CreateJohnsonSolidWithConstantBase(3,radius*sqrt(8.0)/3.0,
"P+");
201 if (radius==0.0)
return CreateEmpty();
202 double r=radius/sqrt(3.0);
203 return CreateCubicPrism(-r,r,-r,r,-r,r);
212 return CreateJohnsonSolidWithConstantBase(4,radius,
"P-P+");
220 return CreateIcosahedron(radius/sqrt(15-6*sqrt(5.0)))->
getDual();
229 double s2=4*
square(sin(ang));
230 double prop=sqrt(s2-1)+sqrt(s2-2+2*cos(ang))/2;
231 return CreateJohnsonSolidWithConstantBase(5,radius/prop,
"P-AP+",1);
244 inline static CPolyhedronPtr CreateTruncatedTetrahedron(
double radius) {
245 return CreateTetrahedron(radius*sqrt(27.0/11.0))->
truncate(2.0/3.0);
254 return CreateHexahedron(radius*sqrt(1.5))->
truncate(1.0);
261 inline static CPolyhedronPtr CreateTruncatedHexahedron(
double radius) {
262 return CreateHexahedron(radius*sqrt(3.0/(5-sqrt(8.0))))->
truncate(2-sqrt(2.0));
269 inline static CPolyhedronPtr CreateTruncatedOctahedron(
double radius) {
270 return CreateOctahedron(radius*3/sqrt(5.0))->
truncate(2.0/3.0);
278 inline static CPolyhedronPtr CreateRhombicuboctahedron(
double radius,
bool type=
true) {
279 return CreateJohnsonSolidWithConstantBase(8,radius/sqrt(1+
square(sin(
M_PI/8))),type?
"C-PRC+":
"GC-PRC+",3);
288 inline static CPolyhedronPtr CreateIcosidodecahedron(
double radius,
bool type=
true) {
289 return CreateJohnsonSolidWithConstantBase(10,radius,type?
"GR-R+":
"R-R+",1);
296 inline static CPolyhedronPtr CreateTruncatedDodecahedron(
double radius) {
297 return CreateDodecahedron(radius*sqrt(45.0)/sqrt(27+6*sqrt(5.0)))->
truncate(1-sqrt(0.2));
304 inline static CPolyhedronPtr CreateTruncatedIcosahedron(
double radius) {
305 return CreateIcosahedron(radius*sqrt(45.0)/sqrt(25+4*sqrt(5.0)))->
truncate(2.0/3.0);
312 inline static CPolyhedronPtr CreateRhombicosidodecahedron(
double radius) {
313 return CreateIcosahedron(radius*sqrt(10.0/(35.0+9.0*sqrt(5.0))))->
cantellate(1.5*(sqrt(5.0)-1));
325 inline static CPolyhedronPtr CreatePentagonalRotunda(
double radius) {
326 return CreateJohnsonSolidWithConstantBase(10,radius,
"R+");
339 inline static CPolyhedronPtr CreateTriakisTetrahedron(
double radius) {
340 return CreateTruncatedTetrahedron(radius*3/sqrt(33.0))->
getDual();
348 inline static CPolyhedronPtr CreateRhombicDodecahedron(
double radius) {
349 return CreateCuboctahedron(radius/sqrt(2.0))->
getDual();
357 inline static CPolyhedronPtr CreateTriakisOctahedron(
double radius) {
358 return CreateTruncatedHexahedron(radius/sqrt((5-sqrt(8.0))))->
getDual();
366 inline static CPolyhedronPtr CreateTetrakisHexahedron(
double radius) {
367 return CreateTruncatedOctahedron(radius*sqrt(0.6))->
getDual();
375 inline static CPolyhedronPtr CreateDeltoidalIcositetrahedron(
double radius) {
376 return CreateRhombicuboctahedron(radius/sqrt(7-sqrt(32.0)),
true)->
getDual();
384 inline static CPolyhedronPtr CreateRhombicTriacontahedron(
double radius) {
385 return CreateIcosidodecahedron(radius*sqrt(2/(5-sqrt(5.0))),
true)->
getDual();
393 inline static CPolyhedronPtr CreateTriakisIcosahedron(
double radius) {
394 return CreateTruncatedDodecahedron(radius*sqrt(5/(25-8*sqrt(5.0))))->
getDual();
402 inline static CPolyhedronPtr CreatePentakisDodecahedron(
double radius) {
403 return CreateTruncatedIcosahedron(radius*sqrt(3/(17-6*sqrt(5.0))))->
getDual();
411 inline static CPolyhedronPtr CreateDeltoidalHexecontahedron(
double radius) {
412 return CreateRhombicosidodecahedron(radius*3.0/sqrt(15-2*sqrt(5.0)))->
getDual();
424 static CPolyhedronPtr CreateCubicPrism(
double x1,
double x2,
double y1,
double y2,
double z1,
double z2);
430 return CreateCubicPrism(p1.
x,p2.
x,p1.
y,p2.
y,p1.
z,p2.
z);
436 static CPolyhedronPtr CreatePyramid(
const vector<TPoint2D> &baseVertices,
double height);
441 static CPolyhedronPtr CreateDoublePyramid(
const vector<TPoint2D> &baseVertices,
double height1,
double height2);
447 static CPolyhedronPtr CreateTruncatedPyramid(
const vector<TPoint2D> &baseVertices,
double height,
double ratio);
452 inline static CPolyhedronPtr CreateFrustum(
const vector<TPoint2D> &baseVertices,
double height,
double ratio) {
453 return CreateTruncatedPyramid(baseVertices,height,ratio);
459 inline static CPolyhedronPtr CreateCustomPrism(
const vector<TPoint2D> &baseVertices,
double height) {
460 return CreateTruncatedPyramid(baseVertices,height,1.0);
466 static CPolyhedronPtr CreateCustomAntiprism(
const vector<TPoint2D> &bottomBase,
const vector<TPoint2D> &topBase,
double height);
476 static CPolyhedronPtr CreateBifrustum(
const vector<TPoint2D> &baseVertices,
double height1,
double ratio1,
double height2,
double ratio2);
481 static CPolyhedronPtr CreateTrapezohedron(uint32_t numBaseEdges,
double baseRadius,
double basesDistance);
486 inline static CPolyhedronPtr CreateRegularAntiprism(uint32_t numBaseEdges,
double baseRadius,
double height) {
487 return CreateCustomAntiprism(generateBase(numBaseEdges,baseRadius),generateShiftedBase(numBaseEdges,baseRadius),height);
493 inline static CPolyhedronPtr CreateRegularPrism(uint32_t numBaseEdges,
double baseRadius,
double height) {
494 return CreateCustomPrism(generateBase(numBaseEdges,baseRadius),height);
500 inline static CPolyhedronPtr CreateRegularPyramid(uint32_t numBaseEdges,
double baseRadius,
double height) {
501 return CreatePyramid(generateBase(numBaseEdges,baseRadius),height);
507 inline static CPolyhedronPtr CreateRegularDoublePyramid(uint32_t numBaseEdges,
double baseRadius,
double height1,
double height2) {
508 return CreateDoublePyramid(generateBase(numBaseEdges,baseRadius),height1,height2);
514 inline static CPolyhedronPtr CreateArchimedeanRegularPrism(uint32_t numBaseEdges,
double baseRadius) {
515 return CreateJohnsonSolidWithConstantBase(numBaseEdges,baseRadius,
"PR");
521 inline static CPolyhedronPtr CreateArchimedeanRegularAntiprism(uint32_t numBaseEdges,
double baseRadius) {
522 return CreateJohnsonSolidWithConstantBase(numBaseEdges,baseRadius,
"A");
528 inline static CPolyhedronPtr CreateRegularTruncatedPyramid(uint32_t numBaseEdges,
double baseRadius,
double height,
double ratio) {
529 return CreateTruncatedPyramid(generateBase(numBaseEdges,baseRadius),height,ratio);
535 inline static CPolyhedronPtr CreateRegularFrustum(uint32_t numBaseEdges,
double baseRadius,
double height,
double ratio) {
536 return CreateRegularTruncatedPyramid(numBaseEdges,baseRadius,height,ratio);
542 inline static CPolyhedronPtr CreateRegularBifrustum(uint32_t numBaseEdges,
double baseRadius,
double height1,
double ratio1,
double height2,
double ratio2) {
543 return CreateBifrustum(generateBase(numBaseEdges,baseRadius),height1,ratio1,height2,ratio2);
549 inline static CPolyhedronPtr CreateCupola(uint32_t numBaseEdges,
double edgeLength) {
550 return CreateJohnsonSolidWithConstantBase(numBaseEdges,edgeLength/(2*sin(
M_PI/numBaseEdges)),
"C+");
557 inline static CPolyhedronPtr CreateCatalanTrapezohedron(uint32_t numBaseEdges,
double height) {
558 return CreateArchimedeanRegularAntiprism(numBaseEdges,height)->
getDual();
565 inline static CPolyhedronPtr CreateCatalanDoublePyramid(uint32_t numBaseEdges,
double height) {
566 return CreateArchimedeanRegularPrism(numBaseEdges,height)->
getDual();
598 static CPolyhedronPtr CreateJohnsonSolidWithConstantBase(uint32_t numBaseEdges,
double baseRadius,
const std::string &components,
size_t shifts=0);
606 void render_dl()
const;
615 inline void getVertices(vector<TPoint3D> &vertices)
const {
621 inline void getEdges(vector<TPolyhedronEdge> &edges)
const {
627 inline void getFaces(vector<TPolyhedronFace> &faces)
const {
633 inline uint32_t getNumberOfVertices()
const {
634 return mVertices.size();
639 inline uint32_t getNumberOfEdges()
const {
640 return mEdges.size();
645 inline uint32_t getNumberOfFaces()
const {
646 return mFaces.size();
651 void getEdgesLength(vector<double> &lengths)
const;
655 void getFacesArea(vector<double> &areas)
const;
659 double getVolume()
const;
663 inline bool isWireframe()
const {
669 inline void setWireframe(
bool enabled=
true) {
676 inline double getLineWidth()
const {
682 inline void setLineWidth(
double lineWidth) {
683 mLineWidth=lineWidth;
690 void getSetOfPolygons(std::vector<math::TPolygon3D> &vec)
const;
695 void getSetOfPolygonsAbsolute(std::vector<math::TPolygon3D> &vec)
const;
701 std::vector<TPolygon3D> polys1,polys2;
709 inline bool isClosed()
const {
710 for (
size_t i=0;i<mVertices.size();i++)
if (edgesInVertex(i)!=facesInVertex(i))
return false;
716 void makeConvexPolygons();
720 void getCenter(TPoint3D ¢er)
const;
724 static CPolyhedronPtr CreateRandomPolyhedron(
double radius);
734 CPolyhedronPtr getDual()
const;
740 CPolyhedronPtr truncate(
double factor)
const;
745 CPolyhedronPtr cantellate(
double factor)
const;
750 CPolyhedronPtr augment(
double height)
const;
755 CPolyhedronPtr augment(
double height,
size_t numVertices)
const;
761 CPolyhedronPtr augment(
bool direction=
false)
const;
767 CPolyhedronPtr augment(
size_t numVertices,
bool direction=
false)
const;
772 CPolyhedronPtr rotate(
double angle)
const;
778 CPolyhedronPtr scale(
double factor)
const;
784 void updatePolygons()
const;
789 static vector<TPoint2D> generateBase(uint32_t numBaseEdges,
double baseRadius);
793 static vector<TPoint2D> generateShiftedBase(uint32_t numBaseEdges,
double baseRadius);
797 static void generateBase(uint32_t numBaseEdges,
double baseRadius,
double height,vector<TPoint3D> &vec);
801 static void generateShiftedBase(uint32_t numBaseEdges,
double baseRadius,
double height,
double shift,vector<TPoint3D> &vec);
805 bool setNormal(TPolyhedronFace &f,
bool doCheck=
true);
809 void addEdges(
const TPolyhedronFace &e);
813 static bool checkConsistence(
const vector<TPoint3D> &vertices,
const vector<TPolyhedronFace> &faces);
817 size_t edgesInVertex(
size_t vertex)
const;
821 size_t facesInVertex(
size_t vertex)
const;
825 inline CPolyhedron():mVertices(),mEdges(),mFaces(),mWireframe(false),mLineWidth(1),polygonsUpToDate(false) {}
829 inline CPolyhedron(
const vector<TPoint3D> &vertices,
const vector<TPolyhedronFace> &faces,
bool doCheck=
true):mVertices(vertices),mEdges(),mFaces(faces),mWireframe(false),mLineWidth(1),polygonsUpToDate(false) {
830 if (doCheck)
if (!checkConsistence(vertices,faces))
throw std::logic_error(
"Face list accesses a vertex out of range");
832 if (!setNormal(*it,doCheck))
throw std::logic_error(
"Bad face specification");
839 inline static CPolyhedronPtr CreateNoCheck(
const vector<TPoint3D> &vertices,
const vector<TPolyhedronFace> &faces) {
871 using namespace mrpt::opengl;