area = lwgeom_area_sphere(lwg, &s);
CU_ASSERT_DOUBLE_EQUAL(area, 12360265021.3561, 1.0);
- lwgeom_free(lwg);
- return;
+ lwgeom_free(lwg);
+
+ /* Robustness tests, from ticket #3393 */
+ lwg = lwgeom_from_wkt("POLYGON((0 78.703946026663,0 0,179.999997913235 0,179.999997913235 -33.0888306884702,0 78.703946026663))", LW_PARSER_CHECK_NONE);
+ area = lwgeom_area_sphere(lwg, &s);
+ CU_ASSERT_DOUBLE_EQUAL(area, 127516467322130, 1.0);
+ lwgeom_free(lwg);
+
+ lwg = lwgeom_from_wkt("POLYGON((0 78.703946026662,0 0,179.999997913235 0,179.999997913235 -33.0888306884702,0 78.703946026662))", LW_PARSER_CHECK_NONE);
+ area = lwgeom_area_sphere(lwg, &s);
+ CU_ASSERT_DOUBLE_EQUAL(area, 127516467322130, 1.0);
+ lwgeom_free(lwg);
+
+ lwg = lwgeom_from_wkt("POLYGON((0 78.703946026664,0 0,179.999997913235 0,179.999997913235 -33.0888306884702,0 78.703946026664))", LW_PARSER_CHECK_NONE);
+ area = lwgeom_area_sphere(lwg, &s);
+ CU_ASSERT_DOUBLE_EQUAL(area, 127516467322130, 1.0);
+ lwgeom_free(lwg);
+ /* end #3393 */
}
/*
*/
double sphere_distance_cartesian(const POINT3D *s, const POINT3D *e)
{
- return acos(dot_product(s, e));
+ return acos(FP_MIN(1.0, dot_product(s, e)));
}
/**