8 #define max(a,b)            (((a) > (b)) ? (a) : (b))    11 #define min(a,b)            (((a) < (b)) ? (a) : (b))    85                 if (fFromQueueOfPseudoSources) 
   163         bool fFromQueueOfPseudoSources(
false);          
   171                         fFromQueueOfPseudoSources = 
true;
   181                         fFromQueueOfPseudoSources = 
false;
   192                                 fFromQueueOfPseudoSources = 
true;
   198                                 fFromQueueOfPseudoSources = 
false;
   202         return fFromQueueOfPseudoSources;
   207         cout << 
"Experimental results are as follows:\n";
   209         cout << 
"Memory = " << 
m_memory << 
" Mega-bytes.\n";
   236         int degree = (int)
model.
Neigh(indexOfSourceVert).size();
   237         for (
int i = 0; i < degree; ++i) 
   242         for (
int i = 0; i < degree; ++i)
   250         for (map<int, double>::const_iterator it = 
m_sources.begin(); 
   261         int degree = (int)
model.
Neigh(indexOfParentVertex).size();
   262         const vector<pair<int, double> >& neighs = 
model.
Neigh(indexOfParentVertex);
   263         int indexOfParentOfParent = 
m_InfoAtVertices[indexOfParentVertex].indexOfDirectParent;
   265         double angleSumPlus(0);
   267         for (indexPlus = subIndex; indexPlus != (subIndex - 1 + degree) % degree; indexPlus = (indexPlus + 1) % degree)
   269                 angleSumPlus += neighs[indexPlus].second;
   273         double angleSumMinus = 0;
   275         for (indexMinus = (subIndex - 1 + degree) % degree; 
   276         indexMinus == (subIndex - 1 + degree) % degree || indexMinus != (indexPlus - 1 + degree) % degree; 
   277         indexMinus = (indexMinus - 1 + degree) % degree)
   279                 angleSumMinus += neighs[indexMinus].second;
   283         if (indexMinus == (indexPlus - 1 + degree) % degree)
   286         for (
int i = 0; i < degree; ++i)
   294         double propMinus = 1;
   296         double devirationAngle = 20. * M_PI / 180.0;
   297         double anglePlus = 
model.
Neigh(indexOfParentVertex)[indexPlus].second - (angleSumPlus - M_PI);
   299         if (
model.
Edge(
model.
Neigh(indexOfParentVertex)[indexPlus].first).indexOfOppositeVert != -1)
   301                 if (
model.
Neigh(indexOfParentVertex)[indexPlus].second 
   302                         < 2 * devirationAngle)
   306                 else if (angleSumPlus - M_PI < devirationAngle
   307                         || 
abs(anglePlus - 
model.
Neigh(indexOfParentVertex)[indexPlus].second) 
   309                         || 
model.
Neigh(indexOfParentVertex)[indexPlus].second
   310                         > M_PI - devirationAngle)
   312                         propPlus = (
model.
Neigh(indexOfParentVertex)[indexPlus].second - (angleSumPlus - M_PI))
   313                                 / 
model.
Neigh(indexOfParentVertex)[indexPlus].second
   314                                 - devirationAngle / 
model.
Neigh(indexOfParentVertex)[indexPlus].second;
   325                                 - devirationAngle / 
model.
Neigh(indexOfParentVertex)[indexPlus].second;
   331                 propPlus = 
max(0, propPlus);
   332                 propPlus = 
min(1, propPlus);
   335         double angleMinus = angleSumMinus - M_PI;
   336         if (
model.
Edge(
model.
Neigh(indexOfParentVertex)[indexMinus].first).indexOfOppositeVert != -1)
   338                 if (
model.
Neigh(indexOfParentVertex)[indexMinus].second 
   339                         < 2 * devirationAngle)
   343                 else if (angleSumMinus - M_PI < devirationAngle
   344                         || 
abs(angleSumMinus - M_PI - 
model.
Neigh(indexOfParentVertex)[indexMinus].second) 
   346                         || 
model.
Neigh(indexOfParentVertex)[indexMinus].second
   347                         > M_PI - devirationAngle)
   349                         propMinus = (angleSumMinus - M_PI) / 
model.
Neigh(indexOfParentVertex)[indexMinus].second
   350                                 + devirationAngle / 
model.
Neigh(indexOfParentVertex)[indexMinus].second;
   361                                 + devirationAngle / 
model.
Neigh(indexOfParentVertex)[indexMinus].second;
   367                 propMinus = 
max(0, propMinus);
   368                 propMinus = 
min(1, propMinus);
   372         for (
int i = indexPlus; i != (indexMinus + 1) % degree; i = (i + 1) % degree)
   380                         propR = 1 - propPlus;
   384                         propL = 1 - propMinus;
   393         int degree = (int)
model.
Neigh(indexOfParentVertex).size();
   394         const vector<pair<int, double> >& neighs = 
model.
Neigh(indexOfParentVertex);    
   395         int indexOfParentOfParent = 
m_InfoAtVertices[indexOfParentVertex].indexOfDirectParent;
   399         int subIndexRight = (subIndexLeft + 1) % degree;
   409         double anglePlus = 
acos((x1 * x2 + y1 * y2) / 
sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2)));
   410         double angleSumR(anglePlus);
   412         for (indexPlus = subIndexRight; indexPlus != subIndexLeft; indexPlus = (indexPlus + 1) % degree)
   414                 angleSumR += neighs[indexPlus].second;
   418         double angleSumL = neighs[subIndexLeft].second - anglePlus;
   420         for (indexMinus = (subIndexLeft - 1 + degree) % degree; indexMinus != (indexPlus - 1 + degree) % degree; indexMinus = (indexMinus - 1 + degree) % degree)
   422                 angleSumL += neighs[indexMinus].second;
   426         if (indexMinus == (indexPlus - 1 + degree) % degree)
   428         for (
int i = 0; i < degree; ++i)
   434         double propMinus = 1;
   438         double devirationAngle = 20. * M_PI / 180.;
   439         int minusEdge = 
model.
Neigh(indexOfParentVertex)[indexMinus].first;
   442                 double angleRemaining = angleSumL - M_PI;
   443                 if (
model.
Neigh(indexOfParentVertex)[indexMinus].second 
   444                         < 2 * devirationAngle)
   448                 else if (angleSumL - M_PI < devirationAngle
   449                         || 
abs(angleRemaining - 
model.
Neigh(indexOfParentVertex)[indexMinus].second)
   451                         || 
model.
Neigh(indexOfParentVertex)[indexMinus].second 
   452                         > M_PI - devirationAngle)
   454                         propMinus = angleRemaining / 
model.
Neigh(indexOfParentVertex)[indexMinus].second 
   455                                 + devirationAngle / 
model.
Neigh(indexOfParentVertex)[indexMinus].second;
   465                                 / 
sin(angleRemaining + 
   468                                 + devirationAngle / 
model.
Neigh(indexOfParentVertex)[indexMinus].second;
   476                 propMinus = 
max(0, propMinus);
   477                 propMinus = 
min(1, propMinus);
   480         int rightEdge = 
model.
Neigh(indexOfParentVertex)[indexPlus].first;
   483                 double angleRemaining = 
model.
Neigh(indexOfParentVertex)[indexPlus].second - (angleSumR - M_PI);
   484                 if (
model.
Neigh(indexOfParentVertex)[indexPlus].second 
   485                         < 2 * devirationAngle)
   489                 else if (angleSumR - M_PI < devirationAngle
   490                         || 
abs(angleRemaining) < devirationAngle
   491                         || 
model.
Neigh(indexOfParentVertex)[indexPlus].second 
   492                         > M_PI - devirationAngle)
   494                         propPlus = angleRemaining / 
model.
Neigh(indexOfParentVertex)[indexPlus].second
   495                                 - devirationAngle / 
model.
Neigh(indexOfParentVertex)[indexPlus].second;
   504                         propPlus = 
sin(angleRemaining) 
   508                                 - devirationAngle / 
model.
Neigh(indexOfParentVertex)[indexPlus].second;
   516                 propPlus = 
max(0, propPlus);
   517                 propPlus = 
min(1, propPlus);
   521         for (
int i = indexPlus; i != (indexMinus + 1) % degree; i = (i + 1) % degree)
   530                         propR = 1 - propPlus;
   534                         propL = 1 - propMinus;
   561         bool fLeftChildToCompute(
false), fRightChildToCompute(
false);
   562         bool fWIsWinning(
false);
   563         double totalDis = w.
disToRoot + disToAngle;
   567                 fLeftChildToCompute = fRightChildToCompute = 
true;
   575                         fLeftChildToCompute = fRightChildToCompute = 
true;
   581                         fLeftChildToCompute = fRightChildToCompute = 
true;
   587                         fRightChildToCompute = !fLeftChildToCompute;
   594                 if (fLeftChildToCompute)
   598                 if (fRightChildToCompute)
   625                         incidentVertex, totalDis));
   639         int indexOfIncidentEdge = 
model.
Neigh(source)[subIndexOfIncidentEdge].first;
 virtual void AddIntoQueueOfWindows(QuoteWindow "eW)
pair< double, double > coordOfPseudoSource
void ComputeTheOnlyRightTrimmedChild(const Window &w)
virtual void Initialize()
CChen_Han(const CRichModel &model, int source)
int GetNumOfFaces() const
pair< double, double > GetNew2DCoordinatesByRotatingAroundLeftChildEdge(int edgeIndex, const pair< double, double > &input2DCoordinates) const
vector< double > m_scalarField
map< int, double > m_sources
EIGEN_DEVICE_FUNC const SqrtReturnType sqrt() const
__int64 m_nTotalMilliSeconds
double DistanceToOppositeAngle(int edgeIndex, const pair< double, double > &coord) const
virtual void Initialize()
double ProportionOnLeftEdgeByImage(int edgeIndex, const pair< double, double > &coord, double proportion) const
pair< double, double > coordOfOppositeVert
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const AbsReturnType abs() const
const CEdge & Edge(int edgeIndex) const
void FillVertChildOfPseudoSource(int source, int subIndexOfVert)
bool fDirectParenIsPseudoSource
double ProportionOnRightEdgeByImage(int edgeIndex, const pair< double, double > &coord, double proportion) const
queue< QuoteInfoAtVertex > m_QueueForPseudoSources
virtual void CollectExperimentalResults()=0
int GetSubindexToVert(int root, int neigh) const
void ComputeRightTrimmedChildWithParent(const Window &w)
bool fBrachParentIsPseudoSource
void ComputeTheOnlyLeftChild(const Window &w)
pair< double, double > GetNew2DCoordinatesByRotatingAroundRightChildEdge(int edgeIndex, const pair< double, double > &input2DCoordinates) const
queue< QuoteWindow > m_QueueForWindows
virtual void CollectExperimentalResults()
double ProportionOnEdgeByImage(int edgeIndex, const pair< double, double > &coord) const
bool fDirectParentEdgeOnLeft
void ComputeTheOnlyRightChild(const Window &w)
void ComputeChildrenOfPseudoSourceFromPseudoSource(int indexOfParentVertex)
__int64 m_nCountOfWindows
void ComputeChildrenOfPseudoSourceFromWindow(int indexOfParentVertex)
bool IsExtremeEdge(int edgeIndex) const
void ComputeTheOnlyLeftTrimmedChild(const Window &w)
const vector< pair< int, double > > & Neigh(int root) const
EIGEN_DEVICE_FUNC const AcosReturnType acos() const
int GetNumOfVerts() const
bool IsStronglyConvexVert(int index) const
void ComputeChildrenOfSource()
void ComputeChildrenOfPseudoSource(int indexOfParentVertex)
const double LengthTolerance
pair< double, double > GetNew2DCoordinatesByReversingCurrentEdge(int edgeIndex, const pair< double, double > &input2DCoordinates) const
__int64 m_nMaxLenOfPseudoSourceQueue
void OutputExperimentalResults() const
virtual bool UpdateTreeDepthBackWithChoice()
void ComputeLeftTrimmedChildWithParent(const Window &w)
virtual void AddIntoQueueOfPseudoSources(const QuoteInfoAtVertex "eOfPseudoSource)
vector< InfoAtAngle > m_InfoAtAngles
vector< InfoAtVertex > m_InfoAtVertices
int GetNumOfEdges() const
bool IsTooNarrowWindow(const Window &w) const
void CreateIntervalChildOfPseudoSource(int source, int subIndexOfIncidentEdge, double propL=0, double propR=1)
__int64 m_nMaxLenOfWindowQueue
__int64 m_depthOfResultingTree
const double AngleTolerance
void ComputeChildrenOfWindow(QuoteWindow "eParentWindow)
EIGEN_DEVICE_FUNC const SinReturnType sin() const