[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-physics / third-party / chipmunk2d / include / chipmunk / cpPolyline.h
1 // Copyright 2013 Howling Moon Software. All rights reserved.
2 // See http://chipmunk2d.net/legal.php for more information.
3
4 // Polylines are just arrays of vertexes.
5 // They are looped if the first vertex is equal to the last.
6 // cpPolyline structs are intended to be passed by value and destroyed when you are done with them.
7 typedef struct cpPolyline {
8   int count, capacity;
9   cpVect verts[];
10 } cpPolyline;
11
12 /// Destroy and free a polyline instance.
13 CP_EXPORT void cpPolylineFree(cpPolyline *line);
14
15 /// Returns true if the first vertex is equal to the last.
16 CP_EXPORT cpBool cpPolylineIsClosed(cpPolyline *line);
17
18 /**
19         Returns a copy of a polyline simplified by using the Douglas-Peucker algorithm.
20         This works very well on smooth or gently curved shapes, but not well on straight edged or angular shapes.
21 */
22 CP_EXPORT cpPolyline *cpPolylineSimplifyCurves(cpPolyline *line, cpFloat tol);
23
24 /**
25         Returns a copy of a polyline simplified by discarding "flat" vertexes.
26         This works well on straigt edged or angular shapes, not as well on smooth shapes.
27 */
28 CP_EXPORT cpPolyline *cpPolylineSimplifyVertexes(cpPolyline *line, cpFloat tol);
29
30 /// Get the convex hull of a polyline as a looped polyline.
31 CP_EXPORT cpPolyline *cpPolylineToConvexHull(cpPolyline *line, cpFloat tol);
32
33
34 /// Polyline sets are collections of polylines, generally built by cpMarchSoft() or cpMarchHard().
35 typedef struct cpPolylineSet {
36   int count, capacity;
37   cpPolyline **lines;
38 } cpPolylineSet;
39
40 /// Allocate a new polyline set.
41 CP_EXPORT cpPolylineSet *cpPolylineSetAlloc(void);
42
43 /// Initialize a new polyline set.
44 CP_EXPORT cpPolylineSet *cpPolylineSetInit(cpPolylineSet *set);
45
46 /// Allocate and initialize a polyline set.
47 CP_EXPORT cpPolylineSet *cpPolylineSetNew(void);
48
49 /// Destroy a polyline set.
50 CP_EXPORT void cpPolylineSetDestroy(cpPolylineSet *set, cpBool freePolylines);
51
52 /// Destroy and free a polyline set.
53 CP_EXPORT void cpPolylineSetFree(cpPolylineSet *set, cpBool freePolylines);
54
55 /**
56         Add a line segment to a polyline set.
57         A segment will either start a new polyline, join two others, or add to or loop an existing polyline.
58         This is mostly intended to be used as a callback directly from cpMarchSoft() or cpMarchHard().
59 */
60 CP_EXPORT void cpPolylineSetCollectSegment(cpVect v0, cpVect v1, cpPolylineSet *lines);
61
62 /**
63         Get an approximate convex decomposition from a polyline.
64         Returns a cpPolylineSet of convex hulls that match the original shape to within 'tol'.
65         NOTE: If the input is a self intersecting polygon, the output might end up overly simplified.
66 */
67
68 CP_EXPORT cpPolylineSet *cpPolylineConvexDecomposition(cpPolyline *line, cpFloat tol);
69
70 #define cpPolylineConvexDecomposition_BETA cpPolylineConvexDecomposition