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