utility.h
上传用户:chinasdcnc
上传日期:2022-07-02
资源大小:2702k
文件大小:3k
源码类别:

分形几何

开发平台:

Visual C++

  1. //
  2. // Delaunay Triangulation
  3. //
  4. // Homework of CG lesson (Fall 2009) in Tsinghua University.
  5. // All rights reserved.
  6. //
  7. #pragma once
  8. #include "edge.h"
  9. #include <vector>
  10. using namespace std;
  11. /**
  12.  * Makes a new edge.
  13.  */
  14. Edge* makeEdge(void);
  15. /**
  16.  * This operator affects the two edge rings around the origins of a and b,
  17.  * and, independently, the two edge rings around the left faces of a and b.
  18.  * In each case, (i) if the two rings are distinct, Splice will combine
  19.  * them into one; (ii) if the two are the same ring, Splice will break it
  20.  * into two separate pieces.
  21.  * Thus, Splice can be used both to attach the two edges together, and
  22.  * to break them apart. See Guibas and Stolfi (1985) p.96 for more details
  23.  * and illustrations.
  24.  */
  25. void splice(Edge* a, Edge* b);
  26. /**
  27.  * Deletes the edge @c e.
  28.  */
  29. void deleteEdge(Edge* e);
  30. /**
  31.  * Adds a new edge e connecting the destination of a to the
  32.  * origin of b, in such a way that all three have the same
  33.  * left face after the connection is complete.
  34.  * Additionally, the data pointers of the new edge are set.
  35.  */
  36. Edge* connect(Edge* a, Edge* b);
  37. /**
  38.  * Essentially turns edge e counterclockwise inside its enclosing
  39.  * quadrilateral. The data pointers are modified accordingly.
  40.  */
  41. void swap(Edge* e);
  42. /**
  43.  * Returns twice the area of the oriented triangle (a, b, c), i.e., the
  44.  * area is positive if the triangle is oriented counterclockwise.
  45.  */
  46. double triarea(const Point2d& a, const Point2d& b, const Point2d& c);
  47. /**
  48.  * Returns TRUE if the point d is inside the circle defined by the
  49.  * points a, b, c. See Guibas and Stolfi (1985) p.107.
  50.  */
  51. bool inCircle(const Point2d& a, const Point2d& b,
  52.               const Point2d& c, const Point2d& d);
  53. /**
  54.  * Returns TRUE if the points a, b, c are in a counterclockwise order.
  55.  */
  56. bool ccw(const Point2d& a, const Point2d& b, const Point2d& c);
  57. /**
  58.  * @return true when the point @c x is to the right of the edge @c e.
  59.  */
  60. bool rightOf(const Point2d& x, Edge* e);
  61. /**
  62.  * @return true when the point @c x is to the left of the edge @c e.
  63.  */
  64. bool leftOf(const Point2d& x, Edge* e);
  65. /**
  66.  * A predicate that determines if the point x is on the edge e.
  67.  * The point is considered on if it is in the EPS-neighborhood
  68.  * of the edge.
  69.  */
  70. bool onEdge(const Point2d& x, Edge* e);
  71. /**
  72.  * test whether the edge e is above edge basel
  73.  */
  74. bool valid(Edge* e, Edge* basel);
  75. /**
  76.  * Returns an edge e either x is on e, or e is an edge of a triangle containing x.
  77.  */
  78. Edge* locate(const Point2d &x, Edge* startEdge);
  79. /**
  80.  * Tests whether two lines intersected, line1 defined by p1, p2, line2 defined by p3, p4
  81.  */
  82. bool lineIntersected(const Point2d& p1, const Point2d& p2, const Point2d& p3, const Point2d& p4);
  83. /**
  84.  * Returns edges which belongs to triangles which intersected by line defined by p1 and p2
  85.  */
  86. void intersectedTris(Point2d& p1, Point2d& p2, vector<Edge *>& edges, Edge* startEdge);
  87. /**
  88.  * Tests whether the point x is inside the triangles.
  89.  */
  90. bool testInside(const Point2d& x, Edge* startEdge);
  91. /**
  92.  * If point p1 is outside the triangles, search for the nearest intersect edge for p1.
  93.  */
  94. Edge* searchIntersectedEdge(Point2d& p1, Point2d& p2, Edge* startEdge);
  95. /**
  96.  * Calculates the parameters of circum circle for a specified triangle.
  97.  */
  98. void circumCircle(const Point2d& p1, const Point2d& p2, const Point2d& p3,
  99.                   Point2d* pCenter, double* radius);