/**************************************************************************** ** ** Copyright (C) 2008-2010 C.B. Barber. All rights reserved. ** $Id: //product/qhull/main/rel/cpp/Qhull.h#39 $$Change: 1193 $ ** $DateTime: 2010/01/23 11:31:35 $$Author: bbarber $ ** ****************************************************************************/ #ifndef QHULLCPP_H #define QHULLCPP_H #include "QhullQh.h" #include "RboxPoints.h" #include "QhullLinkedList.h" #include "QhullPoint.h" #include "QhullPoints.h" #include "QhullVertex.h" #include "QhullFacet.h" #include <stdarg.h> #include <string> #include <vector> #include <sstream> #include <iostream> #if qh_QHpointer != 1 #error qh_QHpointer is not set. Please set it in user.h or #error compile Qhull with -Dqh_QHpointer. The C++ classes #error require dynamic allocation for Qhulls global data #error structure qhT (QhullQh). #endif namespace orgQhull { /*** Compile qhullcpp and libqhull with the same compiler. setjmp() and longjmp() must be the same. */ #//Types //! Qhull -- run Qhull from C++ class Qhull; //Defined elsewhere class QhullFacetList; class RboxPoints; class Qhull { private: #//Members and friends QhullQh *qhull_qh; //! qh_qh for this instance int qhull_run_id; //! qh.run_id at initialization (catch multiple runs if !qh_QHpointer) Coordinates origin_point; //! origin for qhull_dimension. Set by runQhull() int qhull_status; //! qh_ERRnone if valid int qhull_dimension; //! Dimension of result (qh.hull_dim or one less for Delaunay/Voronoi) bool run_called; //! True at start of runQhull. Errors if call again. bool qh_active; //! True if global pointer qh_qh equals qhull_qh std::string qhull_message; std::ostream *error_stream; //! overrides errorMessage, use appendQhullMessage() std::ostream *output_stream; //! send output to stream friend void ::qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... ); friend class UsingLibQhull; #//Attribute public: Coordinates feasiblePoint; //! feasible point for half-space intersection bool useOutputStream; //! Set if using outputStream // FIXUP QH11003 feasiblePoint useOutputStream as field or getter? #//constructor, assignment, destructor, invariant Qhull(); //! Qhull::runQhull() must be called next Qhull(const RboxPoints &points, const char *qhullCommand); Qhull(const char *rboxCommand, int pointDimension, int pointCount, const realT *points, const char *qhullCommand); // Throws error if other.initialized(). Needed for return by value and parameter passing Qhull(const Qhull &other); // Throws error if initialized() or other.initialized(). Needed for vector<Qhull> Qhull &operator=(const Qhull &other); ~Qhull() throw(); private: void initializeQhull(); public: #//virtual methods //FIXUP QH11004 -- qh_memfree, etc. as virtual? #//Messaging void appendQhullMessage(const std::string &s); void clearQhullMessage(); std::string qhullMessage() const; bool hasQhullMessage() const; int qhullStatus() const; void setErrorStream(std::ostream *os); void setOutputStream(std::ostream *os); #//GetSet void checkIfQhullInitialized(); bool initialized() const { return qhull_dimension>0; } int dimension() const { return qhull_dimension; } int hullDimension() const { return qhullQh()->hull_dim; } // non-const due to QhullPoint QhullPoint origin() { QHULL_ASSERT(initialized()); return QhullPoint(dimension(), origin_point.data()); } QhullQh *qhullQh() const { return qhull_qh; }; int runId(); // Modifies my_qhull #//GetQh -- access to qhT (Qhull's global data structure) const char *qhullCommand() const { return qhull_qh->qhull_command; } const char *rboxCommand() const { return qhull_qh->rbox_command; } int facetCount() const { return qhull_qh->num_facets; } int vertexCount() const { return qhull_qh->num_vertices; } #//GetValue double area(); double volume(); #//ForEach QhullFacet beginFacet() const { return QhullFacet(qhull_qh->facet_list); } QhullVertex beginVertex() const { return QhullVertex(qhull_qh->vertex_list); } QhullFacet endFacet() const { return QhullFacet(qhull_qh->facet_tail); } QhullVertex endVertex() const { return QhullVertex(qhull_qh->vertex_tail); } QhullFacetList facetList() const; QhullFacet firstFacet() const { return beginFacet(); } QhullVertex firstVertex() const { return beginVertex(); } QhullPoints points() const; QhullPointSet otherPoints() const; //! Same as points().coordinates() coordT *pointCoordinateBegin() const { return qhull_qh->first_point; } coordT *pointCoordinateEnd() const { return qhull_qh->first_point + qhull_qh->num_points*qhull_qh->hull_dim; } QhullVertexList vertexList() const; #//Modify void outputQhull(); void outputQhull(const char * outputflags); void runQhull(const RboxPoints &points, const char *qhullCommand); void runQhull(const char *rboxCommand, int pointDimension, int pointCount, const realT *points, const char *qhullCommand); private: #//Helpers void initializeFeasiblePoint(int hulldim); void maybeThrowQhullMessage(int exitCode); void maybeThrowQhullMessage(int exitCode, int noThrow) throw(); };//Qhull }//namespace orgQhull #endif // QHULLCPP_H