Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef QHPOINT_H
00010 #define QHPOINT_H
00011
00012 #include "QhullError.h"
00013 #include "QhullIterator.h"
00014 #include "UsingLibQhull.h"
00015 #include "Coordinates.h"
00016 extern "C" {
00017 #include "libqhull/qhull_a.h"
00018 }
00019
00020 #include <ostream>
00021
00022 namespace orgQhull {
00023
00024 #//Types
00025
00026 class QhullPoint;
00028 class QhullPointIterator;
00029
00030 class QhullPoint {
00031
00033
00034 private:
00035 #//Fields
00036 coordT *point_coordinates;
00037 int point_dimension;
00038
00039 public:
00040 #//Subtypes
00041 typedef const coordT * iterator;
00042 typedef const coordT * const_iterator;
00043 typedef QhullPoint::iterator Iterator;
00044 typedef QhullPoint::const_iterator ConstIterator;
00045
00046 #//Class methods -- Convert point to id w/o QhullQh data structure
00047 static int id(const coordT *c) { return QhullPoint::id(UsingLibQhull::NOqhRunId, 0, c); }
00048 static int id(int qhRunId, const coordT *c) { return QhullPoint::id(qhRunId, 0, c); }
00049 static int id(int qhRunId, int dimension, const coordT *c);
00050
00051 #//Construct
00052 QhullPoint() : point_coordinates(0), point_dimension(0) {};
00053 QhullPoint(int pointDimension, coordT *c) : point_coordinates(c), point_dimension(pointDimension) {}
00054 explicit QhullPoint(Coordinates &c) : point_coordinates(c.data()), point_dimension(c.count()) {}
00055
00056 QhullPoint(const QhullPoint &other) : point_coordinates(other.point_coordinates), point_dimension(other.point_dimension) {}
00057
00058 QhullPoint &operator=(const QhullPoint &other) { point_coordinates= other.point_coordinates; point_dimension= other.point_dimension; return *this; }
00059 ~QhullPoint() {}
00060
00061 #//Conversions
00062
00063 #ifndef QHULL_NO_STL
00064 std::vector<coordT> toStdVector() const;
00065 #endif //QHULL_NO_STL
00066 #ifdef QHULL_USES_QT
00067 QList<coordT> toQList() const;
00068 #endif //QHULL_USES_QT
00069
00070 #//Read-only
00071 public:
00072 const coordT *coordinates() const { return point_coordinates; }
00073 coordT *coordinates() { return point_coordinates; }
00074 int dimension() const { return point_dimension; }
00075 int id(int qhRunId) const { return id(qhRunId, dimension(), coordinates()); }
00076 int id() const { return id(UsingLibQhull::NOqhRunId, dimension(), coordinates()); }
00077 bool isDefined() const { return point_coordinates!=0 && point_dimension>0; }
00078
00079 #//Define
00080 void advancePoint(int idx) { point_coordinates += idx*point_dimension; }
00081 void defineAs(int pointDimension, coordT *c) { QHULL_ASSERT(pointDimension>=0); point_coordinates= c; point_dimension= pointDimension; }
00083 void defineAs(QhullPoint &other) { point_coordinates= other.coordinates(); point_dimension= other.dimension(); }
00084 void setCoordinates(coordT *c) { point_coordinates= c; }
00085 void setDimension(int pointDimension) { point_dimension= pointDimension; }
00086
00087 #//value
00088 double distance(const QhullPoint &p) const;
00089
00090 #//iterator
00091 iterator begin() { return point_coordinates; }
00092 const_iterator begin() const { return point_coordinates; }
00093 const_iterator constBegin() const { return point_coordinates; }
00094 const_iterator constEnd() const { return point_coordinates+point_dimension; }
00095 int count() { return dimension(); }
00096 iterator end() { return point_coordinates+point_dimension; }
00097 const_iterator end() const { return point_coordinates+point_dimension; }
00098 size_t size() { return (size_t)dimension(); }
00099
00100 #//Operator
00101 bool operator==(const QhullPoint &other) const;
00102 bool operator!=(const QhullPoint &other) const { return !operator==(other); }
00103 const coordT &operator[](int idx) const { QHULL_ASSERT(idx>=0 && idx<point_dimension); return *(point_coordinates+idx); }
00104 coordT &operator[](int idx) { QHULL_ASSERT(idx>=0 && idx<point_dimension); return *(point_coordinates+idx); }
00105
00106 struct PrintPoint{
00107 const QhullPoint *point;
00108 const char *point_message;
00109 int run_id;
00110 bool with_identifier;
00111 PrintPoint(int qhRunId, const char *message, bool withIdentifier, const QhullPoint &p) : point(&p), point_message(message), run_id(qhRunId), with_identifier(withIdentifier) {}
00112 };
00113 PrintPoint print() const { return PrintPoint(UsingLibQhull::NOqhRunId, "", false, *this); }
00114 PrintPoint print(int qhRunId) const { return PrintPoint(qhRunId, "", true, *this); }
00115 PrintPoint print(int qhRunId, const char *message) const { return PrintPoint(qhRunId, message, false, *this); }
00116 PrintPoint printWithIdentifier(int qhRunId, const char *message) const { return PrintPoint(qhRunId, message, true, *this); }
00117
00118 };
00119
00120 QHULL_DECLARE_SEQUENTIAL_ITERATOR(QhullPoint, coordT)
00121
00122 }
00123
00124 #//Global functions
00125
00126 std::ostream &operator<<(std::ostream &os, const orgQhull::QhullPoint::PrintPoint &pr);
00127 std::ostream &operator<<(std::ostream &os, const orgQhull::QhullPoint &p);
00128
00129 #endif // QHPOINT_H
00130