aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Henry <nusmuk@users.sourceforge.net>2014-11-26 18:03:18 +0000
committerCyrille Henry <nusmuk@users.sourceforge.net>2014-11-26 18:03:18 +0000
commit4c7c5eaf2df859cbff96ce635aef26d5a10f1fe9 (patch)
tree3ee2efa9408d892b526575af824e3fc4811a8c98
parentcc47441c1922f219064c174f46b1fe50aa504fd0 (diff)
closestMassN can now filter massId
svn path=/trunk/externals/pmpd/; revision=17383
-rw-r--r--pmpd2d_various.c71
1 files 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<nbout; i++)
{
SETFLOAT(&(std_out[2*i]), list_index[nbout-1-i]);