PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ lwpoly_construct_circle()

LWPOLY* lwpoly_construct_circle ( int  srid,
double  x,
double  y,
double  radius,
uint32_t  segments_per_quarter,
char  exterior 
)

Definition at line 120 of file lwpoly.c.

References LW_FALSE, LW_TRUE, lwerror(), lwpoly_add_ring(), lwpoly_construct_empty(), ptarray_append_point(), ptarray_construct_empty(), POINT4D::x, and POINT4D::y.

Referenced by ST_MinimumBoundingCircle(), and test_lwpoly_construct_circle().

121 {
122  const int segments = 4*segments_per_quarter;
123  double theta;
124  LWPOLY *lwpoly;
125  POINTARRAY *pa;
126  POINT4D pt;
127  uint32_t i;
128 
129  if (segments_per_quarter == 0)
130  {
131  lwerror("Need at least one segment per quarter-circle.");
132  return NULL;
133  }
134 
135  if (radius < 0)
136  {
137  lwerror("Radius must be positive.");
138  return NULL;
139  }
140 
141  theta = 2*M_PI / segments;
142 
143  lwpoly = lwpoly_construct_empty(srid, LW_FALSE, LW_FALSE);
144  pa = ptarray_construct_empty(LW_FALSE, LW_FALSE, segments + 1);
145 
146  if (exterior)
147  radius *= sqrt(1 + pow(tan(theta/2), 2));
148 
149  for (i = 0; i <= segments; i++)
150  {
151  pt.x = x + radius*sin(i * theta);
152  pt.y = y + radius*cos(i * theta);
153  ptarray_append_point(pa, &pt, LW_TRUE);
154  }
155 
156  lwpoly_add_ring(lwpoly, pa);
157  return lwpoly;
158 }
double x
Definition: liblwgeom.h:352
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition: ptarray.c:70
int lwpoly_add_ring(LWPOLY *poly, POINTARRAY *pa)
Add a ring to a polygon.
Definition: lwpoly.c:249
unsigned int uint32_t
Definition: uthash.h:78
int ptarray_append_point(POINTARRAY *pa, const POINT4D *pt, int allow_duplicates)
Append a point to the end of an existing POINTARRAY If allow_duplicate is LW_FALSE, then a duplicate point will not be added.
Definition: ptarray.c:156
#define LW_FALSE
Definition: liblwgeom.h:77
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:76
LWPOLY * lwpoly_construct_empty(int srid, char hasz, char hasm)
Definition: lwpoly.c:161
double y
Definition: liblwgeom.h:352
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
Here is the call graph for this function:
Here is the caller graph for this function: