3649802a425c66dacd4d2fe9caf01894e80e2a57
[blender-staging.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 __CURVE_FIT_ND_H__
29 #define __CURVE_FIT_ND_H__
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  calc_flag,
64         const unsigned int *corners,
65         unsigned int        corners_len,
66
67         double **r_cubic_array, unsigned int *r_cubic_array_len,
68         unsigned int **r_cubic_orig_index,
69         unsigned int **r_corner_index_array, unsigned int *r_corner_index_len);
70
71 int curve_fit_cubic_to_points_fl(
72         const float        *points,
73         const unsigned int  points_len,
74         const unsigned int  dims,
75         const float         error_threshold,
76         const unsigned int  calc_flag,
77         const unsigned int *corners,
78         const unsigned int  corners_len,
79
80         float **r_cubic_array, unsigned int *r_cubic_array_len,
81         unsigned int **r_cubic_orig_index,
82         unsigned int **r_corners_index_array, unsigned int *r_corners_index_len);
83
84 /**
85  * Takes a flat array of points and evalues that to calculate handle lengths.
86  *
87  * \param points, points_len: The array of points to calculate a cubics from.
88  * \param dims: The number of dimensions for for each element in \a points.
89  * \param error_threshold: the error threshold to allow for,
90  * \param tan_l, tan_r: Normalized tangents the handles will be aligned to.
91  * Note that tangents must both point along the direction of the \a points,
92  * so \a tan_l points in the same direction of the resulting handle,
93  * where \a tan_r will point the opposite direction of its handle.
94  *
95  * \param r_handle_l, r_handle_r: Resulting calculated handles.
96  * \param r_error_sq: The maximum distance  (squared) this curve diverges from \a points.
97  */
98 int curve_fit_cubic_to_points_single_db(
99         const double      *points,
100         const unsigned int points_len,
101         const unsigned int dims,
102         const double       error_threshold,
103         const double       tan_l[],
104         const double       tan_r[],
105
106         double  r_handle_l[],
107         double  r_handle_r[],
108         double *r_error_sq);
109
110 int curve_fit_cubic_to_points_single_fl(
111         const float       *points,
112         const unsigned int points_len,
113         const unsigned int dims,
114         const float        error_threshold,
115         const float        tan_l[],
116         const float        tan_r[],
117
118         float   r_handle_l[],
119         float   r_handle_r[],
120         float  *r_error_sq);
121
122 enum {
123         CURVE_FIT_CALC_HIGH_QUALIY          = (1 << 0),
124 };
125
126 /* curve_fit_corners_detect.c */
127
128 /**
129  * A helper function that takes a line and outputs its corner indices.
130  *
131  * \param points, points_len: Curve to evaluate.
132  * \param dims: The number of dimensions for for each element in \a points.
133  * \param radius_min: Corners on the curve between points below this radius are ignored.
134  * \param radius_max: Corners on the curve above this radius are ignored.
135  * \param samples_max: Prevent testing corners beyond this many points
136  * (prevents a large radius taking excessive time to compute).
137  * \param angle_threshold: Angles above this value are considered corners
138  * (higher value for fewer corners).
139  *
140  * \param r_corners, r_corners_len: Resulting array of corners.
141  *
142  * \returns zero on success, nonzero is reserved for error values.
143  */
144 int curve_fit_corners_detect_db(
145         const double      *points,
146         const unsigned int points_len,
147         const unsigned int dims,
148         const double       radius_min,
149         const double       radius_max,
150         const unsigned int samples_max,
151         const double       angle_threshold,
152
153         unsigned int **r_corners,
154         unsigned int  *r_corners_len);
155
156 int curve_fit_corners_detect_fl(
157         const float       *points,
158         const unsigned int points_len,
159         const unsigned int dims,
160         const float        radius_min,
161         const float        radius_max,
162         const unsigned int samples_max,
163         const float        angle_threshold,
164
165         unsigned int **r_corners,
166         unsigned int  *r_corners_len);
167
168 #endif  /* __CURVE_FIT_ND_H__ */