[PD] cubic interpolation algorithm, not really working...

Alexandros Drymonitis adrcki at gmail.com
Sun Mar 15 19:49:15 CET 2015


I want to set some points in an array to use them for displaying many
[circle]s in Gem. I want to check the distance between two subsequent
points, and if they're too far apart (particularly further than 0.04), I
want to place another point in between, using cubic interpolation, and
repeat this until the two subsequent points are close enough.

I'm trying to implement the cubic interpolation equation found here
http://paulbourke.net/miscellaneous/interpolation/ (the third chuck of
code) in my patch, but it doesn't quite work (most of the times). There's a
point that it should stop, but it doesn't. I've attached the patch and two
abstractions I'm using in it ([guard_points] and [loop]), if anyone wants
to have a look and give some tips. My math is quite limited...
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-list/attachments/20150315/96b5b199/attachment.html>
-------------- next part --------------
#N canvas 192 22 980 677 10;
#N canvas 0 22 450 278 (subpatch) 0;
#X array array1 24 float 2;
#X coords 0 1 24 -1 200 140 1;
#X restore 41 73 graph;
#X obj 56 283 guard_points array1;
#X msg 56 259 bang;
#X obj 628 196 tabread array1;
#X obj 601 218 pack;
#X obj 601 262 -;
#X obj 601 305 > 0.04;
#X msg 580 86 2;
#X obj 580 108 loop;
#X obj 628 151 + 1;
#X obj 601 327 sel 1;
#X obj 640 438 f;
#X obj 621 485 loop;
#X obj 601 373 array size array1;
#X obj 642 509 t f f;
#X obj 729 526 + 1;
#X obj 642 547 tabread array1;
#X obj 642 569 tabwrite array1;
#X obj 601 395 t f f;
#X obj 628 416 + 1;
#X msg 56 336 4;
#X obj 56 358 array size array1;
#X obj 601 349 t b b;
#X obj 628 173 t f f;
#X obj 601 129 t f f;
#X obj 601 240 route 1 0;
#X obj 601 284 abs;
#X obj 601 438 t b f;
#X obj 279 480 v point0;
#X obj 297 457 v point1;
#X obj 316 434 v point2;
#X obj 335 411 v point3;
#X obj 480 590 v a0;
#X obj 415 590 v a1;
#X obj 350 590 v a2;
#X obj 285 590 v a3;
#X obj 258 639 tabwrite array1;
#X obj 258 617 expr a0*0.5*0.25+a1*0.25+a2*0.5+a3;
#X obj 285 528 expr point1 \; point2 - point0 \; point0 - point1 -
a0 \; point3 - point2 - point0 + point1;
#X obj 279 386 route 0 1 2 3;
#X msg 258 219 4;
#X obj 258 241 loop;
#X obj 330 280 t f f;
#X obj 330 302 +;
#X obj 330 324 +;
#X obj 279 263 t f f;
#X obj 279 363 pack;
#X obj 330 346 tabread array1;
#X obj 357 307 > 1;
#X obj 258 506 t b b;
#X obj 640 460 t f f;
#X obj 390 263 t f f;
#X obj 390 285 - 2;
#X obj 56 314 loadbang;
#X text 54 238 2.add guard points;
#X text 39 24 1.draw some values in the array \, make sure the first
two points are not close to each other;
#X text 469 614 we're placing a value in the middle of the two points
with cubic interpolation \, hence 0.5 and 0.25;
#X text 383 308 we're reading points 0 \, 1 \, 3 \, 4;
#X text 578 46 3.run cubic interpolation equation repeatedly \, keep
on baning the message;
#X connect 2 0 1 0;
#X connect 3 0 4 1;
#X connect 4 0 25 0;
#X connect 5 0 26 0;
#X connect 6 0 10 0;
#X connect 7 0 8 0;
#X connect 8 1 24 0;
#X connect 9 0 23 0;
#X connect 10 0 22 0;
#X connect 11 0 50 0;
#X connect 12 0 40 0;
#X connect 12 1 14 0;
#X connect 13 0 18 0;
#X connect 14 0 16 0;
#X connect 14 1 15 0;
#X connect 15 0 17 1;
#X connect 16 0 17 0;
#X connect 18 0 27 0;
#X connect 18 1 19 0;
#X connect 19 0 13 0;
#X connect 20 0 21 0;
#X connect 22 0 13 0;
#X connect 22 1 11 0;
#X connect 23 0 3 0;
#X connect 23 1 11 1;
#X connect 24 0 4 0;
#X connect 24 1 9 0;
#X connect 25 0 5 0;
#X connect 25 1 5 1;
#X connect 26 0 6 0;
#X connect 27 0 12 0;
#X connect 27 1 12 1;
#X connect 37 0 36 0;
#X connect 38 0 35 0;
#X connect 38 1 34 0;
#X connect 38 2 33 0;
#X connect 38 3 32 0;
#X connect 39 0 28 0;
#X connect 39 1 29 0;
#X connect 39 2 30 0;
#X connect 39 3 31 0;
#X connect 40 0 41 0;
#X connect 41 0 49 0;
#X connect 41 1 45 0;
#X connect 42 0 43 0;
#X connect 42 1 48 0;
#X connect 43 0 44 0;
#X connect 44 0 47 0;
#X connect 45 0 46 0;
#X connect 45 1 42 0;
#X connect 46 0 39 0;
#X connect 47 0 46 1;
#X connect 48 0 44 1;
#X connect 49 0 37 0;
#X connect 49 1 38 0;
#X connect 50 0 12 2;
#X connect 50 1 51 0;
#X connect 51 0 52 0;
#X connect 51 1 36 1;
#X connect 52 0 43 1;
#X connect 53 0 20 0;
-------------- next part --------------
#N canvas 276 145 779 417 10;
#X msg 43 156 resize \$1;
#X obj 28 200 until;
#X obj 28 242 f;
#X obj 110 336 + 1;
#X obj 28 264 t f f f;
#X msg 272 83 3;
#X obj 272 105 until;
#X obj 272 150 f;
#X obj 298 150 + 1;
#X msg 287 129 0;
#X obj 362 222 moses 1;
#X obj 401 299 +;
#X obj 299 205 t f f;
#X obj 299 252 +;
#X obj 43 134 + 3;
#X obj 55 242 - 1;
#X obj 43 221 - 1;
#X obj 272 63 sel 0;
#X obj 299 229 moses 1;
#X obj 28 112 t f f f f f b;
#X obj 47 309 tabread \$1;
#X obj 47 361 tabwrite \$1;
#X obj 299 291 tabread \$1;
#X obj 299 316 tabwrite \$1;
#X obj 28 60 inlet;
#X text 45 382 move array elements one position to the right;
#X text 68 178 add three points to the array;
#X text 371 318 then add the guard points;
#X obj 377 24 inlet set_table;
#X obj 377 46 symbol;
#X obj 377 68 t s s s;
#X msg 127 252 set \$1;
#X obj 127 274 t a a a a;
#X text 475 23 in case you need to set the table dynamically;
#X obj 43 178 s;
#X obj 112 161 symbol \$1;
#X obj 112 138 loadbang;
#X obj 28 85 array size \$1;
#X obj 272 172 t f f;
#X obj 272 338 sel 2;
#X obj 272 360 outlet done;
#X connect 0 0 34 0;
#X connect 1 0 2 0;
#X connect 2 0 4 0;
#X connect 2 0 15 0;
#X connect 3 0 21 1;
#X connect 4 0 17 0;
#X connect 4 1 20 0;
#X connect 4 2 3 0;
#X connect 5 0 6 0;
#X connect 6 0 7 0;
#X connect 7 0 8 0;
#X connect 7 0 38 0;
#X connect 8 0 7 1;
#X connect 9 0 7 1;
#X connect 10 0 23 1;
#X connect 10 1 11 0;
#X connect 11 0 23 1;
#X connect 12 0 18 0;
#X connect 12 1 10 0;
#X connect 13 0 22 0;
#X connect 14 0 0 0;
#X connect 15 0 2 1;
#X connect 16 0 2 1;
#X connect 17 0 5 0;
#X connect 18 0 13 0;
#X connect 18 1 22 0;
#X connect 19 0 1 0;
#X connect 19 1 14 0;
#X connect 19 2 16 0;
#X connect 19 3 13 1;
#X connect 19 4 11 1;
#X connect 19 5 9 0;
#X connect 20 0 21 0;
#X connect 22 0 23 0;
#X connect 24 0 37 0;
#X connect 28 0 29 0;
#X connect 29 0 30 0;
#X connect 30 0 37 1;
#X connect 30 1 34 1;
#X connect 30 2 31 0;
#X connect 31 0 32 0;
#X connect 32 0 20 0;
#X connect 32 1 21 0;
#X connect 32 2 23 0;
#X connect 32 3 22 0;
#X connect 35 0 34 1;
#X connect 36 0 35 0;
#X connect 37 0 19 0;
#X connect 38 0 39 0;
#X connect 38 1 12 0;
#X connect 39 0 40 0;
-------------- next part --------------
#N canvas 414 212 309 368 10;
#X obj 77 139 t f b;
#X obj 20 189 until;
#X obj 20 232 f;
#X obj 51 232 + 1;
#X obj 20 254 t f f;
#X obj 20 277 sel;
#X obj 47 277 outlet counter;
#X obj 20 299 outlet bang;
#X obj 35 210 f;
#X obj 54 46 inlet start_val;
#X obj 89 70 inlet end_val;
#X obj 189 172 inlet stop;
#N canvas 591 222 544 372 start-end 0;
#X obj 283 97 loadbang;
#X obj 160 253 f;
#X obj 232 162 \$1;
#X obj 277 162 \$2;
#X obj 322 210 outlet to_sel;
#X obj 232 253 outlet to_counter;
#X obj 250 62 t b f;
#X obj 232 15 inlet start_val;
#X obj 250 37 inlet end_val;
#X obj 160 305 outlet num_of_iterations;
#X obj 322 162 \$3;
#X obj 283 119 t b b b;
#N canvas 170 127 830 473 define_start_and_end 0;
#X obj 283 69 t f f;
#X obj 310 92 != 0;
#X obj 342 413 outlet to_counter;
#X obj 342 312 *;
#X obj 127 388 +;
#X obj 127 413 outlet num_of_iterations;
#X obj 178 259 t f f;
#X obj 310 117 ||;
#N canvas 457 216 578 391 swap_or_no_swap 0;
#X obj 140 257 swap;
#X obj 140 283 -;
#X text 170 264 if an end value is provided and it's greater than the
start value \, swap incoming values to get difference and add 1 so
you end at the given value \, not one before. if it's not provided
use first value only for number of iterations;
#X obj 30 49 t f f;
#X obj 147 56 t f f;
#X obj 140 231 spigot;
#X obj 186 240 spigot;
#X obj 30 208 spigot;
#X obj 70 236 spigot;
#X obj 30 253 -;
#X obj 30 345 outlet diff;
#X obj 30 127 t f f;
#X obj 159 127 t f f;
#X obj 159 99 f;
#X obj 76 130 t f f f;
#X obj 76 159 == 0;
#X obj 76 181 t f f;
#X obj 57 73 <;
#X obj 57 95 t b f f;
#X obj 266 156 outlet up_or_down;
#X obj 266 112 * 2;
#X obj 266 134 - 1;
#X text 292 121 make 0 or 1 \, -1 or 1;
#X obj 30 27 inlet start_val;
#X obj 147 28 inlet end_val;
#X connect 0 0 1 0;
#X connect 0 1 1 1;
#X connect 1 0 10 0;
#X connect 3 0 11 0;
#X connect 3 1 17 0;
#X connect 4 0 17 1;
#X connect 4 1 13 1;
#X connect 5 0 0 0;
#X connect 6 0 0 1;
#X connect 7 0 9 0;
#X connect 8 0 9 1;
#X connect 9 0 10 0;
#X connect 11 0 7 0;
#X connect 11 1 5 0;
#X connect 12 0 8 0;
#X connect 12 1 6 0;
#X connect 13 0 12 0;
#X connect 14 0 15 0;
#X connect 14 1 5 1;
#X connect 14 2 6 1;
#X connect 15 0 16 0;
#X connect 16 0 7 1;
#X connect 16 1 8 1;
#X connect 17 0 18 0;
#X connect 18 0 13 0;
#X connect 18 1 14 0;
#X connect 18 2 20 0;
#X connect 20 0 21 0;
#X connect 21 0 19 0;
#X connect 23 0 3 0;
#X connect 24 0 4 0;
#X restore 178 358 pd swap_or_no_swap;
#X text 341 100 if a 0 is provided as an end value \, use a third \,
non zero argument to be able to use the end value;
#X obj 473 375 outlet up_or_down;
#X text 348 330 if no end value is provided send a zero to counter
start and the provided value to [sel]. otherwise send the first argument
to counter start and the second to [sel];
#X obj 576 281 outlet to_sel;
#X obj 127 295 t f f f;
#X obj 283 264 t f f;
#X obj 576 259 - 1;
#X obj 222 138 ||;
#X obj 310 225 t f f f f f;
#X obj 127 121 t f f;
#X obj 18 99 inlet input_val;
#X obj 127 177 spigot;
#X obj 18 146 spigot;
#X text 18 65 if no args are provided;
#X text 19 77 send incoming value to [sel];
#X obj 51 123 == 0;
#X obj 261 181 s \$0-args;
#X obj 222 160 t f f f;
#X text 321 168 send to [pd diffuse_bang] which is in the parent patch
of this subpatch to define whether a bang will go to [f ] or straight
to [until];
#X obj 127 99 inlet start_val;
#X obj 283 47 inlet end_val;
#X obj 399 47 inlet additional_val;
#X obj 283 293 spigot;
#N canvas 169 136 318 296 gate 0;
#X obj 50 77 t f f;
#X obj 50 149 spigot;
#X obj 50 171 outlet;
#X obj 165 149 spigot;
#X obj 165 171 outlet;
#X obj 50 55 inlet value;
#X obj 171 58 inlet which;
#X obj 171 80 t f f;
#X obj 83 120 == 0;
#X connect 0 0 1 0;
#X connect 0 1 3 0;
#X connect 1 0 2 0;
#X connect 3 0 4 0;
#X connect 5 0 0 0;
#X connect 6 0 7 0;
#X connect 7 0 8 0;
#X connect 7 1 3 1;
#X connect 8 0 1 1;
#X restore 127 242 pd gate;
#X connect 0 0 14 0;
#X connect 0 1 1 0;
#X connect 1 0 7 0;
#X connect 3 0 2 0;
#X connect 4 0 5 0;
#X connect 6 0 8 0;
#X connect 6 1 3 0;
#X connect 7 0 17 0;
#X connect 8 0 4 0;
#X connect 8 1 10 0;
#X connect 13 0 4 0;
#X connect 13 1 15 0;
#X connect 13 2 3 0;
#X connect 14 0 31 0;
#X connect 14 1 12 0;
#X connect 15 0 12 0;
#X connect 16 0 26 0;
#X connect 17 0 32 1;
#X connect 17 1 4 1;
#X connect 17 2 31 1;
#X connect 17 3 3 1;
#X connect 17 4 16 1;
#X connect 18 0 20 0;
#X connect 18 1 16 0;
#X connect 19 0 21 0;
#X connect 20 0 32 0;
#X connect 21 0 15 0;
#X connect 24 0 21 1;
#X connect 26 0 20 1;
#X connect 26 1 24 0;
#X connect 26 2 25 0;
#X connect 28 0 18 0;
#X connect 29 0 0 0;
#X connect 30 0 7 1;
#X connect 31 0 8 1;
#X connect 32 0 13 0;
#X connect 32 1 6 0;
#X restore 187 186 pd define_start_and_end;
#X obj 277 231 outlet up_or_down;
#X obj 52 15 inlet bang_or_val;
#X obj 160 58 t f f;
#X obj 52 41 route bang;
#N canvas 179 65 352 257 diffuse_bang 0;
#X obj 173 57 r \$0-args;
#X obj 57 57 inlet;
#X obj 57 79 t b b;
#X obj 57 137 spigot;
#X obj 167 137 spigot;
#X obj 173 79 t f f;
#X obj 90 111 == 0;
#X obj 57 159 outlet to_until;
#X obj 167 159 outlet to_f;
#X connect 0 0 5 0;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X connect 2 1 4 0;
#X connect 3 0 7 0;
#X connect 4 0 8 0;
#X connect 5 0 6 0;
#X connect 5 1 4 1;
#X connect 6 0 3 1;
#X restore 52 236 pd diffuse_bang;
#X connect 0 0 11 0;
#X connect 1 0 9 0;
#X connect 2 0 12 1;
#X connect 3 0 12 2;
#X connect 6 0 2 0;
#X connect 6 1 3 0;
#X connect 7 0 2 0;
#X connect 8 0 6 0;
#X connect 10 0 12 3;
#X connect 11 0 2 0;
#X connect 11 1 3 0;
#X connect 11 2 10 0;
#X connect 12 0 1 1;
#X connect 12 1 5 0;
#X connect 12 2 13 0;
#X connect 12 3 4 0;
#X connect 14 0 16 0;
#X connect 15 0 1 0;
#X connect 15 1 12 0;
#X connect 16 0 17 0;
#X connect 16 1 15 0;
#X connect 17 0 9 0;
#X connect 17 1 1 0;
#X restore 20 95 pd start-end;
#X obj 20 13 inlet bang_or_val;
#X obj 20 117 route bang;
#X obj 20 139 t b b;
#X connect 0 0 1 0;
#X connect 0 1 8 0;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X connect 2 0 4 0;
#X connect 3 0 2 1;
#X connect 4 0 5 0;
#X connect 4 1 6 0;
#X connect 5 0 7 0;
#X connect 8 0 2 1;
#X connect 9 0 12 1;
#X connect 10 0 12 2;
#X connect 11 0 1 1;
#X connect 12 0 14 0;
#X connect 12 1 8 1;
#X connect 12 2 3 1;
#X connect 12 3 5 1;
#X connect 13 0 12 0;
#X connect 14 0 15 0;
#X connect 14 1 0 0;
#X connect 15 0 1 0;
#X connect 15 1 8 0;


More information about the Pd-list mailing list