aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Henry <nusmuk@users.sourceforge.net>2011-02-20 14:25:05 +0000
committerCyrille Henry <nusmuk@users.sourceforge.net>2011-02-20 14:25:05 +0000
commitbd44c30d91f8f13cba813b96fb5122c3f4118ecb (patch)
treea4484cddfa152d38c5a7eddceb9f1d0c6edd85b9
parentc10b148c202a50ea546997fec0e9b1432774d4e0 (diff)
specific optimisation
svn path=/trunk/externals/pmpd/; revision=14931
-rw-r--r--pmpd.c15
-rw-r--r--pmpd2d.c35
-rw-r--r--pmpd3d.c32
3 files changed, 52 insertions, 30 deletions
diff --git a/pmpd.c b/pmpd.c
index 47a366d..14232b6 100644
--- a/pmpd.c
+++ b/pmpd.c
@@ -149,7 +149,7 @@ void pmpd_bang(t_pmpd *x)
t_int i;
// post("bang");
- for (i=1; i<x->nb_mass; i++)
+ for (i=0; i<x->nb_mass; i++)
// compute new masses position
if (x->mass[i].mobile > 0) // only if mobile
{
@@ -286,7 +286,8 @@ void pmpd_link(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
{
if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
{
- pmpd_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
+ if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) )) // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
+ pmpd_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
}
}
}
@@ -346,9 +347,12 @@ void pmpd_tabLink(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
{
if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
{
- pmpd_create_link(x, Id, i, j, K, D, 1, -1000000, 1000000, 2);
- x->link[x->nb_link-1].arrayK = arrayK;
- x->link[x->nb_link-1].arrayD = arrayD;
+ if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) )) // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
+ {
+ pmpd_create_link(x, Id, i, j, K, D, 1, -1000000, 1000000, 2);
+ x->link[x->nb_link-1].arrayK = arrayK;
+ x->link[x->nb_link-1].arrayD = arrayD;
+ }
}
}
}
@@ -1202,6 +1206,7 @@ void pmpd_setup(void)
class_addbang(pmpd_class, pmpd_bang);
class_addmethod(pmpd_class, (t_method)pmpd_reset, gensym("reset"), 0);
class_addmethod(pmpd_class, (t_method)pmpd_infosL, gensym("infosL"), 0);
+ class_addmethod(pmpd_class, (t_method)pmpd_infosL, gensym("infos"), 0);
class_addmethod(pmpd_class, (t_method)pmpd_mass, gensym("mass"), A_DEFSYMBOL, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
class_addmethod(pmpd_class, (t_method)pmpd_link, gensym("link"), A_GIMME, 0);
class_addmethod(pmpd_class, (t_method)pmpd_link, gensym("tabLink"), A_GIMME, 0);
diff --git a/pmpd2d.c b/pmpd2d.c
index f10d410..b56ba9c 100644
--- a/pmpd2d.c
+++ b/pmpd2d.c
@@ -158,7 +158,7 @@ void pmpd2d_bang(t_pmpd2d *x)
t_int i;
// post("bang");
- for (i=1; i<x->nb_mass; i++)
+ for (i=0; i<x->nb_mass; i++)
// compute new masses position
if (x->mass[i].mobile > 0) // only if mobile
{
@@ -210,9 +210,9 @@ void pmpd2d_bang(t_pmpd2d *x)
if (x->link[i].lType == 1)
{ // on projette selon 1 axe
- F = Fx*x->link[i].VX + Fy*x->link[i].VY; // produit scalaire de la force sur le vecteur qui la porte
- Fx = F*x->link[i].VX; // V est unitaire, dc on projete sans pb
- Fy = F*x->link[i].VY;
+ // F = Fx*x->link[i].VX + Fy*x->link[i].VY; // produit scalaire de la force sur le vecteur qui la porte
+ Fx = Fx*x->link[i].VX; // V est unitaire, dc on projete sans pb
+ Fy = Fy*x->link[i].VY;
}
x->link[i].mass1->forceX -= Fx;
@@ -318,7 +318,8 @@ void pmpd2d_link(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv)
{
if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
{
- pmpd2d_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
+ if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) )) // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
+ pmpd2d_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
}
}
}
@@ -360,8 +361,8 @@ void pmpd2d_tLink(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv)
{
if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
{
- pmpd2d_create_link(x, Id, i, mass2, K, D, Pow, Lmin, Lmax, 0);
- x->link[x->nb_link-1].VX = vecteurX;
+ pmpd2d_create_link(x, Id, i, mass2, K, D, Pow, Lmin, Lmax, 0);
+ x->link[x->nb_link-1].VX = vecteurX;
x->link[x->nb_link-1].VY = vecteurY;
}
}
@@ -388,9 +389,13 @@ void pmpd2d_tLink(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv)
{
if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
{
- pmpd2d_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
- x->link[x->nb_link-1].VX = vecteurX;
- x->link[x->nb_link-1].VY = vecteurY;
+ if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) )) // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
+ {
+ pmpd2d_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
+ x->link[x->nb_link-1].VX = vecteurX;
+ x->link[x->nb_link-1].VY = vecteurY;
+ }
+
}
}
}
@@ -450,9 +455,12 @@ void pmpd2d_tabLink(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv)
{
if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
{
- pmpd2d_create_link(x, Id, i, j, K, D, 1, 0, 1000000, 2);
- x->link[x->nb_link-1].arrayK = arrayK;
- x->link[x->nb_link-1].arrayD = arrayD;
+ if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) )) // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
+ {
+ pmpd2d_create_link(x, Id, i, j, K, D, 1, 0, 1000000, 2);
+ x->link[x->nb_link-1].arrayK = arrayK;
+ x->link[x->nb_link-1].arrayD = arrayD;
+ }
}
}
}
@@ -1837,6 +1845,7 @@ void pmpd2d_setup(void)
class_addbang(pmpd2d_class, pmpd2d_bang);
class_addmethod(pmpd2d_class, (t_method)pmpd2d_reset, gensym("reset"), 0);
class_addmethod(pmpd2d_class, (t_method)pmpd2d_infosL, gensym("infosL"), 0);
+ class_addmethod(pmpd2d_class, (t_method)pmpd2d_infosL, gensym("infos"), 0);
class_addmethod(pmpd2d_class, (t_method)pmpd2d_mass, gensym("mass"), A_DEFSYMBOL, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
class_addmethod(pmpd2d_class, (t_method)pmpd2d_link, gensym("link"), A_GIMME, 0);
class_addmethod(pmpd2d_class, (t_method)pmpd2d_tabLink, gensym("tabLink"), A_GIMME, 0);
diff --git a/pmpd3d.c b/pmpd3d.c
index b4533b4..45f1a9a 100644
--- a/pmpd3d.c
+++ b/pmpd3d.c
@@ -164,7 +164,7 @@ void pmpd3d_bang(t_pmpd3d *x)
t_int i;
// post("bang");
- for (i=1; i<x->nb_mass; i++)
+ for (i=0; i<x->nb_mass; i++)
// compute new masses position
if (x->mass[i].mobile > 0) // only if mobile
{
@@ -225,10 +225,10 @@ void pmpd3d_bang(t_pmpd3d *x)
if (x->link[i].lType == 1)
{ // on projette selon 1 axe
- F = Fx*x->link[i].VX + Fy*x->link[i].VY + Fz*x->link[i].VZ; // produit scalaire de la force sur le vecteur qui la porte
- Fx = F*x->link[i].VX; // V est unitaire, dc on projete sans pb
- Fy = F*x->link[i].VY;
- Fz = F*x->link[i].VZ;
+ // F = Fx*x->link[i].VX + Fy*x->link[i].VY + Fz*x->link[i].VZ; // produit scalaire de la force sur le vecteur qui la porte
+ Fx = Fx*x->link[i].VX; // V est unitaire, dc on projete sans pb
+ Fy = Fy*x->link[i].VY;
+ Fz = Fz*x->link[i].VZ;
}
x->link[i].mass1->forceX -= Fx;
@@ -342,7 +342,8 @@ void pmpd3d_link(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv)
{
if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
{
- pmpd3d_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
+ if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) )) // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
+ pmpd3d_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
}
}
}
@@ -412,9 +413,12 @@ void pmpd3d_tLink(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv)
{
if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
{
- pmpd3d_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
- x->link[x->nb_link-1].VX = vecteurX;
- x->link[x->nb_link-1].VY = vecteurY;
+ if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) )) // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
+ {
+ pmpd3d_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
+ x->link[x->nb_link-1].VX = vecteurX;
+ x->link[x->nb_link-1].VY = vecteurY;
+ }
}
}
}
@@ -474,9 +478,12 @@ void pmpd3d_tabLink(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv)
{
if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
{
- pmpd3d_create_link(x, Id, i, j, K, D, 1, 0, 1000000, 2);
- x->link[x->nb_link-1].arrayK = arrayK;
- x->link[x->nb_link-1].arrayD = arrayD;
+ if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) )) // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
+ {
+ pmpd3d_create_link(x, Id, i, j, K, D, 1, 0, 1000000, 2);
+ x->link[x->nb_link-1].arrayK = arrayK;
+ x->link[x->nb_link-1].arrayD = arrayD;
+ }
}
}
}
@@ -2155,6 +2162,7 @@ void pmpd3d_setup(void)
class_addbang(pmpd3d_class, pmpd3d_bang);
class_addmethod(pmpd3d_class, (t_method)pmpd3d_reset, gensym("reset"), 0);
class_addmethod(pmpd3d_class, (t_method)pmpd3d_infosL, gensym("infosL"), 0);
+ class_addmethod(pmpd3d_class, (t_method)pmpd3d_infosL, gensym("infos"), 0);
// class_addmethod(pmpd3d_class, (t_method)pmpd3d_mass, gensym("mass"), A_DEFSYMBOL, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
class_addmethod(pmpd3d_class, (t_method)pmpd3d_mass, gensym("mass"), A_GIMME, 0);
class_addmethod(pmpd3d_class, (t_method)pmpd3d_link, gensym("link"), A_GIMME, 0);