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 --- pmpd3d_various.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) (limited to 'pmpd3d_various.c') diff --git a/pmpd3d_various.c b/pmpd3d_various.c index a3e823b..d3e4297 100644 --- a/pmpd3d_various.c +++ b/pmpd3d_various.c @@ -558,6 +558,93 @@ void pmpd3d_massDistances(t_pmpd3d *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 pmpd3d_closestMassN(t_pmpd3d *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; + + if ( (argc >= 4) && (argv[3].a_type == A_FLOAT) ) + posZ = atom_getfloatarg(3, argc, argv); + else + posZ = 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) + sqr(x->mass[i].posZ - posZ); + } + + 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) + sqr(x->mass[i].posZ - posZ); + if (dist < list_distance[0]) // cette mass doit rentrer dans la liste + { + list_index[0] = i; + list_distance[0] = dist; + j = 0; + while ( (jmain_outlet, gensym("closestMassN"),2*nbout,std_out); +} + + /* void pmpd3d_forcesXT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { @@ -697,3 +784,4 @@ void pmpd3d_forcesZT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } */ + -- cgit v1.2.1