From 4c7c5eaf2df859cbff96ce635aef26d5a10f1fe9 Mon Sep 17 00:00:00 2001 From: Cyrille Henry Date: Wed, 26 Nov 2014 18:03:18 +0000 Subject: closestMassN can now filter massId svn path=/trunk/externals/pmpd/; revision=17383 --- pmpd2d_various.c | 71 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/pmpd2d_various.c b/pmpd2d_various.c index 64631d5..9c54b7f 100644 --- a/pmpd2d_various.c +++ b/pmpd2d_various.c @@ -505,35 +505,64 @@ void pmpd2d_closestMassN(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv) else posY = 0; - for (i=0; i < nbout; i++) // on remplie avec les premiere données disponible + if ( (argc >= 4) && (argv[3].a_type == A_SYMBOL) ) { - list_index[i] = i; - list_distance[i] = sqr(x->mass[i].posX - posX) + sqr(x->mass[i].posY - posY) ; - } - - for (i=1; i < nbout; i++) // trie a bulle pour ordoner cela - { - for (j=0; j < nbout-i; j++) + for (i=0; i < nbout; i++) // on remplie avec les données fausse pour commancer + { + list_index[i] = -1; + list_distance[i] = 1000000 ; + } + + for (i = 0; i< x->nb_mass; i++) // on test le reste des masses { - bulle_order(list_index, list_distance, j); - } + if (atom_getsymbolarg(3,argc,argv) == x->mass[i].Id) + { + dist = sqr(x->mass[i].posX - posX) + sqr(x->mass[i].posY - posY); + if (dist < list_distance[0]) // cette mass doit rentrer dans la liste + { + list_index[0] = i; + list_distance[0] = dist; + j = 0; + while ( (j < nbout-1) && bulle_order(list_index, list_distance, j) ) // on reordone la liste + { + j++; + } + } + } + } } - - for (i = nbout; i< x->nb_mass; i++) // on test le reste des masses + else { - dist = sqr(x->mass[i].posX - posX) + sqr(x->mass[i].posY - posY); - if (dist < list_distance[0]) // cette mass doit rentrer dans la liste + for (i=0; i < nbout; i++) // on remplie avec les premiere données disponible + { + list_index[i] = i; + list_distance[i] = sqr(x->mass[i].posX - posX) + sqr(x->mass[i].posY - posY) ; + } + + for (i=1; i < nbout; i++) // trie a bulle pour ordoner cela { - list_index[0] = i; - list_distance[0] = dist; - j = 0; - while ( (j < nbout-1) && bulle_order(list_index, list_distance, j) ) // on reordone la liste + for (j=0; j < nbout-i; j++) { - j++; + bulle_order(list_index, list_distance, j); + } + } + + for (i = nbout; i< x->nb_mass; i++) // on test le reste des masses + { + dist = sqr(x->mass[i].posX - posX) + sqr(x->mass[i].posY - posY); + if (dist < list_distance[0]) // cette mass doit rentrer dans la liste + { + list_index[0] = i; + list_distance[0] = dist; + j = 0; + while ( (j < nbout-1) && bulle_order(list_index, list_distance, j) ) // on reordone la liste + { + j++; + } } } - } - + } + for (i=0; i