84int main(
int argc,
char *argv[]) {
87 UTEST_TEST(
"copy_without_nans_or_adjacent_duplicates") {
97 Point const exp_dest[] = {
103 g_assert( G_N_ELEMENTS(src) == 7 );
108 unsigned exp_dest_ix0;
109 unsigned exp_dest_len;
110 }
const test_data[] = {
122 for (
unsigned i = 0 ; i < G_N_ELEMENTS(test_data) ; ++i) {
123 tst
const &t = test_data[i];
124 UTEST_ASSERT( t.exp_dest_len
125 == copy_without_nans_or_adjacent_duplicates(src + t.src_ix0,
129 exp_dest + t.exp_dest_ix0,
134 UTEST_TEST(
"bezier_pt(1)") {
137 UTEST_ASSERT( bezier_pt(1, a, 0.0) == a[0] );
138 UTEST_ASSERT( bezier_pt(1, a, 1.0) == a[1] );
139 UTEST_ASSERT( bezier_pt(1, a, 0.5) ==
Point(1.5, 6.0) );
140 double const t[] = {0.5, 0.25, 0.3, 0.6};
141 for (
unsigned i = 0; i < G_N_ELEMENTS(t); ++i) {
142 double const ti = t[i], si = 1.0 - ti;
143 UTEST_ASSERT( bezier_pt(1, a, ti) == si * a[0] + ti * a[1] );
147 UTEST_TEST(
"bezier_pt(2)") {
151 UTEST_ASSERT( bezier_pt(2, b, 0.0) == b[0] );
152 UTEST_ASSERT( bezier_pt(2, b, 1.0) == b[2] );
153 UTEST_ASSERT( bezier_pt(2, b, 0.5) ==
Point(5.0, 2.75) );
154 double const t[] = {0.5, 0.25, 0.3, 0.6};
155 for (
unsigned i = 0; i < G_N_ELEMENTS(t); ++i) {
156 double const ti = t[i], si = 1.0 - ti;
157 Point const exp_pt( si*si * b[0] + 2*si*ti * b[1] + ti*ti * b[2] );
158 Point const pt(bezier_pt(2, b, ti));
167 UTEST_TEST(
"bezier_pt(3)") {
168 UTEST_ASSERT( bezier_pt(3,
c, 0.0) ==
c[0] );
169 UTEST_ASSERT( bezier_pt(3,
c, 1.0) ==
c[3] );
170 UTEST_ASSERT( bezier_pt(3,
c, 0.5) ==
Point(4.0, 13.0/8.0) );
171 double const t[] = {0.5, 0.25, 0.3, 0.6};
172 for (
unsigned i = 0; i < G_N_ELEMENTS(t); ++i) {
173 double const ti = t[i], si = 1.0 - ti;
174 UTEST_ASSERT( LInfty( bezier_pt(3,
c, ti)
175 - ( si*si*si *
c[0] +
187 }
const err_tst[] = {
189 {
Point(4.0, 13.0/8.0), 0.5, 0.0},
190 {
Point(4.0, 2.0), 0.5, 9.0/64.0},
191 {
Point(3.0, 2.0), 0.5, 1.0 + 9.0/64.0},
192 {
Point(6.0, 2.0), 0.5, 4.0 + 9.0/64.0},
196 UTEST_TEST(
"compute_max_error_ratio") {
197 Point d[G_N_ELEMENTS(err_tst)];
198 double u[G_N_ELEMENTS(err_tst)];
199 for (
unsigned i = 0; i < G_N_ELEMENTS(err_tst); ++i) {
200 Err_tst
const &t = err_tst[i];
204 g_assert( G_N_ELEMENTS(u) == G_N_ELEMENTS(d) );
205 unsigned max_ix = ~0u;
206 double const err_ratio = compute_max_error_ratio(d, u, G_N_ELEMENTS(d),
c, 1.0, &max_ix);
207 UTEST_ASSERT( fabs( sqrt(err_tst[4].err) - err_ratio ) < 1e-12 );
208 UTEST_ASSERT( max_ix == 4 );
211 UTEST_TEST(
"chord_length_parameterize") {
215 Point(23.021, 4.9814)};
216 double u[G_N_ELEMENTS(d)];
217 double const exp_u[] = {0.0, 1.0};
218 g_assert( G_N_ELEMENTS(u) == G_N_ELEMENTS(exp_u) );
219 chord_length_parameterize(d, u, G_N_ELEMENTS(d));
220 UTEST_ASSERT(
range_equal(u, exp_u, G_N_ELEMENTS(exp_u)));
225 double const exp_u[] = {0.0, 0.1829, 0.2105, 0.2105, 0.619, 0.815, 0.999, 1.0};
226 unsigned const n = G_N_ELEMENTS(exp_u);
229 Point const a(-23.985, 4.915), b(4.9127, 5.203);
230 for (
unsigned i = 0; i < n; ++i) {
231 double bi = exp_u[i], ai = 1.0 - bi;
232 d[i] = ai * a + bi * b;
234 chord_length_parameterize(d, u, n);
245 double const t[] = {0.0, .001, .03, .05, .09, .13, .18, .25, .29, .33, .39, .44,
246 .51, .57, .62, .69, .75, .81, .91, .93, .97, .98, .999, 1.0};
247 unsigned const n = G_N_ELEMENTS(t);
249 for (
unsigned i = 0; i < n; ++i) {
250 d[i] = bezier_pt(3, src_b, t[i]);
252 Point const tHat1(unit_vector( src_b[1] - src_b[0] ));
253 Point const tHat2(unit_vector( src_b[2] - src_b[3] ));
255 UTEST_TEST(
"generate_bezier") {
257 generate_bezier(est_b, d, t, n, tHat1, tHat2, 1.0);
266 UTEST_TEST(
"sp_bezier_fit_cubic_full") {
269 gint
const succ = sp_bezier_fit_cubic_full(est_b, splitpoints, d, n, tHat1, tHat2,
square(1.2), 1);
270 UTEST_ASSERT( succ == 1 );
272 Point const exp_est_b[4] = {
273 Point(5.000000, -3.000000),
274 Point(7.5753, -0.4247),
275 Point(4.77533, 1.22467),
285 UTEST_TEST(
"sp_bezier_fit_cubic") {
287 gint
const succ = sp_bezier_fit_cubic(est_b, d, n,
square(1.2));
288 UTEST_ASSERT( succ == 1 );
290 Point const exp_est_b[4] = {
291 Point(5.000000, -3.000000),
292 Point(7.57134, -0.423509),
293 Point(4.77929, 1.22426),
301 printf(
"TODO: Update this test case for revised right_tangent implementation.\n");