From 2b5ae7744de11430fe34b8d399dd836aa80dc1e1 Mon Sep 17 00:00:00 2001 From: Cyrille Henry Date: Wed, 15 Oct 2014 17:38:13 +0000 Subject: add new message : closestMassN to get a list of the N closest mass to a point svn path=/trunk/externals/pmpd/; revision=17359 --- pmpd2d_various.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) (limited to 'pmpd2d_various.c') diff --git a/pmpd2d_various.c b/pmpd2d_various.c index 7a31c4f..64631d5 100644 --- a/pmpd2d_various.c +++ b/pmpd2d_various.c @@ -462,6 +462,87 @@ void pmpd2d_massDistances(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv) } } +int bulle_order(t_int *listIndex, t_float *listDistance, t_int index) +{ + t_int tmpI; + t_float tmpD; + + if ( listDistance[index] < listDistance[index+1] ) + { + tmpD = listDistance[index]; + tmpI = listIndex[index]; + listDistance[index] = listDistance[index+1]; + listIndex[index] = listIndex[index+1]; + listDistance[index+1] = tmpD; + listIndex[index+1]= tmpI; + return(1); + } + return(0); +} + +void pmpd2d_closestMassN(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv) +{ + t_float dist; + t_int i, j, nbout, list_index[x->nb_mass]; + t_float list_distance[x->nb_mass]; + t_atom std_out[x->nb_mass * 2]; + t_float posX, posY, posZ; + + if ( (argc >= 1) && (argv[0].a_type == A_FLOAT) ) + nbout = atom_getfloatarg(0, argc, argv); + else + nbout = 1; + nbout = max(nbout,0); + nbout = min(nbout,x->nb_mass); + + if ( (argc >= 2) && (argv[1].a_type == A_FLOAT) ) + posX = atom_getfloatarg(1, argc, argv); + else + posX = 0; + + if ( (argc >= 3) && (argv[2].a_type == A_FLOAT) ) + posY = atom_getfloatarg(2, argc, argv); + else + posY = 0; + + 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 + { + for (j=0; j < nbout-i; 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; imain_outlet, gensym("closestMassN"),2*nbout,std_out); +} + /* void pmpd2d_forcesXT(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv) { -- cgit v1.2.1