aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Henry <nusmuk@users.sourceforge.net>2013-02-16 14:10:59 +0000
committerCyrille Henry <nusmuk@users.sourceforge.net>2013-02-16 14:10:59 +0000
commitd6aeb7ce5870ac9a95e20a39660664a3f4e9d4be (patch)
tree22770c04d350b623c2ea56b9d9b0ce639294c5cd
parentedf303ef16f2a2b5de904821794d866465057e26 (diff)
bugfix
svn path=/trunk/externals/pmpd/; revision=17036
-rw-r--r--pmpd3d.c4
-rw-r--r--pmpd3d_get.c2
-rw-r--r--pmpd3d_stat.c323
-rw-r--r--pmpd3d_test.c635
-rw-r--r--pmpd3d_various.c36
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) && (i<x->nb_mass) )
+ if ( (i>=0) && (i<x->nb_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)