aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Henry <nusmuk@users.sourceforge.net>2014-10-17 18:28:24 +0000
committerCyrille Henry <nusmuk@users.sourceforge.net>2014-10-17 18:28:24 +0000
commit4a552bceea2c14575a280f596179f521cf6c2916 (patch)
tree82c63108fd05fed098dfbfff1b8c934c05821e87
parent1f057bfff28e1a4b0722f2cb6c7d865a01ad28c2 (diff)
new message to get force for each link
svn path=/trunk/externals/pmpd/; revision=17364
-rw-r--r--pmpd2d.c1
-rw-r--r--pmpd2d_tab.c58
2 files changed, 59 insertions, 0 deletions
diff --git a/pmpd2d.c b/pmpd2d.c
index f2b57a2..276acc5 100644
--- a/pmpd2d.c
+++ b/pmpd2d.c
@@ -236,6 +236,7 @@ void pmpd2d_setup(void)
class_addmethod(pmpd2d_class, (t_method)pmpd2d_linkEndYT, gensym("linkEndYT"), A_GIMME, 0);
class_addmethod(pmpd2d_class, (t_method)pmpd2d_linkEnd1YT, gensym("linkEnd1YT"), A_GIMME, 0);
class_addmethod(pmpd2d_class, (t_method)pmpd2d_linkEnd2YT, gensym("linkEnd2YT"), A_GIMME, 0);
+ class_addmethod(pmpd2d_class, (t_method)pmpd2d_linkEndNormeForce, gensym("linkEndForceNorm"), A_GIMME, 0);
/*
pmpd2d_test
diff --git a/pmpd2d_tab.c b/pmpd2d_tab.c
index 8eeb83f..432a7e1 100644
--- a/pmpd2d_tab.c
+++ b/pmpd2d_tab.c
@@ -1914,3 +1914,61 @@ void pmpd2d_linkEnd2YT(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv)
}
}
+// ---------------------------------------------------------------------
+
+void pmpd2d_linkEndNormeForce(t_pmpd2d *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+ t_float tmp;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_link;
+ taille_max = min(taille_max, vecsize/2 );
+ for (i=0; i < taille_max ; i++)
+ {
+ tmp = sqrt(sqr(x->link[i].forceX) + sqr(x->link[i].forceY));
+ vec[2*i ].w_float = -tmp;
+ vec[2*i+1].w_float = tmp;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize-1) && (j < x->nb_link))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
+ {
+ tmp = sqrt(sqr(x->link[j].forceX) + sqr(x->link[j].forceY));
+ vec[i].w_float = -tmp;
+ i++;
+ vec[i].w_float = tmp;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+