LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
BeachLine.cxx
Go to the documentation of this file.
1 
8 // Framework Includes
9 
11 
12 // std includes
13 #include <string>
14 #include <functional>
15 #include <iostream>
16 #include <memory>
17 #include <queue>
18 
19 //------------------------------------------------------------------------------------------------------------------------------------------
20 // implementation follows
21 
22 namespace voronoi2d {
23 
24 BSTNode::BSTNode(IEvent* event, BSTNode* parent, BSTNode* leftChild, BSTNode* rightChild)
25 {
26  m_depth = 0;
27  m_event = event;
28  m_parent = parent;
29  m_leftChild = leftChild;
30  m_rightChild = rightChild;
31  m_predecessor = NULL;
32  m_successor = NULL;
33  m_associated = NULL;
34 
35  m_event->setBSTNode(this);
36 
37  // Reset depth
38  setDepth();
39 }
40 
42 {
44  {
45  int maxDepth = std::max(m_leftChild->getDepth(),m_rightChild->getDepth());
46 
47  m_depth = maxDepth + 1;
48  }
49  else m_depth = 0;
50 
51  // If we change depth at this level then need to ripple it up through the tree
52  if (m_parent) m_parent->setDepth();
53 
54  return;
55 }
56 
58 {
59  // Find the insertion point for the new event
60  BSTNode* node = findBestLeaf(event, m_root);
61 
62  // Insert it
63  node = insertNewLeaf(event, node);
64 
65  // Now rebalance starting at this node
66  rebalance(node);
67 
68  // Check beach line integrity
69 // checkBeachLine(event->xPos() - 0.000001);
70 
71  return node;
72 }
73 
75 {
76  // Assumption: a leaf will have NULL child pointers so the idea is to
77  // follow the left or right child pointers until we get to a leaf
78  BSTNode* node = topNode;
79 
80  // A leaf is found when the node has no children
81  if (node && node->getLeftChild() && node->getRightChild())
82  {
83  // This node represents a breakpoint between two arcs and we can
84  // recover these immediately by getting the predecessor and successor leafs
85  BSTNode* rightLeaf = node->getSuccessor();
86  BSTNode* leftLeaf = node->getPredecessor();
87 
88  // Which path do we follow down the tree?
89  if (m_utilities.newSiteToLeft(event, leftLeaf->getEvent(), rightLeaf->getEvent()))
90  node = findBestLeaf(event, node->getLeftChild());
91  else
92  node = findBestLeaf(event, node->getRightChild());
93  }
94 
95  return node;
96 }
97 
99 {
100  // The idea of this function is to insert a new Site Event into the beach line
101  // where it is assumed that the input node is the matched arc into which we
102  // insert the new site event.
103  // The function then returns the new leaf created which represents the new arc
104 
105  // Have we found a null pointer?
106  if (node == NULL)
107  {
108  m_nodeVec.push_back(BSTNode(event));
109  node = &m_nodeVec.back();
110  return node;
111  }
112 
113  // Check if a circle event had been definied for the node we are splitting,
114  // if so then we need to invalidate that circle event
115  if (node->getAssociated())
116  {
117  node->getAssociated()->getEvent()->setInvalid();
118  node->getAssociated()->setAssociated(NULL);
119  node->setAssociated(NULL);
120  }
121 
122  // Right now assume that the input node is the leaf at which we want to insert the new data
123  // For the beachline, this means we are inserting a new arc into the beachline by dividing the
124  // current arc. So we are going to replace the input leaf with a subtree having three leaves
125  // (two breakpoints)...
126  // Start by creating a node for the new arc
127  m_nodeVec.push_back(BSTNode(event)); // This will be the new site point
128 
129  BSTNode* newLeaf = &m_nodeVec.back();
130 
131  m_nodeVec.push_back(BSTNode(*node)); // This will be the new left leaf (the original arc)
132 
133  BSTNode* leftLeaf = &m_nodeVec.back();
134 
135  m_nodeVec.push_back(BSTNode(event)); // This will be the breakpoint between the left and new leaves
136 
137  BSTNode* breakNode = &m_nodeVec.back();
138 
139  m_nodeVec.push_back(BSTNode(event)); // Finally, this is the breakpoint between new and right leaves
140 
141  BSTNode* topNode = &m_nodeVec.back();
142 
143  // Set this to be the king of the local world
144  topNode->setParent(node->getParent());
145 
146  // Make sure the parent points to this new node
147  if (node->getParent())
148  {
149  if (node->getParent()->getLeftChild() == node) node->getParent()->setLeftChild(topNode);
150  else node->getParent()->setRightChild(topNode);
151  }
152  // But if there is no parent then the topnode is the new root
153  else m_root = topNode;
154 
155  // Set our children
156  topNode->setLeftChild(breakNode);
157  topNode->setRightChild(node);
158 
159  // Original node is now child of the top node
160  node->setParent(topNode);
161 
162  // If there was an associated circle event to this node, invalidate it
163  if (node->getAssociated())
164  {
165  node->getAssociated()->setAssociated(NULL);
166  node->getAssociated()->getEvent()->setInvalid();
167  node->setAssociated(NULL);
168  leftLeaf->setAssociated(NULL);
169  }
170 
171  // Now set the parent and children of the left breakpoint node
172  breakNode->setParent(topNode);
173  breakNode->setLeftChild(leftLeaf);
174  breakNode->setRightChild(newLeaf);
175 
176  // Finally set the leaves parents
177  leftLeaf->setParent(breakNode);
178  newLeaf->setParent(breakNode);
179 
180  // Now we wire up traversal chain, going left to right
181  leftLeaf->setPredecessor(node->getPredecessor());
182  leftLeaf->setSuccessor(breakNode);
183 
184  if (node->getPredecessor()) node->getPredecessor()->setSuccessor(leftLeaf);
185 
186  breakNode->setPredecessor(leftLeaf);
187  breakNode->setSuccessor(newLeaf);
188 
189  newLeaf->setPredecessor(breakNode);
190  newLeaf->setSuccessor(topNode);
191 
192  topNode->setPredecessor(newLeaf);
193  topNode->setSuccessor(node);
194  node->setPredecessor(topNode);
195 
196  // Finally, reset the depths
197  // By definition the break node will have depth of 1
198  breakNode->setDepth();
199 
200  // Check the beachline integrity
201  checkBeachLine(newLeaf->getEvent()->xPos()-0.00000001);
202 
203  return newLeaf;
204 }
205 
207 {
208  // The input node is assumed to be a leaf (arc) and is the disappearing arc
209  // between a leaf (arc) to the left and one to the right. There are breakpoints
210  // between the arcs.
211  // One of the intervening breakpoints is the parent of the leaf to remove
212  BSTNode* nodeParent = node->getParent();
213 
214  // parent of the parent
215  BSTNode* grandParent = nodeParent->getParent();
216 
217  // Parent is either left or right child, node is left or right child.... my brain is dizzy
218  BSTNode* sibling = nodeParent->getRightChild();
219 
220  if (node == sibling) sibling = nodeParent->getLeftChild();
221 
222  if (nodeParent == grandParent->getLeftChild()) grandParent->setLeftChild(sibling);
223  else grandParent->setRightChild(sibling);
224 
225  sibling->setParent(grandParent);
226 
227  // Now we need to deal with the predecessor/successor chain.
228  // This should be straightforward, we are removing the middle arc and the immediate parent
229  // breakpoint with the grandparent becoming the new breakpoint. It should be that we simply
230  // set the left arc's successor, the right arc's predecessor and make sure the grandparent points
231  // to the right objects.
232  // Also note that if here there MUST be a left and right arc
233  BSTNode* arcLeft = node->getPredecessor()->getPredecessor();
234  BSTNode* arcRight = node->getSuccessor()->getSuccessor();
235 
236  // Note as well that any circle events for those arcs are now invalid
237  if (arcLeft->getAssociated())
238  {
239  arcLeft->getAssociated()->getEvent()->setInvalid();
240  arcLeft->getAssociated()->setAssociated(NULL);
241  arcLeft->setAssociated(NULL);
242  }
243 
244  if (arcRight->getAssociated())
245  {
246  arcRight->getAssociated()->getEvent()->setInvalid();
247  arcRight->getAssociated()->setAssociated(NULL);
248  arcRight->setAssociated(NULL);
249  }
250 
251  // Basically, we need to connect the left and right arcs to their common break point
252  // What breakpoint that is will be determined by weather the arc we are removing is a
253  // left or right child
254  if (node == nodeParent->getLeftChild())
255  {
256  // In this case, the right arc's predecessor becomes the node's predecessor
257  // The left arc is all set
258  arcRight->setPredecessor(node->getPredecessor());
259  node->getPredecessor()->setSuccessor(arcRight);
260  }
261  else
262  {
263  // Here the left arc's successor is what needs to be changed
264  arcLeft->setSuccessor(node->getSuccessor());
265  node->getSuccessor()->setPredecessor(arcLeft);
266  }
267 
268  // zap the pointers for the removed nodes
269  node->setParent(NULL);
270  nodeParent->setLeftChild(NULL);
271  nodeParent->setRightChild(NULL);
272  nodeParent->setParent(NULL);
273  nodeParent->setSuccessor(NULL);
274  nodeParent->setPredecessor(NULL);
275  node->setSuccessor(NULL);
276  node->setPredecessor(NULL);
277  node->setHalfEdge(NULL);
278  node->setFace(NULL);
279 
280  // Reset the depth
281  grandParent->setDepth();
282 
283  // Check beach line integrity
284 // checkBeachLine(node->getAssociated()->getEvent()->xPos()-0.000001);
285 
286  // Rebalance
287  rebalance(grandParent);
288 
289  // Check beach line integrity
290  checkBeachLine(node->getAssociated()->getEvent()->xPos()-0.00000001);
291 
292  // Return the new breakpoint
293  return arcLeft->getSuccessor();
294 }
295 
297 {
298  int nodeCount(0);
299 
300  countNodes(m_root, nodeCount);
301 
302  return nodeCount;
303 }
304 
306 {
307  int leafCount(0);
308 
309  countLeaves(m_root, leafCount);
310 
311  return leafCount;
312 }
313 
314 void BeachLine::countNodes(const BSTNode* node, int& nodeCount) const
315 {
316  if (node)
317  {
318  if (node->getLeftChild()) countNodes(node->getLeftChild(), nodeCount);
319  if (node->getRightChild()) countNodes(node->getRightChild(), nodeCount);
320 
321  if ((node->getLeftChild() != NULL) != (node->getRightChild() != NULL))
322  {
323  std::cout << "****** Tree has one branch but not the other! *******" << std::endl;
324  }
325 
326  nodeCount++;
327  }
328 
329  return;
330 }
331 
332 void BeachLine::countLeaves(const BSTNode* node, int& leafCount) const
333 {
334  // If not a leaf then still have children to search
335  if (node->getLeftChild() && node->getRightChild())
336  {
337  countLeaves(node->getLeftChild(), leafCount);
338  countLeaves(node->getRightChild(), leafCount);
339  }
340  else leafCount += 1;
341 
342  return;
343 }
344 
346 {
347  int leafCount(0);
348 
349  // Starting with the root, dive down until we find a leaf
350  BSTNode* node = m_root;
351 
352  // Basically, follow the left branch down until we have no more children
353  while(node->getLeftChild()) node = node->getLeftChild();
354 
355  // Note that construction we should be a leaf, now we traverse across
356  // the beach line in both directions to get the leaf count
357  if (node)
358  {
359  leafCount += traverseBeachLeft(node->getPredecessor());
360  leafCount += traverseBeachRight(node->getSuccessor());
361 
362  // just to be sure...
363  if (!node->getLeftChild() && !node->getRightChild()) leafCount++;
364  }
365 
366  return leafCount;
367 }
368 
369 void BeachLine::checkBeachLine(double beachLine) const
370 {
371  // Starting with the root, dive down until we find the leftmost leaf
372  BSTNode* node = m_root;
373 
374  if (!node) return;
375 
376  // Basically, follow the left branch down until we have no more children
377  while(node->getLeftChild()) node = node->getLeftChild();
378 
379  // Keep track of breakpoints
380  double lastBreakPointY = -std::numeric_limits<double>::max();
381  int nBadCompares(0);
382  int nNodes(0);
383  int nBreakPoints(0);
384  int nLeaves(0);
385  BSTNode* lastBreakPoint(NULL);
386 
387  const double tolerance(1.e-5);
388 
389  // This is the start of the beach line, we now traverse across and and check status
390  // of each breakpoint's position
391  while(node->getSuccessor())
392  {
393  // Is this a breakpoint?
394  if (node->getLeftChild() && node->getRightChild())
395  {
396  RootsPair roots;
397  double breakPoint = m_utilities.computeBreak(beachLine, node->getPredecessor()->getEvent(), node->getSuccessor()->getEvent(), roots);
398 
399  if (breakPoint + tolerance < lastBreakPointY)
400  {
401  std::cout << " #####>> Beach line check gets bad breakpoint, last: " << lastBreakPointY << ", new: " << breakPoint << ", roots: " << roots.first << "/" << roots.second << std::endl;
402  std::cout << " Current left arc x,y: " << node->getPredecessor()->getEvent()->xPos() << ", " << node->getPredecessor()->getEvent()->yPos() << ", right arc x,y: " << node->getSuccessor()->getEvent()->xPos() << ", " << node->getSuccessor()->getEvent()->yPos() << ", beachLine: " << beachLine;
403  if (node->getPredecessor()->getAssociated()) std::cout << ", left: " << node->getPredecessor()->getAssociated()->getEvent()->isValid();
404  if (node->getSuccessor()->getAssociated()) std::cout << ", right: " << node->getSuccessor()->getAssociated()->getEvent()->isValid();
405  std::cout << std::endl;
406  if (lastBreakPoint)
407  {
408  std::cout << " Previous left arc x,y: " << lastBreakPoint->getPredecessor()->getEvent()->xPos() << ", " << lastBreakPoint->getPredecessor()->getEvent()->yPos() << ", right arc x,y: " << lastBreakPoint->getSuccessor()->getEvent()->xPos() << ", " << lastBreakPoint->getSuccessor()->getEvent()->yPos();
409  if (lastBreakPoint->getPredecessor()->getAssociated()) std::cout << ", left: " << lastBreakPoint->getPredecessor()->getAssociated()->getEvent()->isValid();
410  if (lastBreakPoint->getSuccessor()->getAssociated()) std::cout << ", right: " << lastBreakPoint->getSuccessor()->getAssociated()->getEvent()->isValid();
411  std::cout << std::endl;
412  }
413  nBadCompares++;
414  }
415 
416  lastBreakPointY = breakPoint;
417  lastBreakPoint = node;
418  nBreakPoints++;
419  }
420  else
421  {
422  // Confirm that the next leaf in the beachline is the next according to the tree
423  if (node->getSuccessor())
424  {
425  BSTNode* temp = node;
426  while(temp->getParent() && temp != temp->getParent()->getLeftChild()) temp = temp->getParent();
427  if (temp->getParent()) temp = temp->getParent()->getRightChild();
428  while(temp->getLeftChild()) temp = temp->getLeftChild();
429 
430  if (node->getSuccessor()->getSuccessor() != temp || node != temp->getPredecessor()->getPredecessor())
431  {
432  std::cout << " --> Successor tree/beach mismatch, leaf # " << nLeaves << ", node: " << node << ", " << node->getEvent()->xPos() << "/" << node->getEvent()->yPos() << ", s: " << node->getSuccessor() << ", ss: " << node->getSuccessor()->getSuccessor() << std::endl;
433  std::cout << " temp: " << temp << ", " << temp->getEvent()->xPos() << "/" << temp->getEvent()->yPos() << ", p: " << temp->getPredecessor() << ", pp: " << temp->getPredecessor()->getPredecessor() << std::endl;
434  }
435  }
436 
437  if (node->getPredecessor())
438  {
439  BSTNode* temp = node;
440  while(temp->getParent() && temp != temp->getParent()->getRightChild()) temp = temp->getParent();
441  if (temp->getParent()) temp = temp->getParent()->getLeftChild();
442  while(temp->getRightChild()) temp = temp->getRightChild();
443 
444  if (node->getPredecessor()->getPredecessor() != temp || node != temp->getSuccessor()->getSuccessor())
445  {
446  std::cout << " --> Predecessor tree/beach mismatch, leaf # " << nLeaves << ", node: " << node << ", " << node->getEvent()->xPos() << "/" << node->getEvent()->yPos() << ", p: " << node->getPredecessor() << ", pp: " << node->getPredecessor()->getPredecessor() << std::endl;
447  std::cout << " temp: " << temp << ", " << temp->getEvent()->xPos() << "/" << temp->getEvent()->yPos() << ", s: " << temp->getSuccessor() << ", ss: " << temp->getSuccessor()->getSuccessor() << std::endl;
448  }
449  }
450 
451  nLeaves++;
452  }
453 
454  nNodes++;
455 
456  node = node->getSuccessor();
457  }
458 
459  if (nBadCompares > 0) std::cout << "=======>> Beach line check resulted in " << nBadCompares << " bad compares of " << nBreakPoints << " break points checked, with " << nLeaves << " leaves" << std::endl;
460 
461 // std::cout << "-------------------------------------------------------------------------------------------------------" << std::endl;
462 
463  return;
464 }
465 
467 {
468  int leafCount(0);
469 
470  if (node)
471  {
472  // Keep traversing
473  if (node->getPredecessor()) leafCount += traverseBeachLeft(node->getPredecessor());
474 
475  // Are we also a leaf?
476  if (!node->getLeftChild() && !node->getRightChild()) leafCount++;
477  }
478 
479  return leafCount;
480 }
481 
483 {
484  int leafCount(0);
485 
486  if (node)
487  {
488  // Keep traversing
489  if (node->getSuccessor()) leafCount += traverseBeachRight(node->getSuccessor());
490 
491  // Are we also a leaf?
492  if (!node->getLeftChild() && !node->getRightChild()) leafCount++;
493  }
494 
495  return leafCount;
496 }
497 
498 int BeachLine::getTreeDepth(const BSTNode* node) const
499 {
500  int depth(0);
501 
502  // Node exists and its not a leaf
503  if (node && node->getLeftChild() && node->getRightChild())
504  {
505  depth = std::max(getTreeDepth(node->getLeftChild()),getTreeDepth(node->getRightChild()));
506 
507  depth++;
508  }
509  else if (node && (node->getLeftChild() || node->getRightChild()))
510  {
511  std::cout << "****** Found a node which only one child: " << node << ", L/R: " << node->getLeftChild() << "/" << node->getRightChild() << std::endl;
512  }
513 
514  return depth;
515 }
516 
518 {
519  // The idea is to rebalance starting with the current node and the walking back up the branch
520  // until we reach the ultimate parent.
521  // First, if at internal node then check depth down either branch
522  if (node->getLeftChild() && node->getRightChild())
523  {
524  int depthLeft = getTreeDepth(node->getLeftChild());
525  int depthRight = getTreeDepth(node->getRightChild());
526 
527  if (depthLeft != node->getLeftChild()->getDepth() || depthRight != node->getRightChild()->getDepth())
528  {
529  std::cout << " --> node depth: " << getTreeDepth(node) << ", left/right: " << depthLeft << "/" << node->getLeftChild()->getDepth() << ", " << depthRight << "/" << node->getRightChild()->getDepth() << ", parent/depth " << node->getParent() << "/" << getTreeDepth(node->getParent()) << std::endl;
530  }
531 
532  // If left branch is longer then we rotate with the left child
533  if (depthLeft - depthRight > 2) node = rotateWithLeftChild(node);
534  else if (depthRight - depthLeft > 2) node = rotateWithRightChild(node);
535  }
536 
537  // Ok now rebalance the parent unless we are the root
538  if (node->getParent()) rebalance(node->getParent());
539  // In which case update the internal root node pointer
540  else m_root = node;
541 
542  return;
543 }
544 
546 {
547  // Here we rebalance by rotating the root node with its left child
548  BSTNode* newTopNode = node->getLeftChild();
549  BSTNode* parent = node->getParent();
550 
551  // Check if there is a parent and if so make sure it points at the new node
552  if (parent)
553  {
554  if (parent->getLeftChild() == node) parent->setLeftChild(newTopNode);
555  else parent->setRightChild(newTopNode);
556  }
557  // if no parent this the new root
558  else m_root = newTopNode;
559 
560  // Swap parents (for the root node the parent is null)
561  newTopNode->setParent(parent);
562  node->setParent(newTopNode);
563 
564  // Reset the children
565  BSTNode* childToSwitch = newTopNode->getRightChild();
566 
567  childToSwitch->setParent(node);
568  node->setLeftChild(childToSwitch);
569  newTopNode->setRightChild(node);
570 
571  // Reset node depth
572  node->getLeftChild()->setDepth();
573 
574  return newTopNode;
575 }
576 
578 {
579  // Here we rebalance by rotating the root node with its left child
580  BSTNode* newTopNode = node->getRightChild();
581  BSTNode* parent = node->getParent();
582 
583  // Check if there is a parent and if so make sure it points at the new node
584  if (parent)
585  {
586  if (parent->getLeftChild() == node) parent->setLeftChild(newTopNode);
587  else parent->setRightChild(newTopNode);
588  }
589  // if no parent this the new root
590  else m_root = newTopNode;
591 
592  // Swap parents (for the root node the parent is null)
593  newTopNode->setParent(parent);
594  node->setParent(newTopNode);
595 
596  // Reset the children
597  BSTNode* childToSwitch = newTopNode->getLeftChild();
598 
599  childToSwitch->setParent(node);
600  node->setRightChild(childToSwitch);
601  newTopNode->setLeftChild(node);
602 
603  // Reset node depths
604  node->getRightChild()->setDepth();
605 
606  return newTopNode;
607 }
608 
609 
610 } // namespace lar_cluster3d
void checkBeachLine(double) const
Definition: BeachLine.cxx:369
BSTNode * rotateWithLeftChild(BSTNode *)
Definition: BeachLine.cxx:545
IEvent * m_event
Definition: BeachLine.h:111
void setRightChild(BSTNode *node)
Definition: BeachLine.h:93
void setSuccessor(BSTNode *node)
Definition: BeachLine.h:95
BSTNode * m_associated
Definition: BeachLine.h:117
BSTNode class definiton specifically for use in constructing Voronoi diagrams. We are trying to follo...
Definition: BeachLine.h:32
void setDepth(int depth)
Definition: BeachLine.h:101
void rebalance(BSTNode *)
Tree balancing functions.
Definition: BeachLine.cxx:517
BSTNode * getParent() const
Definition: BeachLine.h:78
int getTreeDepth(const BSTNode *) const
This recovers the depth of longest branch in the tree below input node.
Definition: BeachLine.cxx:498
Represents the beachline implemented as a self balancing binary search tree.
BSTNode * findBestLeaf(const IEvent *event) const
Definition: BeachLine.h:137
BSTNode * getAssociated() const
Definition: BeachLine.h:83
int countLeaves() const
Definition: BeachLine.cxx:305
BSTNode * m_successor
Definition: BeachLine.h:116
Int_t max
Definition: plot.C:27
BSTNode * insertNewLeaf(IEvent *)
Definition: BeachLine.cxx:57
BSTNode * m_predecessor
Definition: BeachLine.h:115
void setLeftChild(BSTNode *node)
Definition: BeachLine.h:92
virtual double yPos() const =0
void setParent(BSTNode *node)
Allow setting of the points.
Definition: BeachLine.h:91
BSTNode * getRightChild() const
Definition: BeachLine.h:80
BSTNode * m_parent
Definition: BeachLine.h:112
virtual void setBSTNode(BSTNode *)=0
int traverseBeachLeft(BSTNode *) const
Definition: BeachLine.cxx:466
BSTNode * removeLeaf(BSTNode *)
Definition: BeachLine.cxx:206
void setAssociated(BSTNode *node)
Definition: BeachLine.h:96
virtual bool isValid() const =0
BSTNode()
Constructor.
Definition: BeachLine.h:38
int traverseBeachRight(BSTNode *) const
Definition: BeachLine.cxx:482
virtual double xPos() const =0
int getDepth() const
recover the data members
Definition: BeachLine.h:76
int traverseBeach() const
Definition: BeachLine.cxx:345
int countNodes() const
Definition: BeachLine.cxx:296
BSTNode * getPredecessor() const
Definition: BeachLine.h:81
BSTNode * rotateWithRightChild(BSTNode *)
Definition: BeachLine.cxx:577
BSTNode * m_leftChild
Definition: BeachLine.h:113
std::pair< double, double > RootsPair
void setFace(dcel2d::Face *face)
Definition: BeachLine.h:99
Float_t e
Definition: plot.C:34
void setPredecessor(BSTNode *node)
Definition: BeachLine.h:94
virtual void setInvalid() const =0
Interface for configuring the particular algorithm tool.
IEvent * getEvent() const
Definition: BeachLine.h:77
BSTNode * getSuccessor() const
Definition: BeachLine.h:82
BSTNode * m_rightChild
Definition: BeachLine.h:114
BSTNode * getLeftChild() const
Definition: BeachLine.h:79
Event finding and building.
void setHalfEdge(dcel2d::HalfEdge *half)
Definition: BeachLine.h:98