2
2
* vim: ts=4 sw=4 et tw=0 wm=0
4
4
* libavoid - Fast, Incremental, Object-avoiding Line Router
5
* Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
6
* Copyright (C) 2004-2009 Monash University
7
8
* --------------------------------------------------------------------
8
9
* Much of the code in this module is based on code published with
18
19
* modify it under the terms of the GNU Lesser General Public
19
20
* License as published by the Free Software Foundation; either
20
21
* version 2.1 of the License, or (at your option) any later version.
22
* See the file LICENSE.LGPL distributed with the library.
24
* Licensees holding a valid commercial license may use this file in
25
* accordance with the commercial license agreement provided with the
22
28
* This library is distributed in the hope that it will be useful,
23
29
* but WITHOUT ANY WARRANTY; without even the implied warranty of
24
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25
* Lesser General Public License for more details.
30
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
27
* You should have received a copy of the GNU Lesser General Public
28
* License along with this library; if not, write to the Free Software
29
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32
* Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
35
37
#define _GEOMETRY_H
37
39
#include "libavoid/geomtypes.h"
40
#include "libavoid/assertions.h"
42
extern double dist(const Point& a, const Point& b);
43
extern double totalLength(const Polygn& poly);
45
extern double euclideanDist(const Point& a, const Point& b);
46
extern double manhattanDist(const Point& a, const Point& b);
47
extern double totalLength(const Polygon& poly);
44
48
extern double angle(const Point& a, const Point& b, const Point& c);
45
49
extern bool segmentIntersect(const Point& a, const Point& b,
46
50
const Point& c, const Point& d);
47
extern bool inPoly(const Polygn& poly, const Point& q);
48
extern bool inPolyGen(const Polygn& poly, const Point& q);
51
extern bool segmentShapeIntersect(const Point& e1, const Point& e2,
52
const Point& s1, const Point& s2, bool& seenIntersectionAtEndpoint);
53
extern bool inPoly(const Polygon& poly, const Point& q, bool countBorder = true);
54
extern bool inPolyGen(const PolygonInterface& poly, const Point& q);
49
55
extern bool inValidRegion(bool IgnoreRegions, const Point& a0,
50
56
const Point& a1, const Point& a2, const Point& b);
51
57
extern int cornerSide(const Point &c1, const Point &c2, const Point &c3,
59
extern bool pointOnLine(const Point& a, const Point& b, const Point& c,
60
const double tolerance = 0.0);
62
// To be used only when the points are known to be colinear.
63
extern bool inBetween(const Point& a, const Point& b, const Point& c);
55
66
// Direction from vector.
62
73
// Based on the code of 'AreaSign'.
64
static inline int vecDir(const Point& a, const Point& b, const Point& c)
75
// The 'maybeZero' argument can be used to adjust the tolerance of the
76
// function. It will be most accurate when 'maybeZero' == 0.0, the default.
78
static inline int vecDir(const Point& a, const Point& b, const Point& c,
79
const double maybeZero = 0.0)
81
COLA_ASSERT(maybeZero >= 0);
66
83
double area2 = ((b.x - a.x) * (c.y - a.y)) -
67
84
((c.x - a.x) * (b.y - a.y));
86
if (area2 < (-maybeZero))
73
else if (area2 > 0.001)
90
else if (area2 > maybeZero)
100
117
static const int PARALLEL = 3;
101
118
extern int segmentIntersectPoint(const Point& a1, const Point& a2,
102
119
const Point& b1, const Point& b2, double *x, double *y);
120
extern int rayIntersectPoint(const Point& a1, const Point& a2,
121
const Point& b1, const Point& b2, double *x, double *y);