Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "UsingLibQhull.h"
00010 #include "QhullPoint.h"
00011
00012 #include <iostream>
00013 #include <algorithm>
00014
00015 #ifdef _MSC_VER // Microsoft Visual C++ -- warning level 4
00016 #endif
00017
00018 namespace orgQhull {
00019
00020 #//Class public variables and methods
00021
00023 int QhullPoint::
00024 id(int qhRunId, int dimension, const coordT *c)
00025 {
00026 QHULL_UNUSED(dimension);
00027
00028 if(UsingLibQhull::hasPoints()){
00029 if(qhRunId==UsingLibQhull::NOqhRunId){
00030 const coordT *pointsEnd;
00031 int dim;
00032 const coordT *points= UsingLibQhull::globalPoints(&dim, &pointsEnd);
00033 if(c>=points && c<pointsEnd){
00034 int offset= (int)(c-points);
00035 return offset/dim;
00036 }
00037 }else{
00038 UsingLibQhull q(qhRunId);
00039
00040 return qh_pointid(const_cast<coordT *>(c));
00041 }
00042 }
00043 long long i=(long long)c;
00044 return (int)i;
00045 }
00046
00047 #//Conversion
00048
00049
00050
00051 #ifndef QHULL_NO_STL
00052 std::vector<coordT> QhullPoint::
00053 toStdVector() const
00054 {
00055 QhullPointIterator i(*this);
00056 std::vector<coordT> vs;
00057 while(i.hasNext()){
00058 vs.push_back(i.next());
00059 }
00060 return vs;
00061 }
00062 #endif //QHULL_NO_STL
00063
00064 #//Operator
00065
00066 bool QhullPoint::
00067 operator==(const QhullPoint &other) const
00068 {
00069 if(point_dimension!=other.point_dimension){
00070 return false;
00071 }
00072 const coordT *c= point_coordinates;
00073 const coordT *c2= other.point_coordinates;
00074 if(c==c2){
00075 return true;
00076 }
00077 double dist2= 0.0;
00078 for(int k= point_dimension; k--; ){
00079 double diff= *c++ - *c2++;
00080 dist2 += diff*diff;
00081 }
00082 double epsilon= UsingLibQhull::globalDistanceEpsilon();
00083
00084 return (dist2<=(epsilon*epsilon));
00085 }
00086
00087
00088 #//Value
00089
00091 double QhullPoint::
00092 distance(const QhullPoint &p) const
00093 {
00094 const coordT *c= coordinates();
00095 const coordT *c2= p.coordinates();
00096 int dim= dimension();
00097 QHULL_ASSERT(dim==p.dimension());
00098 double dist;
00099
00100 switch(dim){
00101 case 2:
00102 dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]);
00103 break;
00104 case 3:
00105 dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]);
00106 break;
00107 case 4:
00108 dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]);
00109 break;
00110 case 5:
00111 dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]) + (c[4]-c2[4])*(c[4]-c2[4]);
00112 break;
00113 case 6:
00114 dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]) + (c[4]-c2[4])*(c[4]-c2[4]) + (c[5]-c2[5])*(c[5]-c2[5]);
00115 break;
00116 case 7:
00117 dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]) + (c[4]-c2[4])*(c[4]-c2[4]) + (c[5]-c2[5])*(c[5]-c2[5]) + (c[6]-c2[6])*(c[6]-c2[6]);
00118 break;
00119 case 8:
00120 dist= (c[0]-c2[0])*(c[0]-c2[0]) + (c[1]-c2[1])*(c[1]-c2[1]) + (c[2]-c2[2])*(c[2]-c2[2]) + (c[3]-c2[3])*(c[3]-c2[3]) + (c[4]-c2[4])*(c[4]-c2[4]) + (c[5]-c2[5])*(c[5]-c2[5]) + (c[6]-c2[6])*(c[6]-c2[6]) + (c[7]-c2[7])*(c[7]-c2[7]);
00121 break;
00122 default:
00123 dist= 0.0;
00124 for(int k=dim; k--; ){
00125 dist += (*c - *c2) * (*c - *c2);
00126 ++c;
00127 ++c2;
00128 }
00129 break;
00130 }
00131 return sqrt(dist);
00132 }
00133
00134 }
00135
00136 #//Global functions
00137
00138 using std::ostream;
00139 using orgQhull::QhullPoint;
00140 using orgQhull::UsingLibQhull;
00141
00142 #//operator<<
00143
00144 ostream &
00145 operator<<(ostream &os, const QhullPoint &p)
00146 {
00147 os << p.printWithIdentifier(UsingLibQhull::NOqhRunId, "");
00148 return os;
00149 }
00150
00152 ostream &
00153 operator<<(ostream &os, const QhullPoint::PrintPoint &pr)
00154 {
00155 QhullPoint p= *pr.point;
00156 int i= p.id(pr.run_id);
00157 if(pr.point_message){
00158 if(*pr.point_message){
00159 os << pr.point_message << " ";
00160 }
00161 if(pr.with_identifier && (i!=-1)){
00162 os << "p" << i << ": ";
00163 }
00164 }
00165 const realT *c= p.coordinates();
00166 for(int k=p.dimension(); k--; ){
00167 realT r= *c++;
00168 if(pr.point_message){
00169 os << " " << r;
00170 }else{
00171 os << " " << r;
00172 }
00173 }
00174 os << std::endl;
00175 return os;
00176 }
00177