Branch data Line data Source code
1 : : /*
2 : : * libpal - Automated Placement of Labels Library
3 : : *
4 : : * Copyright (C) 2008 Maxence Laurent, MIS-TIC, HEIG-VD
5 : : * University of Applied Sciences, Western Switzerland
6 : : * http://www.hes-so.ch
7 : : *
8 : : * Contact:
9 : : * maxence.laurent <at> heig-vd <dot> ch
10 : : * or
11 : : * eric.taillard <at> heig-vd <dot> ch
12 : : *
13 : : * This file is part of libpal.
14 : : *
15 : : * libpal is free software: you can redistribute it and/or modify
16 : : * it under the terms of the GNU General Public License as published by
17 : : * the Free Software Foundation, either version 3 of the License, or
18 : : * (at your option) any later version.
19 : : *
20 : : * libpal is distributed in the hope that it will be useful,
21 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 : : * GNU General Public License for more details.
24 : : *
25 : : * You should have received a copy of the GNU General Public License
26 : : * along with libpal. If not, see <http://www.gnu.org/licenses/>.
27 : : *
28 : : */
29 : :
30 : : #ifndef PAL_GEOM_FUNCTION
31 : : #define PAL_GEOM_FUNCTION
32 : :
33 : : #define SIP_NO_FILE
34 : :
35 : :
36 : : #include "qgis_core.h"
37 : : #include <cmath>
38 : : #include "qgsgeos.h"
39 : :
40 : : namespace pal
41 : : {
42 : :
43 : : /**
44 : : * \ingroup core
45 : : * \brief Pal labeling engine geometry functions.
46 : : * \class pal::GeomFunction
47 : : * \note not available in Python bindings
48 : : */
49 : : class CORE_EXPORT GeomFunction
50 : : {
51 : : public:
52 : :
53 : : /*
54 : : * o(x2,y2)
55 : : * /
56 : : * cp > 0 /
57 : : * / cp < 0
58 : : * /
59 : : * /
60 : : * o (x1, y1)
61 : : */
62 : 0 : static inline double cross_product( double x1, double y1, double x2, double y2, double x3, double y3 )
63 : : {
64 : 0 : return ( x2 - x1 ) * ( y3 - y1 ) - ( x3 - x1 ) * ( y2 - y1 );
65 : : }
66 : :
67 : 0 : static inline double dist_euc2d( double x1, double y1, double x2, double y2 )
68 : : {
69 : 0 : return std::sqrt( ( x2 - x1 ) * ( x2 - x1 ) + ( y2 - y1 ) * ( y2 - y1 ) );
70 : : }
71 : :
72 : 0 : static inline double dist_euc2d_sq( double x1, double y1, double x2, double y2 )
73 : : {
74 : 0 : return ( x2 - x1 ) * ( x2 - x1 ) + ( y2 - y1 ) * ( y2 - y1 );
75 : : }
76 : :
77 : : static void findLineCircleIntersection( double cx, double cy, double radius,
78 : : double x1, double y1, double x2, double y2,
79 : : double &xRes, double &yRes );
80 : :
81 : : /**
82 : : * \brief Compute the convex hull in O(n·log(n))
83 : : * \param id set of point (i.e. point no 0 is (x,y) = x[id[0]],y[id[0]])
84 : : * \param x x coordinates
85 : : * \param y y coordinates
86 : : * \returns convexHull vertex ids
87 : : */
88 : : static std::vector< int > convexHullId( std::vector<int> &id, const std::vector< double > &x, const std::vector< double > &y );
89 : :
90 : : /**
91 : : * Returns TRUE if the two segments intersect.
92 : : */
93 : : static bool isSegIntersects( double x1, double y1, double x2, double y2, // 1st segment
94 : : double x3, double y3, double x4, double y4 ); // 2nd segment
95 : :
96 : : /**
97 : : * Compute the point where two lines intersect.
98 : : * \returns TRUE if the lines intersect, or FALSE if the lines are parallel
99 : : */
100 : : static bool computeLineIntersection( double x1, double y1, double x2, double y2, // 1st line (segment)
101 : : double x3, double y3, double x4, double y4, // 2nd line segment
102 : : double *x, double *y );
103 : :
104 : : //! Reorder points to have cross prod ((x,y)[i], (x,y)[i+1), point) > 0 when point is outside
105 : : static bool reorderPolygon( std::vector< double > &x, std::vector< double> &y );
106 : :
107 : : /**
108 : : * Returns TRUE if a GEOS prepared geometry totally contains a label candidate.
109 : : * \param geom GEOS prepared geometry
110 : : * \param x candidate x
111 : : * \param y candidate y
112 : : * \param width candidate width
113 : : * \param height candidate height
114 : : * \param alpha candidate angle
115 : : * \returns TRUE if candidate is totally contained
116 : : */
117 : : static bool containsCandidate( const GEOSPreparedGeometry *geom, double x, double y, double width, double height, double alpha );
118 : :
119 : : };
120 : : } //namespace
121 : :
122 : : #endif
|