2014-12-12 15:08:31 +01:00
|
|
|
#ifndef DELAUNAY_H
|
|
|
|
#define DELAUNAY_H
|
|
|
|
|
|
|
|
/*
|
|
|
|
** delaunay.c : compute 2D delaunay triangulation in the plane.
|
|
|
|
** Copyright (C) 2005 Wael El Oraiby <wael.eloraiby@gmail.com>
|
|
|
|
**
|
|
|
|
**
|
|
|
|
** This program is free software: you can redistribute it and/or modify
|
|
|
|
** it under the terms of the GNU General Public License as published by
|
|
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
|
|
** (at your option) any later version.
|
|
|
|
**
|
|
|
|
** This program is distributed in the hope that it will be useful,
|
|
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
** GNU General Public License for more details.
|
|
|
|
**
|
|
|
|
** You should have received a copy of the GNU General Public License
|
|
|
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define DEL_CIRCLE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* define the floating point type, comment to use float - Be careful "float" type will assert more often */
|
|
|
|
#define USE_DOUBLE
|
|
|
|
|
|
|
|
#define FAST_PREDICATE 1 /* fast but floating point errors are more likely to occur */
|
|
|
|
#define LOOSE_PREDICATE 2 /* loose with epsilon defined in the delaunay file - errors will happen but less frequently */
|
|
|
|
#define EXACT_PREDICATE 3 /* use exact arithmetic - slower, but shouldn't produce any floating point error */
|
|
|
|
|
|
|
|
#define PREDICATE EXACT_PREDICATE
|
|
|
|
|
|
|
|
#if PREDICATE == EXACT_PREDICATE && !defined(USE_DOUBLE)
|
|
|
|
# define USE_DOUBLE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef USE_DOUBLE
|
|
|
|
typedef double real;
|
|
|
|
#else
|
|
|
|
typedef float real;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct {
|
2014-12-21 11:56:31 +01:00
|
|
|
real x, y;
|
2014-12-12 15:08:31 +01:00
|
|
|
} del_point2d_t;
|
|
|
|
|
|
|
|
typedef struct {
|
2014-12-21 11:56:31 +01:00
|
|
|
/** input points count */
|
2015-10-26 09:36:07 +01:00
|
|
|
quint32 num_points;
|
2014-12-12 15:08:31 +01:00
|
|
|
|
2014-12-21 11:56:31 +01:00
|
|
|
/** the input points */
|
|
|
|
del_point2d_t* points;
|
2014-12-12 15:08:31 +01:00
|
|
|
|
2014-12-21 11:56:31 +01:00
|
|
|
/** number of returned faces */
|
2015-10-26 09:36:07 +01:00
|
|
|
quint32 num_faces;
|
2014-12-12 15:08:31 +01:00
|
|
|
|
2014-12-21 11:56:31 +01:00
|
|
|
/** the triangles given as a sequence: num verts, verts indices, num verts, verts indices first face is the external face */
|
2015-10-26 09:36:07 +01:00
|
|
|
quint32* faces;
|
2014-12-12 15:08:31 +01:00
|
|
|
} delaunay2d_t;
|
|
|
|
|
|
|
|
typedef int (*incircle_predicate_t)(del_point2d_t* p0, del_point2d_t* p1, del_point2d_t* p2, del_point2d_t* p3);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* build the 2D Delaunay triangulation given a set of points of at least 3 points
|
|
|
|
*
|
2015-03-16 13:23:02 +01:00
|
|
|
* @param points point set given as a sequence of tuple x0, y0, x1, y1, ....
|
|
|
|
* @param num_points number of given point
|
2014-12-12 15:08:31 +01:00
|
|
|
* @return: the number of created faces
|
|
|
|
*/
|
2015-10-26 09:36:07 +01:00
|
|
|
delaunay2d_t* delaunay2d_from(del_point2d_t *points, quint32 num_points);
|
2014-12-12 15:08:31 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* release a delaunay2d object
|
|
|
|
*/
|
|
|
|
void delaunay2d_release(delaunay2d_t* del);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // DELAUNAY_H
|