/**********************************************************************
*
* PostGIS - Spatial Types for PostgreSQL
* http://postgis.net
*
* PostGIS 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 2 of the License, or
* (at your option) any later version.
*
* PostGIS 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 PostGIS. If not, see .
*
**********************************************************************
*
* Copyright (C) 2012-2015 Paul Ramsey
*
**********************************************************************/
#ifndef _LWGEODETIC_TREE_H
#define _LWGEODETIC_TREE_H 1
#include "lwgeodetic.h"
#define CIRC_NODE_SIZE 8
/**
* Note that p1 and p2 are pointers into an independent POINTARRAY, do not free them.
*/
typedef struct circ_node
{
GEOGRAPHIC_POINT center;
double radius;
uint32_t num_nodes;
struct circ_node** nodes;
int edge_num;
uint32_t geom_type;
double d;
POINT2D pt_outside;
POINT2D* p1;
POINT2D* p2;
} CIRC_NODE;
void circ_tree_print(const CIRC_NODE* node, int depth);
CIRC_NODE* circ_tree_new(const POINTARRAY* pa);
void circ_tree_free(CIRC_NODE* node);
int circ_tree_contains_point(const CIRC_NODE* node, const POINT2D* pt, const POINT2D* pt_outside, int level, int* on_boundary);
double circ_tree_distance_tree(const CIRC_NODE* n1, const CIRC_NODE* n2, const SPHEROID *spheroid, double threshold);
CIRC_NODE* lwgeom_calculate_circ_tree(const LWGEOM* lwgeom);
int circ_tree_get_point(const CIRC_NODE* node, POINT2D* pt);
int circ_tree_get_point_outside(const CIRC_NODE* node, POINT2D* pt);
#endif /* _LWGEODETIC_TREE_H */