advancing_front.cc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
  3. * http://code.google.com/p/poly2tri/
  4. *
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without modification,
  8. * are permitted provided that the following conditions are met:
  9. *
  10. * * Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the following disclaimer.
  12. * * Redistributions in binary form must reproduce the above copyright notice,
  13. * this list of conditions and the following disclaimer in the documentation
  14. * and/or other materials provided with the distribution.
  15. * * Neither the name of Poly2Tri nor the names of its contributors may be
  16. * used to endorse or promote products derived from this software without specific
  17. * prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  23. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. */
  31. #include "advancing_front.h"
  32. namespace p2t {
  33. AdvancingFront::AdvancingFront(Node& head, Node& tail)
  34. {
  35. head_ = &head;
  36. tail_ = &tail;
  37. search_node_ = &head;
  38. }
  39. Node* AdvancingFront::LocateNode(double x)
  40. {
  41. Node* node = search_node_;
  42. if (x < node->value) {
  43. while ((node = node->prev) != NULL) {
  44. if (x >= node->value) {
  45. search_node_ = node;
  46. return node;
  47. }
  48. }
  49. } else {
  50. while ((node = node->next) != NULL) {
  51. if (x < node->value) {
  52. search_node_ = node->prev;
  53. return node->prev;
  54. }
  55. }
  56. }
  57. return NULL;
  58. }
  59. Node* AdvancingFront::FindSearchNode(double x)
  60. {
  61. (void)x; // suppress compiler warnings "unused parameter 'x'"
  62. // TODO: implement BST index
  63. return search_node_;
  64. }
  65. Node* AdvancingFront::LocatePoint(const Point* point)
  66. {
  67. const double px = point->x;
  68. Node* node = FindSearchNode(px);
  69. const double nx = node->point->x;
  70. if (px == nx) {
  71. if (point != node->point) {
  72. // We might have two nodes with same x value for a short time
  73. if (point == node->prev->point) {
  74. node = node->prev;
  75. } else if (point == node->next->point) {
  76. node = node->next;
  77. } else {
  78. assert(0);
  79. }
  80. }
  81. } else if (px < nx) {
  82. while ((node = node->prev) != NULL) {
  83. if (point == node->point) {
  84. break;
  85. }
  86. }
  87. } else {
  88. while ((node = node->next) != NULL) {
  89. if (point == node->point)
  90. break;
  91. }
  92. }
  93. if(node) search_node_ = node;
  94. return node;
  95. }
  96. AdvancingFront::~AdvancingFront()
  97. {
  98. }
  99. }