Replace imprecise value of PI with a better one, and tweak circle_poly
in hopes of reducing platform-to-platform variations in its results. This will cause the geometry regression test to start failing on some platforms. I plan to update the test later today.
This commit is contained in:
parent
cea5388840
commit
c2b716ab68
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.67 2002/11/08 17:37:52 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.68 2002/11/08 18:32:47 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -22,10 +22,12 @@
|
|||||||
#include "utils/builtins.h"
|
#include "utils/builtins.h"
|
||||||
#include "utils/geo_decls.h"
|
#include "utils/geo_decls.h"
|
||||||
|
|
||||||
#ifndef PI
|
#ifndef M_PI
|
||||||
#define PI 3.1415926536
|
/* from my RH5.2 gcc math.h file - thomas 2000-04-03 */
|
||||||
|
#define M_PI 3.14159265358979323846
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Internal routines
|
* Internal routines
|
||||||
*/
|
*/
|
||||||
@ -4365,7 +4367,7 @@ circle_center(PG_FUNCTION_ARGS)
|
|||||||
static double
|
static double
|
||||||
circle_ar(CIRCLE *circle)
|
circle_ar(CIRCLE *circle)
|
||||||
{
|
{
|
||||||
return PI * (circle->radius * circle->radius);
|
return M_PI * (circle->radius * circle->radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4438,6 +4440,7 @@ circle_poly(PG_FUNCTION_ARGS)
|
|||||||
size;
|
size;
|
||||||
int i;
|
int i;
|
||||||
double angle;
|
double angle;
|
||||||
|
double anglestep;
|
||||||
|
|
||||||
if (FPzero(circle->radius) || (npts < 2))
|
if (FPzero(circle->radius) || (npts < 2))
|
||||||
elog(ERROR, "Unable to convert circle to polygon");
|
elog(ERROR, "Unable to convert circle to polygon");
|
||||||
@ -4455,9 +4458,11 @@ circle_poly(PG_FUNCTION_ARGS)
|
|||||||
poly->size = size;
|
poly->size = size;
|
||||||
poly->npts = npts;
|
poly->npts = npts;
|
||||||
|
|
||||||
|
anglestep = (2.0 * M_PI) / npts;
|
||||||
|
|
||||||
for (i = 0; i < npts; i++)
|
for (i = 0; i < npts; i++)
|
||||||
{
|
{
|
||||||
angle = i * (2 * PI / npts);
|
angle = i * anglestep;
|
||||||
poly->p[i].x = circle->center.x - (circle->radius * cos(angle));
|
poly->p[i].x = circle->center.x - (circle->radius * cos(angle));
|
||||||
poly->p[i].y = circle->center.y + (circle->radius * sin(angle));
|
poly->p[i].y = circle->center.y + (circle->radius * sin(angle));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user