From d6aeb7ce5870ac9a95e20a39660664a3f4e9d4be Mon Sep 17 00:00:00 2001 From: Cyrille Henry Date: Sat, 16 Feb 2013 14:10:59 +0000 Subject: bugfix svn path=/trunk/externals/pmpd/; revision=17036 --- pmpd3d.c | 4 +- pmpd3d_get.c | 2 +- pmpd3d_stat.c | 323 +++++++++++++++++----------- pmpd3d_test.c | 635 ++++++++++++++++++++++++++++--------------------------- pmpd3d_various.c | 36 +++- 5 files changed, 549 insertions(+), 451 deletions(-) diff --git a/pmpd3d.c b/pmpd3d.c index 91b9318..b428b02 100644 --- a/pmpd3d.c +++ b/pmpd3d.c @@ -237,8 +237,8 @@ void pmpd3d_setup(void) class_addmethod(pmpd3d_class, (t_method)pmpd3d_testLink, gensym("testLink"), A_GIMME, 0); class_addmethod(pmpd3d_class, (t_method)pmpd3d_testMassT, gensym("testMassT"), A_GIMME, 0); class_addmethod(pmpd3d_class, (t_method)pmpd3d_testLinkT, gensym("testLinkT"), A_GIMME, 0); - class_addmethod(pmpd3d_class, (t_method)pmpd3d_testMassT, gensym("testMassL"), A_GIMME, 0); - class_addmethod(pmpd3d_class, (t_method)pmpd3d_testLinkT, gensym("testLinkL"), A_GIMME, 0); + class_addmethod(pmpd3d_class, (t_method)pmpd3d_testMassL, gensym("testMassL"), A_GIMME, 0); + class_addmethod(pmpd3d_class, (t_method)pmpd3d_testLinkL, gensym("testLinkL"), A_GIMME, 0); // pmpd3d_stat class_addmethod(pmpd3d_class, (t_method)pmpd3d_massPosMean, gensym("massPosMean"), A_GIMME, 0); diff --git a/pmpd3d_get.c b/pmpd3d_get.c index b9ea18f..c23b594 100644 --- a/pmpd3d_get.c +++ b/pmpd3d_get.c @@ -501,7 +501,7 @@ void pmpd3d_linkEnd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) if ((argc>0)&&(argv[0].a_type == A_FLOAT)) { i = atom_getfloatarg(0, argc, argv); - if ( (i>=0) && (inb_mass) ) + if ( (i>=0) && (inb_link) ) { SETSYMBOL(&(toout[0]), x->link[i].Id); SETFLOAT(&(toout[1]), i); diff --git a/pmpd3d_stat.c b/pmpd3d_stat.c index b337041..18ab6ff 100644 --- a/pmpd3d_stat.c +++ b/pmpd3d_stat.c @@ -36,10 +36,13 @@ void pmpd3d_massPosMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } SETFLOAT(&(mean[0]),sommeX); SETFLOAT(&(mean[1]),sommeY); @@ -79,10 +82,14 @@ void pmpd3d_massPosStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) j++; } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } + for (i=0; i< x->nb_mass; i++) { if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id) @@ -104,10 +111,13 @@ void pmpd3d_massPosStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) somme += sqrt(sqr(x->mass[i].posX) + sqr(x->mass[i].posY) + sqr(x->mass[i].posZ)); // distance au centre j++; } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } for (i=0; i< x->nb_mass; i++) { stdX += sqr(x->mass[i].posX-sommeX); @@ -168,10 +178,13 @@ void pmpd3d_massForceMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } SETFLOAT(&(mean[0]),sommeX); SETFLOAT(&(mean[1]),sommeY); @@ -211,10 +224,13 @@ void pmpd3d_massForceStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) j++; } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } for (i=0; i< x->nb_mass; i++) { if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id) @@ -236,10 +252,13 @@ void pmpd3d_massForceStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) somme += sqrt(sqr(x->mass[i].forceX) + sqr(x->mass[i].forceY) + sqr(x->mass[i].forceZ)); j++; } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } for (i=0; i< x->nb_mass; i++) { stdX += sqr(x->mass[i].forceX-sommeX); @@ -300,10 +319,13 @@ void pmpd3d_massSpeedMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } SETFLOAT(&(mean[0]),sommeX); SETFLOAT(&(mean[1]),sommeY); @@ -343,10 +365,13 @@ void pmpd3d_massSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) j++; } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } for (i=0; i< x->nb_mass; i++) { if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id) @@ -368,10 +393,13 @@ void pmpd3d_massSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) somme += sqrt(sqr(x->mass[i].speedX) + sqr(x->mass[i].speedY) + sqr(x->mass[i].speedZ)); j++; } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } for (i=0; i< x->nb_mass; i++) { stdX += sqr(x->mass[i].speedX-sommeX); @@ -432,10 +460,13 @@ void pmpd3d_linkPosMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } SETFLOAT(&(mean[0]),sommeX); SETFLOAT(&(mean[1]),sommeY); @@ -447,7 +478,7 @@ void pmpd3d_linkPosMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) void pmpd3d_linkLengthMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { - t_float sommeX, sommeY, sommeZ, somme, tmp; + t_float sommeX, sommeY, sommeZ, somme; t_int i,j; t_atom mean[4]; @@ -463,30 +494,33 @@ void pmpd3d_linkLengthMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { if (atom_getsymbolarg(0,argc,argv) == x->link[i].Id) { - sommeX += abs(x->link[i].mass1->posX - x->link[i].mass2->posX); - sommeX += abs(x->link[i].mass1->posY - x->link[i].mass2->posY); - sommeX += abs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); + sommeX += fabs(x->link[i].mass1->posX - x->link[i].mass2->posX); + sommeY += fabs(x->link[i].mass1->posY - x->link[i].mass2->posY); + sommeZ += fabs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); somme += x->link[i].distance; - j++; + j+=1; } } } - else + else if (argc == 0) { for (i=0; i< x->nb_link; i++) { - sommeX += abs(x->link[i].mass1->posX - x->link[i].mass2->posX); - sommeX += abs(x->link[i].mass1->posY - x->link[i].mass2->posY); - sommeX += abs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); + sommeX += fabs(x->link[i].mass1->posX - x->link[i].mass2->posX); + sommeY += fabs(x->link[i].mass1->posY - x->link[i].mass2->posY); + sommeZ += fabs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); somme += x->link[i].distance; - j++; + j+=1; } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if (j>0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } SETFLOAT(&(mean[0]),sommeX); SETFLOAT(&(mean[1]),sommeY); @@ -534,10 +568,13 @@ void pmpd3d_linkPosSpeedMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if (j>0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } SETFLOAT(&(mean[0]),sommeX); SETFLOAT(&(mean[1]),sommeY); @@ -565,9 +602,9 @@ void pmpd3d_linkLengthSpeedMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv { if (atom_getsymbolarg(0,argc,argv) == x->link[i].Id) { - sommeX += abs(x->link[i].mass1->speedX - x->link[i].mass2->speedX); - sommeX += abs(x->link[i].mass1->speedY - x->link[i].mass2->speedY); - sommeX += abs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ); + sommeX += fabs(x->link[i].mass1->speedX - x->link[i].mass2->speedX); + sommeY += fabs(x->link[i].mass1->speedY - x->link[i].mass2->speedY); + sommeZ += fabs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ); somme += sqrt(sqr(x->link[i].mass1->speedX - x->link[i].mass2->speedX) + sqr(x->link[i].mass1->speedY - x->link[i].mass2->speedY) + sqr(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ)); @@ -579,9 +616,9 @@ void pmpd3d_linkLengthSpeedMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv { for (i=0; i< x->nb_link; i++) { - sommeX += abs(x->link[i].mass1->speedX - x->link[i].mass2->speedX); - sommeX += abs(x->link[i].mass1->speedY - x->link[i].mass2->speedY); - sommeX += abs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ); + sommeX += fabs(x->link[i].mass1->speedX - x->link[i].mass2->speedX); + sommeY += fabs(x->link[i].mass1->speedY - x->link[i].mass2->speedY); + sommeZ += fabs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ); somme += sqrt(sqr(x->link[i].mass1->speedX - x->link[i].mass2->speedX) + sqr(x->link[i].mass1->speedY - x->link[i].mass2->speedY) + sqr(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ)); @@ -589,10 +626,13 @@ void pmpd3d_linkLengthSpeedMean(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if (j>0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } SETFLOAT(&(mean[0]),sommeX); SETFLOAT(&(mean[1]),sommeY); @@ -645,10 +685,13 @@ void pmpd3d_linkPosStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if (j>0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) ) { @@ -676,11 +719,14 @@ void pmpd3d_linkPosStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - stdX = sqrt(stdX/j); - stdY = sqrt(stdY/j); - stdZ = sqrt(stdZ/j); - std = sqrt(std /j); - + if ( j > 0) + { + stdX = sqrt(stdX/j); + stdY = sqrt(stdY/j); + stdZ = sqrt(stdZ/j); + std = sqrt(std /j); + } + SETFLOAT(&(std_out[0]),stdX); SETFLOAT(&(std_out[1]),stdY); SETFLOAT(&(std_out[2]),stdZ); @@ -712,9 +758,9 @@ void pmpd3d_linkLengthStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { if (atom_getsymbolarg(0,argc,argv) == x->link[i].Id) { - sommeX += abs(x->link[i].mass1->posX - x->link[i].mass2->posX); - sommeX += abs(x->link[i].mass1->posY - x->link[i].mass2->posY); - sommeX += abs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); + sommeX += fabs(x->link[i].mass1->posX - x->link[i].mass2->posX); + sommeY += fabs(x->link[i].mass1->posY - x->link[i].mass2->posY); + sommeZ += fabs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); somme += x->link[i].distance; j+=1; } @@ -724,18 +770,21 @@ void pmpd3d_linkLengthStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { for (i=0; i< x->nb_link; i++) { - sommeX += abs(x->link[i].mass1->posX - x->link[i].mass2->posX); - sommeX += abs(x->link[i].mass1->posY - x->link[i].mass2->posY); - sommeX += abs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); + sommeX += fabs(x->link[i].mass1->posX - x->link[i].mass2->posX); + sommeY += fabs(x->link[i].mass1->posY - x->link[i].mass2->posY); + sommeZ += fabs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); somme += x->link[i].distance; j+=1; } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) ) { @@ -743,9 +792,9 @@ void pmpd3d_linkLengthStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { if (atom_getsymbolarg(0,argc,argv) == x->link[i].Id) { - stdX += sqr(abs(x->link[i].mass1->posX - x->link[i].mass2->posX)-sommeX); - stdX += sqr(abs(x->link[i].mass1->posY - x->link[i].mass2->posY)-sommeY); - stdX += sqr(abs(x->link[i].mass1->posZ - x->link[i].mass2->posZ)-sommeZ); + stdX += sqr(fabs(x->link[i].mass1->posX - x->link[i].mass2->posX)-sommeX); + stdY += sqr(fabs(x->link[i].mass1->posY - x->link[i].mass2->posY)-sommeY); + stdZ += sqr(fabs(x->link[i].mass1->posZ - x->link[i].mass2->posZ)-sommeZ); std += sqr(x->link[i].distance - somme); j+=1; } @@ -755,18 +804,22 @@ void pmpd3d_linkLengthStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { for (i=0; i< x->nb_link; i++) { - stdX += sqr(abs(x->link[i].mass1->posX - x->link[i].mass2->posX) - sommeX); - stdX += sqr(abs(x->link[i].mass1->posY - x->link[i].mass2->posY) - sommeY); - stdX += sqr(abs(x->link[i].mass1->posZ - x->link[i].mass2->posZ) - sommeZ); + stdX += sqr(fabs(x->link[i].mass1->posX - x->link[i].mass2->posX) - sommeX); + stdY += sqr(fabs(x->link[i].mass1->posY - x->link[i].mass2->posY) - sommeY); + stdZ += sqr(fabs(x->link[i].mass1->posZ - x->link[i].mass2->posZ) - sommeZ); std += sqr(x->link[i].distance - somme); j+=1; } } - - stdX = sqrt(stdX/j); - stdY = sqrt(stdY/j); - stdZ = sqrt(stdZ/j); - std = sqrt(std /j); + + if ( j > 0) + { + stdX = sqrt(stdX/j); + stdY = sqrt(stdY/j); + stdZ = sqrt(stdZ/j); + std = sqrt(std /j); + } + SETFLOAT(&(std_out[0]),stdX); SETFLOAT(&(std_out[1]),stdY); @@ -819,10 +872,13 @@ void pmpd3d_linkPosSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) ) { @@ -833,7 +889,7 @@ void pmpd3d_linkPosSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) stdX += sqr((x->link[i].mass1->speedX + x->link[i].mass2->speedX)/2-sommeX); stdY += sqr((x->link[i].mass1->speedY + x->link[i].mass2->speedY)/2-sommeY); stdZ += sqr((x->link[i].mass1->speedZ + x->link[i].mass2->speedZ)/2-sommeZ); - somme += sqr(sqrt(sqr((x->link[i].mass1->speedX+x->link[i].mass2->speedX)/2) + sqr((x->link[i].mass1->speedY + x->link[i].mass2->speedY)/2) + sqr((x->link[i].mass1->speedZ + x->link[i].mass2->speedZ)/2)) - somme); + std += sqr(sqrt(sqr((x->link[i].mass1->speedX+x->link[i].mass2->speedX)/2) + sqr((x->link[i].mass1->speedY + x->link[i].mass2->speedY)/2) + sqr((x->link[i].mass1->speedZ + x->link[i].mass2->speedZ)/2)) - somme); j++; } } @@ -845,15 +901,19 @@ void pmpd3d_linkPosSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) stdX += sqr((x->link[i].mass1->speedX + x->link[i].mass2->speedX)/2-sommeX); stdY += sqr((x->link[i].mass1->speedY + x->link[i].mass2->speedY)/2-sommeY); stdZ += sqr((x->link[i].mass1->speedZ + x->link[i].mass2->speedZ)/2-sommeZ); - somme += sqr(sqrt(sqr((x->link[i].mass1->speedX+x->link[i].mass2->speedX)/2) + sqr((x->link[i].mass1->speedY + x->link[i].mass2->speedY)/2) + sqr((x->link[i].mass1->speedZ + x->link[i].mass2->speedZ)/2)) - somme); + std += sqr(sqrt(sqr((x->link[i].mass1->speedX+x->link[i].mass2->speedX)/2) + sqr((x->link[i].mass1->speedY + x->link[i].mass2->speedY)/2) + sqr((x->link[i].mass1->speedZ + x->link[i].mass2->speedZ)/2)) - somme); j++; } } - stdX = sqrt(stdX/j); - stdY = sqrt(stdY/j); - stdZ = sqrt(stdZ/j); - std = sqrt(std /j); + if ( j > 0) + { + stdX = sqrt(stdX/j); + stdY = sqrt(stdY/j); + stdZ = sqrt(stdZ/j); + std = sqrt(std /j); + } + SETFLOAT(&(std_out[0]),stdX); SETFLOAT(&(std_out[1]),stdY); @@ -886,9 +946,9 @@ void pmpd3d_linkLengthSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { if (atom_getsymbolarg(0,argc,argv) == x->link[i].Id) { - sommeX += abs(x->link[i].mass1->speedX - x->link[i].mass2->speedX); - sommeX += abs(x->link[i].mass1->speedY - x->link[i].mass2->speedY); - sommeX += abs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ); + sommeX += fabs(x->link[i].mass1->speedX - x->link[i].mass2->speedX); + sommeY += fabs(x->link[i].mass1->speedY - x->link[i].mass2->speedY); + sommeZ += fabs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ); somme += sqrt(sqr(x->link[i].mass1->speedX - x->link[i].mass2->speedX) + sqr(x->link[i].mass1->speedY - x->link[i].mass2->speedY) + sqr(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ)); @@ -900,9 +960,9 @@ void pmpd3d_linkLengthSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { for (i=0; i< x->nb_link; i++) { - sommeX += abs(x->link[i].mass1->speedX - x->link[i].mass2->speedX); - sommeX += abs(x->link[i].mass1->speedY - x->link[i].mass2->speedY); - sommeX += abs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ); + sommeX += fabs(x->link[i].mass1->speedX - x->link[i].mass2->speedX); + sommeY += fabs(x->link[i].mass1->speedY - x->link[i].mass2->speedY); + sommeZ += fabs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ); somme += sqrt(sqr(x->link[i].mass1->speedX - x->link[i].mass2->speedX) + sqr(x->link[i].mass1->speedY - x->link[i].mass2->speedY) + sqr(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ)); @@ -910,10 +970,13 @@ void pmpd3d_linkLengthSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - sommeX /= j; - sommeY /= j; - sommeZ /= j; - somme /= j; + if ( j> 0) + { + sommeX /= j; + sommeY /= j; + sommeZ /= j; + somme /= j; + } if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) ) { @@ -921,9 +984,9 @@ void pmpd3d_linkLengthSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { if (atom_getsymbolarg(0,argc,argv) == x->link[i].Id) { - stdX += sqr(abs(x->link[i].mass1->speedX - x->link[i].mass2->speedX) - sommeX); - stdX += sqr(abs(x->link[i].mass1->speedY - x->link[i].mass2->speedY) - sommeY); - stdX += sqr(abs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ) - sommeZ); + stdX += sqr(fabs(x->link[i].mass1->speedX - x->link[i].mass2->speedX) - sommeX); + stdY += sqr(fabs(x->link[i].mass1->speedY - x->link[i].mass2->speedY) - sommeY); + stdZ += sqr(fabs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ) - sommeZ); std += sqr( sqrt(sqr(x->link[i].mass1->speedX - x->link[i].mass2->speedX) + sqr(x->link[i].mass1->speedY - x->link[i].mass2->speedY) + sqr(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ)) - somme); @@ -935,9 +998,9 @@ void pmpd3d_linkLengthSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { for (i=0; i< x->nb_link; i++) { - stdX += sqr(abs(x->link[i].mass1->speedX - x->link[i].mass2->speedX) - sommeX); - stdX += sqr(abs(x->link[i].mass1->speedY - x->link[i].mass2->speedY) - sommeY); - stdX += sqr(abs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ) - sommeZ); + stdX += sqr(fabs(x->link[i].mass1->speedX - x->link[i].mass2->speedX) - sommeX); + stdY += sqr(fabs(x->link[i].mass1->speedY - x->link[i].mass2->speedY) - sommeY); + stdZ += sqr(fabs(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ) - sommeZ); std += sqr( sqrt(sqr(x->link[i].mass1->speedX - x->link[i].mass2->speedX) + sqr(x->link[i].mass1->speedY - x->link[i].mass2->speedY) + sqr(x->link[i].mass1->speedZ - x->link[i].mass2->speedZ)) - somme); @@ -945,10 +1008,14 @@ void pmpd3d_linkLengthSpeedStd(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } - stdX = sqrt(stdX/j); - stdY = sqrt(stdY/j); - stdZ = sqrt(stdZ/j); - std = sqrt(std /j); + if ( j > 0) + { + stdX = sqrt(stdX/j); + stdY = sqrt(stdY/j); + stdZ = sqrt(stdZ/j); + std = sqrt(std /j); + } + SETFLOAT(&(std_out[0]),stdX); SETFLOAT(&(std_out[1]),stdY); diff --git a/pmpd3d_test.c b/pmpd3d_test.c index 8aa3a5f..f90c3f3 100644 --- a/pmpd3d_test.c +++ b/pmpd3d_test.c @@ -1,183 +1,159 @@ int test_3d_mass(int i, t_pmpd3d *x, int argc, t_atom *argv) { - t_int tmp, tmp2; + t_float tmp, tmp2; t_int j = 1; while (j < argc) { - if (atom_getsymbolarg(j,argc,argv) == gensym("Id") ) - { - if ( x->mass[i].Id != atom_getsymbolarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("posXSup") ) - { - if ( x->mass[i].posX < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("posXInf") ) - { - if ( x->mass[i].posX >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("posYSup") ) - { - if ( x->mass[i].posY < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("posYInf") ) - { - if ( x->mass[i].posY >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("posZSup") ) - { - if ( x->mass[i].posZ < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("posZInf") ) - { - if ( x->mass[i].posZ >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedXSup") ) - { - if ( x->mass[i].speedX < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedXInf") ) - { - if ( x->mass[i].speedX >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedYSup") ) - { - if ( x->mass[i].speedY < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedYInf") ) - { - if ( x->mass[i].speedY >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedZSup") ) - { - if ( x->mass[i].speedZ < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedZInf") ) - { - if ( x->mass[i].speedZ >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedSup") ) - { - tmp = x->mass[i].speedX * x->mass[i].speedX; - tmp += x->mass[i].speedY * x->mass[i].speedY; - tmp += x->mass[i].speedZ * x->mass[i].speedZ; - - if ( ( tmp < atom_getfloatarg(j+1,argc,argv)) * atom_getfloatarg(j+1,argc,argv) ) { return(0); } - - j+= 2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedInf") ) - { - tmp = x->mass[i].speedX * x->mass[i].speedX; - tmp += x->mass[i].speedY * x->mass[i].speedY; - tmp += x->mass[i].speedZ * x->mass[i].speedZ; - - if ( ( tmp >= atom_getfloatarg(j+1,argc,argv)) * atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("distanceCircleInf")) - { - tmp = x->mass[i].posX - atom_getfloatarg(j+1,argc,argv); - tmp *= tmp; - tmp2 = x->mass[i].posY - atom_getfloatarg(j+2,argc,argv); - tmp = tmp + tmp2 * tmp2; - tmp2 = x->mass[i].posZ - atom_getfloatarg(j+3,argc,argv); - tmp = tmp + tmp2 * tmp2; - tmp2 = atom_getfloatarg(j+4,argc,argv); - - if ( tmp >= (tmp2 * tmp2) ) { return(0); } - j += 5; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("distanceCircleSup")) + if (argv[j].a_type != A_SYMBOL) { - tmp = x->mass[i].posX - atom_getfloatarg(j+1,argc,argv); - tmp *= tmp; - tmp2 = x->mass[i].posY - atom_getfloatarg(j+2,argc,argv); - tmp = tmp + tmp2 * tmp2; - tmp2 = x->mass[i].posZ - atom_getfloatarg(j+3,argc,argv); - tmp = tmp + tmp2 * tmp2; - tmp2 = atom_getfloatarg(j+4,argc,argv); - - if ( tmp < (tmp2 * tmp2) ) { return(0); } - j += 5; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("massSup")) - { - tmp = 1/ x->mass[i].invM; - if ( tmp < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j += 2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("massInf")) - { - tmp = 1/ x->mass[i].invM; - if ( tmp >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j += 2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceSup") ) - { - tmp = x->mass[i].forceX * x->mass[i].forceX; - tmp += x->mass[i].forceY * x->mass[i].forceY; - tmp += x->mass[i].forceZ * x->mass[i].forceZ; - - if ( ( tmp < atom_getfloatarg(j+1,argc,argv)) * atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+= 2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceInf") ) - { - tmp = x->mass[i].forceX * x->mass[i].forceX; - tmp += x->mass[i].forceY * x->mass[i].forceY; - tmp += x->mass[i].forceZ * x->mass[i].forceZ; - - if ( ( tmp >= atom_getfloatarg(j+1,argc,argv)) * atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+= 2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("forceXSup") ) - { - if ( x->mass[i].forceX < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("forceXInf") ) - { - if ( x->mass[i].forceX >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("forceYSup") ) - { - if ( x->mass[i].forceY < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("forceYInf") ) - { - if ( x->mass[i].forceY >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("forceZSup") ) - { - if ( x->mass[i].forceZ < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("forceZInf") ) - { - if ( x->mass[i].forceZ >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; + j++; } else { - post("nor reconize %s",atom_getsymbolarg(j,argc,argv)); - j+=1; + if (atom_getsymbolarg(j,argc,argv) == gensym("Id") ) + { + if ( x->mass[i].Id != atom_getsymbolarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("posXSup") ) + { + if ( x->mass[i].posX < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("posXInf") ) + { + if ( x->mass[i].posX >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("posYSup") ) + { + if ( x->mass[i].posY < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("posYInf") ) + { + if ( x->mass[i].posY >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("posZSup") ) + { + if ( x->mass[i].posZ < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("posZInf") ) + { + if ( x->mass[i].posZ >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedXSup") ) + { + if ( x->mass[i].speedX < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedXInf") ) + { + if ( x->mass[i].speedX >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedYSup") ) + { + if ( x->mass[i].speedY < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedYInf") ) + { + if ( x->mass[i].speedY >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedZSup") ) + { + if ( x->mass[i].speedZ < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedZInf") ) + { + if ( x->mass[i].speedZ >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedSup") ) + { + if ( sqrt(sqr(x->mass[i].speedX)+sqr(x->mass[i].speedY)+sqr(x->mass[i].speedZ)) < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+= 2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("speedInf") ) + { + if ( sqrt(sqr(x->mass[i].speedX)+sqr(x->mass[i].speedY)+sqr(x->mass[i].speedZ)) >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("distanceCircleInf")) + { + tmp = sqr(x->mass[i].posX - atom_getfloatarg(j+1,argc,argv))+sqr(x->mass[i].posY - atom_getfloatarg(j+2,argc,argv))+sqr(x->mass[i].posZ - atom_getfloatarg(j+3,argc,argv)); + if ( tmp >= sqr(atom_getfloatarg(j+4,argc,argv)) ) { return(0); } + j += 5; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("distanceCircleSup")) + { + tmp = sqr(x->mass[i].posX - atom_getfloatarg(j+1,argc,argv))+sqr(x->mass[i].posY - atom_getfloatarg(j+2,argc,argv))+sqr(x->mass[i].posZ - atom_getfloatarg(j+3,argc,argv)); + if ( tmp < sqr(atom_getfloatarg(j+4,argc,argv)) ) { return(0); } + j += 5; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("massSup")) + { + if ( 1/ x->mass[i].invM < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j += 2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("massInf")) + { + if ( 1/ x->mass[i].invM >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j += 2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceSup") ) + { + tmp = sqr(x->mass[i].forceX) + sqr(x->mass[i].forceY) + sqr(x->mass[i].forceZ); + if ( ( tmp < atom_getfloatarg(j+1,argc,argv)) * atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+= 2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceInf") ) + { + tmp = sqr(x->mass[i].forceX) + sqr(x->mass[i].forceY) + sqr(x->mass[i].forceZ); + if ( ( tmp >= atom_getfloatarg(j+1,argc,argv)) * atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+= 2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("forceXSup") ) + { + if ( x->mass[i].forceX < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("forceXInf") ) + { + if ( x->mass[i].forceX >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("forceYSup") ) + { + if ( x->mass[i].forceY < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("forceYInf") ) + { + if ( x->mass[i].forceY >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("forceZSup") ) + { + if ( x->mass[i].forceZ < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("forceZInf") ) + { + if ( x->mass[i].forceZ >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else + { + post("Option \"%s\" not reconized, stoping test",atom_getsymbolarg(j,argc,argv)->s_name); + return(-1); + } } } return(1); @@ -185,189 +161,192 @@ int test_3d_mass(int i, t_pmpd3d *x, int argc, t_atom *argv) int test_3d_link(int i, t_pmpd3d *x, int argc, t_atom *argv) { - t_int j, tmp, tmp2; + t_int j; + t_float tmp, tmp2; j = 1; - while (j < argc-1) + while (j < argc) { - if (atom_getsymbolarg(j,argc,argv) == gensym("Id") ) - { - if ( x->link[i].Id != atom_getsymbolarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if (atom_getsymbolarg(j,argc,argv) == gensym("forceXSup") ) - { - if ( x->link[i].forceX < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; + if (argv[j].a_type != A_SYMBOL) + { + j++; } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceXInf") ) + else { - if ( x->link[i].forceX >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } + if (atom_getsymbolarg(j,argc,argv) == gensym("Id") ) + { + if ( x->link[i].Id != atom_getsymbolarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if (atom_getsymbolarg(j,argc,argv) == gensym("forceXSup") ) + { + if ( x->link[i].forceX < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceXInf") ) + { + if ( x->link[i].forceX >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } else if (atom_getsymbolarg(j,argc,argv) == gensym("forceYSup") ) - { - if ( x->link[i].forceY < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceYInf") ) - { - if ( x->link[i].forceY >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } + { + if ( x->link[i].forceY < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceYInf") ) + { + if ( x->link[i].forceY >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } else if (atom_getsymbolarg(j,argc,argv) == gensym("forceZSup") ) - { - if ( x->link[i].forceZ < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceZInf") ) - { - if ( x->link[i].forceZ >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } + { + if ( x->link[i].forceZ < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceZInf") ) + { + if ( x->link[i].forceZ >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } else if (atom_getsymbolarg(j,argc,argv) == gensym("forceSup") ) - { - tmp = x->link[i].forceX; - tmp *= tmp; - tmp2 = x->link[i].forceY; - tmp = tmp + tmp2*tmp2; - tmp2 = x->link[i].forceZ; - tmp = tmp + tmp2*tmp2; - - tmp2 = atom_getfloatarg(j+1,argc,argv); - tmp2 *= tmp2; - - if ( tmp < tmp2 ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceInf") ) - { - tmp = x->link[i].forceX; - tmp = tmp * tmp; - tmp2 = x->link[i].forceY; - tmp = tmp + tmp2*tmp2; - tmp2 = x->link[i].forceZ; - tmp = tmp + tmp2*tmp2; - - tmp2 = atom_getfloatarg(j+1,argc,argv); - tmp2 *= tmp2; - - if ( tmp >= tmp2 ) { return(0); } - j+=2; - } + { + tmp = sqr(x->link[i].forceX) + sqr(x->link[i].forceY) + sqr(x->link[i].forceZ); + tmp2 = sqr(atom_getfloatarg(j+1,argc,argv)); + if ( tmp < tmp2 ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("forceInf") ) + { + tmp = sqr(x->link[i].forceX) + sqr(x->link[i].forceY) + sqr(x->link[i].forceZ); + tmp2 = sqr(atom_getfloatarg(j+1,argc,argv)); + if ( tmp >= tmp2 ) { return(0); } + j+=2; + } else if (atom_getsymbolarg(j,argc,argv) == gensym("lengthSup") ) - { - if ( x->link[i].distance < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthInf") ) - { - if ( x->link[i].distance >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthXInf") ) - { - tmp = abs(x->link[i].mass1->posX - x->link[i].mass2->posX); - if ( tmp >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthXSup") ) - { - tmp = abs(x->link[i].mass1->posX - x->link[i].mass2->posX); - if ( tmp < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthYInf") ) - { - tmp = abs(x->link[i].mass1->posY - x->link[i].mass2->posY); - if ( tmp >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthYSup") ) - { - tmp = abs(x->link[i].mass1->posY - x->link[i].mass2->posY); - if ( tmp < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthZInf") ) - { - tmp = abs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); - if ( tmp >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthZSup") ) - { - tmp = abs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); - if ( tmp < atom_getfloatarg(j+1,argc,argv) ) { return(0); } - j+=2; - } - else if ( atom_getsymbolarg(j,argc,argv) == gensym("connectedTo") ) - { - if (argv[j+1].a_type == A_SYMBOL) { - if (!( (x->link[i].mass1->Id == atom_getsymbolarg(j+1,argc,argv)) || (x->link[i].mass2->Id == atom_getsymbolarg(j+1,argc,argv)) )) - { return(0); } - j+=2; + if ( x->link[i].distance < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthInf") ) + { + if ( x->link[i].distance >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; } - else if (argv[j+1].a_type == A_FLOAT) + else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthXInf") ) { - if (!( (x->link[i].mass1->num == atom_getfloatarg(j+1,argc,argv)) || (x->link[i].mass2->num == atom_getfloatarg(j+1,argc,argv)) )) - { return(0); } + tmp = fabs(x->link[i].mass1->posX - x->link[i].mass2->posX); + if ( tmp >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } j+=2; } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthXSup") ) + { + tmp = fabs(x->link[i].mass1->posX - x->link[i].mass2->posX); + if ( tmp < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthYInf") ) + { + tmp = fabs(x->link[i].mass1->posY - x->link[i].mass2->posY); + if ( tmp >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthYSup") ) + { + tmp = fabs(x->link[i].mass1->posY - x->link[i].mass2->posY); + if ( tmp < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthZInf") ) + { + tmp = fabs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); + if ( tmp >= atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("lengthZSup") ) + { + tmp = fabs(x->link[i].mass1->posZ - x->link[i].mass2->posZ); + if ( tmp < atom_getfloatarg(j+1,argc,argv) ) { return(0); } + j+=2; + } + else if ( atom_getsymbolarg(j,argc,argv) == gensym("connectedTo") ) + { + if (argv[j+1].a_type == A_SYMBOL) + { + if (!( (x->link[i].mass1->Id == atom_getsymbolarg(j+1,argc,argv)) || (x->link[i].mass2->Id == atom_getsymbolarg(j+1,argc,argv)) )) + { return(0); } + j+=2; + } + else if (argv[j+1].a_type == A_FLOAT) + { + if (!( (x->link[i].mass1->num == atom_getfloatarg(j+1,argc,argv)) || (x->link[i].mass2->num == atom_getfloatarg(j+1,argc,argv)) )) + { return(0); } + j+=2; + } + else + { + post("bad argument for connectedTo"); + j+=1; + } + } else { - post("bad argument for connectedTo"); - j+=1; + post("Option \"%s\" not reconized, stoping test",atom_getsymbolarg(j,argc,argv)->s_name); + return(-1); } } - else - { - post("nor reconize %s",atom_getsymbolarg(j,argc,argv)); - j+=1; - } } + return(1); } //---------------------------------------------------------------------- -void pmpd3d_testMass(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) +void pmpd3d_testLink(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { - t_int i; + t_int i, tmp; t_atom std_out[2]; SETSYMBOL(&(std_out[0]),atom_getsymbolarg(0,argc,argv)); - for (i=0; i < x->nb_mass; i++) + for (i=0; i < x->nb_link; i++) { - if (test_3d_mass(i,x,argc,argv)) + tmp=test_3d_link(i,x,argc,argv); + if (tmp == -1) + { + break; + } + else if (tmp) { SETFLOAT(&(std_out[1]),i); - outlet_anything(x->main_outlet, gensym("testMass"),2,std_out); + outlet_anything(x->main_outlet, gensym("testLink"),2,std_out); } } } -void pmpd3d_testLink(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) +void pmpd3d_testMass(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { - t_int i; + t_int i, tmp; t_atom std_out[2]; SETSYMBOL(&(std_out[0]),atom_getsymbolarg(0,argc,argv)); - for (i=0; i < x->nb_link; i++) + for (i=0; i < x->nb_mass; i++) { - if (test_3d_link(i,x,argc,argv)) + tmp=test_3d_mass(i,x,argc,argv); + if (tmp == -1) + { + break; + } + else if (tmp) { SETFLOAT(&(std_out[1]),i); - outlet_anything(x->main_outlet, gensym("testLink"),1,std_out); + outlet_anything(x->main_outlet, gensym("testMass"),2,std_out); } } } void pmpd3d_testLinkT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { - int i, vecsize; + int i, vecsize, tmp; t_garray *a; t_word *vec; @@ -385,7 +364,12 @@ void pmpd3d_testLinkT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) for (i=0; i < taille_max; i++) { - vec[i].w_float = (t_float)test_3d_link(i,x,argc,argv); + tmp = test_3d_link(i,x,argc,argv); + if (tmp == -1) + { + break; + } + vec[i].w_float = (t_float)tmp; } garray_redraw(a); } @@ -394,7 +378,7 @@ void pmpd3d_testLinkT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) void pmpd3d_testMassT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { - int i, vecsize; + int i, vecsize, tmp; t_garray *a; t_word *vec; @@ -412,7 +396,12 @@ void pmpd3d_testMassT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) for (i=0; i < taille_max; i++) { - vec[i].w_float = (t_float)test_3d_mass(i,x,argc,argv); + tmp = test_3d_mass(i,x,argc,argv); + if (tmp == -1) + { + break; + } + vec[i].w_float = (t_float)tmp; } garray_redraw(a); } @@ -421,26 +410,38 @@ void pmpd3d_testMassT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) void pmpd3d_testLinkL(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { - int i; + int i, tmp; t_atom list[x->nb_link+1]; - for (i=0; i < x->nb_link; i++) + for (i=0; i < x->nb_link;) { - SETFLOAT(&(list[i+1]), test_3d_link(i,x,argc,argv)); + tmp=test_3d_link(i,x,argc,argv); + if (tmp == -1) + { + break; + } + SETFLOAT(&(list[i+1]), (t_float)tmp); + i++; } SETSYMBOL(&(list[0]),atom_getsymbolarg(0,argc,argv)); - outlet_anything(x->main_outlet, gensym("testLink"),x->nb_link+1 , list); + outlet_anything(x->main_outlet, gensym("testLink"),i+1 , list); } void pmpd3d_testMassL(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) { - int i; + int i, tmp; t_atom list[x->nb_mass+1]; - for (i=0; i < x->nb_mass; i++) - { - SETFLOAT(&(list[i+1]), test_3d_link(i,x,argc,argv)); + for (i=0; i < x->nb_mass;) + { + tmp=test_3d_mass(i,x,argc,argv); + if (tmp == -1) + { + break; + } + SETFLOAT(&(list[i+1]), (t_float)tmp); + i++; } SETSYMBOL(&(list[0]),atom_getsymbolarg(0,argc,argv)); - outlet_anything(x->main_outlet, gensym("testMass"),x->nb_mass+1 , list); + outlet_anything(x->main_outlet, gensym("testMass"),i+1 , list); } diff --git a/pmpd3d_various.c b/pmpd3d_various.c index b8a8bee..5b1915c 100644 --- a/pmpd3d_various.c +++ b/pmpd3d_various.c @@ -359,11 +359,11 @@ void pmpd3d_massesDistances_f_f(t_pmpd3d *x, t_int i, t_int j) t_atom to_out[3]; tmp = x->mass[i].posX - x->mass[j].posX; - dist = tmp*tmp; + dist = sqr(tmp); tmp = x->mass[i].posY - x->mass[j].posY; - dist += tmp*tmp; + dist += sqr(tmp); tmp = x->mass[i].posZ - x->mass[j].posZ; - dist += tmp*tmp; + dist += sqr(tmp); dist = sqrt(dist); SETFLOAT(&(to_out[0]), i); @@ -416,6 +416,36 @@ void pmpd3d_massesDistances(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) } } } + else if (argc == 0) + { + for (i=0; i < x->nb_mass; i++) + { + for (j=i+1; j < x->nb_mass; j++) + { + pmpd3d_massesDistances_f_f(x,i, j); + } + } + } + else if ((argc == 1) && (argv[0].a_type == A_SYMBOL) ) + { + for (i=0; i < x->nb_mass; i++) + { + if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id) + { + for (j=i+1; j < x->nb_mass; j++) + { + pmpd3d_massesDistances_f_f(x,i, j); + } + } + } + } + else if ( (argc == 1) && (argv[0].a_type == A_FLOAT) ) + { + for (i=0; i < x->nb_mass; i++) + { + pmpd3d_massesDistances_f_f(x, atom_getfloatarg(0, argc, argv), i); + } + } } void pmpd3d_forcesXT(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv) -- cgit v1.2.1