New freehand curve drawing tool
[blender.git] / extern / curve_fit_nd / curve_fit_nd.h
1 /*
2  * Copyright (c) 2016, DWANGO Co., Ltd.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of the <organization> nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #ifndef __SPLINE_FIT__
29 #define __SPLINE_FIT__
30
31 /** \file curve_fit_nd.h
32  *  \ingroup curve_fit
33  */
34
35
36 /* curve_fit_cubic.c */
37
38 /**
39  * Takes a flat array of points and evalues that to calculate a bezier spline.
40  *
41  * \param points, points_len: The array of points to calculate a cubics from.
42  * \param dims: The number of dimensions for for each element in \a points.
43  * \param error_threshold: the error threshold to allow for,
44  * the curve will be within this distance from \a points.
45  * \param corners, corners_len: indices for points which will not have aligned tangents (optional).
46  * This can use the output of #curve_fit_corners_detect_db which has been included
47  * to evaluate a line to detect corner indices.
48  *
49  * \param r_cubic_array, r_cubic_array_len: Resulting array of tangents and knots, formatted as follows:
50  * ``r_cubic_array[r_cubic_array_len][3][dims]``,
51  * where each point has 0 and 2 for the tangents and the middle index 1 for the knot.
52  * The size of the *flat* array will be ``r_cubic_array_len * 3 * dims``.
53  * \param r_corner_index_array, r_corner_index_len: Corner indices in in \a r_cubic_array (optional).
54  * This allows you to access corners on the resulting curve.
55  *
56  * \returns zero on success, nonzero is reserved for error values.
57  */
58 int curve_fit_cubic_to_points_db(
59         const double       *points,
60         const unsigned int  points_len,
61         const unsigned int  dims,
62         const double        error_threshold,
63         const unsigned int *corners,
64         unsigned int        corners_len,
65
66         double **r_cubic_array, unsigned int *r_cubic_array_len,
67         unsigned int **r_cubic_orig_index,
68         unsigned int **r_corner_index_array, unsigned int *r_corner_index_len);
69
70 int curve_fit_cubic_to_points_fl(
71         const float        *points,
72         const unsigned int  points_len,
73         const unsigned int  dims,
74         const float         error_threshold,
75         const unsigned int *corners,
76         const unsigned int  corners_len,
77
78         float **r_cubic_array, unsigned int *r_cubic_array_len,
79         unsigned int **r_cubic_orig_index,
80         unsigned int **r_corners_index_array, unsigned int *r_corners_index_len);
81
82
83 /* curve_fit_corners_detect.c */
84
85 /**
86  * A helper function that takes a line and outputs its corner indices.
87  *
88  * \param points, points_len: Curve to evaluate.
89  * \param dims: The number of dimensions for for each element in \a points.
90  * \param radius_min: Corners on the curve between points below this radius are ignored.
91  * \param radius_max: Corners on the curve above this radius are ignored.
92  * \param samples_max: Prevent testing corners beyond this many points
93  * (prevents a large radius taking excessive time to compute).
94  * \param angle_threshold: Angles above this value are considered corners
95  * (higher value for fewer corners).
96  *
97  * \param r_corners, r_corners_len: Resulting array of corners.
98  *
99  * \returns zero on success, nonzero is reserved for error values.
100  */
101 int curve_fit_corners_detect_db(
102         const double      *points,
103         const unsigned int points_len,
104         const unsigned int dims,
105         const double       radius_min,
106         const double       radius_max,
107         const unsigned int samples_max,
108         const double       angle_threshold,
109
110         unsigned int **r_corners,
111         unsigned int  *r_corners_len);
112
113 int curve_fit_corners_detect_fl(
114         const float       *points,
115         const unsigned int points_len,
116         const unsigned int dims,
117         const float        radius_min,
118         const float        radius_max,
119         const unsigned int samples_max,
120         const float        angle_threshold,
121
122         unsigned int **r_corners,
123         unsigned int  *r_corners_len);
124
125 #endif  /* __SPLINE_FIT__ */