File: cu_minimum_bounding_circle.c

package info (click to toggle)
postgis 2.3.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 58,660 kB
  • ctags: 10,181
  • sloc: ansic: 132,858; sql: 131,148; xml: 46,460; sh: 4,832; perl: 4,476; makefile: 2,749; python: 1,198; yacc: 442; lex: 131
file content (85 lines) | stat: -rw-r--r-- 2,168 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/**********************************************************************
 *
 * PostGIS - Spatial Types for PostgreSQL
 * http://postgis.net
 * Copyright 2015 Daniel Baston
 *
 * This is free software; you can redistribute and/or modify it under
 * the terms of the GNU General Public Licence. See the COPYING file.
 *
 **********************************************************************/

#include "CUnit/Basic.h"
#include "cu_tester.h"
#include "../liblwgeom_internal.h"

static void mbc_test(LWGEOM* g)
{
	LWBOUNDINGCIRCLE* result = lwgeom_calculate_mbc(g);
	CU_ASSERT_TRUE(result != NULL);

	LWPOINTITERATOR* it = lwpointiterator_create(g);

	POINT2D p;
	POINT4D p4;
	while (lwpointiterator_next(it, &p4))
	{
		p.x = p4.x;
		p.y = p4.y;

		/* We need to store the distance in a variable before the assert so that
		 * it is rounded from its 80-bit representation (on x86) down to 64 bits.
		 * */
		volatile double d = distance2d_pt_pt(result->center, &p);

		CU_ASSERT_TRUE(d <= result->radius);
	}

	lwboundingcircle_destroy(result);
	lwpointiterator_destroy(it);
}

static void basic_test(void)
{
	uint32_t i;

	char* inputs[] =
	{
		"POLYGON((26426 65078,26531 65242,26075 65136,26096 65427,26426 65078))",
		"POINT (17 253)",
		"TRIANGLE ((0 0, 10 0, 10 10, 0 0))",
		"LINESTRING (17 253, -44 28, 33 11, 26 44)",
		"MULTIPOINT ((0 0), (0 0), (0 0), (0 0))",
		"POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))",
		"LINESTRING (-48546889 37039202, -37039202 -48546889)"
	};

	for (i = 0; i < sizeof(inputs)/sizeof(LWGEOM*); i++)
	{
		LWGEOM* input = lwgeom_from_wkt(inputs[i], LW_PARSER_CHECK_NONE);
		mbc_test(input);
		lwgeom_free(input);
	}

}

static void test_empty(void)
{
	LWGEOM* input = lwgeom_from_wkt("POINT EMPTY", LW_PARSER_CHECK_NONE);

	LWBOUNDINGCIRCLE* result = lwgeom_calculate_mbc(input);
	CU_ASSERT_TRUE(result == NULL);
	
	lwgeom_free(input);
}

/*
 ** Used by test harness to register the tests in this file.
 */
void minimum_bounding_circle_suite_setup(void);
void minimum_bounding_circle_suite_setup(void)
{
	CU_pSuite suite = CU_add_suite("minimum_bounding_circle", NULL, NULL);
	PG_ADD_TEST(suite, basic_test);
	PG_ADD_TEST(suite, test_empty);
}