Vuo  2.3.2
VuoPointsParametric.cc
Go to the documentation of this file.
1 
10 #include "VuoPointsParametric.h"
12 #include <muParser/muParser.h>
13 
14 #include "module.h"
15 
16 extern "C"
17 {
18 #ifdef VUO_COMPILER
20  "title" : "VuoPointsParametric",
21  "dependencies" : [
22  "VuoInteger",
23  "VuoPoint3d",
24  "VuoReal",
25  "VuoText",
26  "VuoList_VuoPoint3d",
27  "VuoMathExpressionParser",
28  "muparser"
29  ]
30  });
31 #endif
32 }
33 
38  VuoReal time,
39  VuoText xExp,
40  VuoText yExp,
41  VuoText zExp,
42  VuoInteger subdivisions,
43  VuoReal uMin,
44  VuoReal uMax)
45 {
46  if (subdivisions <= 0 || !xExp || !yExp || !zExp)
47  return VuoListCreate_VuoPoint3d();
48 
49  mu::Parser xParser, yParser, zParser;
50 
51  xParser.SetExpr(xExp);
52  yParser.SetExpr(yExp);
53  zParser.SetExpr(zExp);
54 
55  mu::value_type uVar = 0;
56 
57  xParser.DefineVar("u", &uVar); xParser.DefineVar("U", &uVar);
58  yParser.DefineVar("u", &uVar); yParser.DefineVar("U", &uVar);
59  zParser.DefineVar("u", &uVar); zParser.DefineVar("U", &uVar);
60 
61  mu::value_type iVar = 0;
62 
63  xParser.DefineVar("i", &iVar); xParser.DefineVar("I", &iVar);
64  yParser.DefineVar("i", &iVar); yParser.DefineVar("I", &iVar);
65  zParser.DefineVar("i", &iVar); zParser.DefineVar("I", &iVar);
66 
67  xParser.DefineConst("time", (double)time); xParser.DefineConst("Time", (double)time); xParser.DefineConst("TIME", (double)time);
68  yParser.DefineConst("time", (double)time); yParser.DefineConst("Time", (double)time); yParser.DefineConst("TIME", (double)time);
69  zParser.DefineConst("time", (double)time); zParser.DefineConst("Time", (double)time); zParser.DefineConst("TIME", (double)time);
70 
74 
75  VuoList_VuoPoint3d points = VuoListCreateWithCount_VuoPoint3d(subdivisions, (VuoPoint3d){0,0,0});
76  VuoPoint3d *pointsArray = VuoListGetData_VuoPoint3d(points);
77 
78  try
79  {
80  for(int x = 0; x < subdivisions; x++)
81  {
82  if (subdivisions > 1)
83  uVar = VuoReal_lerp(uMin, uMax, x/(float)(subdivisions-1.));
84  else
85  uVar = (uMin + uMax)/2.;
86 
87  iVar = x + 1;
88 
89  pointsArray[x] = (VuoPoint3d){
90  (float)xParser.Eval(),
91  (float)yParser.Eval(),
92  (float)zParser.Eval()};
93  }
94  }
95  catch (mu::Parser::exception_type &e)
96  {
97  VUserLog("Error: %s", e.GetMsg().c_str());
98  }
99  return points;
100 }
101 
106  VuoReal time,
107  VuoText xExp,
108  VuoText yExp,
109  VuoText zExp,
110  VuoInteger rows,
111  VuoInteger columns,
112  VuoReal uMin,
113  VuoReal uMax,
114  VuoReal vMin,
115  VuoReal vMax)
116 {
117  if (rows <= 0 || columns <= 0 || !xExp || !yExp || !zExp)
118  return VuoListCreate_VuoPoint3d();
119 
120  mu::Parser xParser, yParser, zParser;
121 
122  xParser.SetExpr(xExp);
123  yParser.SetExpr(yExp);
124  zParser.SetExpr(zExp);
125 
126  mu::value_type uVar = 0;
127  mu::value_type vVar = 0;
128 
129  xParser.DefineVar("u", &uVar); xParser.DefineVar("U", &uVar);
130  yParser.DefineVar("u", &uVar); yParser.DefineVar("U", &uVar);
131  zParser.DefineVar("u", &uVar); zParser.DefineVar("U", &uVar);
132  xParser.DefineVar("v", &vVar); xParser.DefineVar("V", &vVar);
133  yParser.DefineVar("v", &vVar); yParser.DefineVar("V", &vVar);
134  zParser.DefineVar("v", &vVar); zParser.DefineVar("V", &vVar);
135 
136  mu::value_type iVar = 0;
137  mu::value_type jVar = 0;
138 
139  xParser.DefineVar("i", &iVar); xParser.DefineVar("I", &iVar);
140  yParser.DefineVar("i", &iVar); yParser.DefineVar("I", &iVar);
141  zParser.DefineVar("i", &iVar); zParser.DefineVar("I", &iVar);
142  xParser.DefineVar("j", &jVar); xParser.DefineVar("J", &jVar);
143  yParser.DefineVar("j", &jVar); yParser.DefineVar("J", &jVar);
144  zParser.DefineVar("j", &jVar); zParser.DefineVar("J", &jVar);
145 
146  xParser.DefineConst("time", (double)time); xParser.DefineConst("Time", (double)time); xParser.DefineConst("TIME", (double)time);
147  yParser.DefineConst("time", (double)time); yParser.DefineConst("Time", (double)time); yParser.DefineConst("TIME", (double)time);
148  zParser.DefineConst("time", (double)time); zParser.DefineConst("Time", (double)time); zParser.DefineConst("TIME", (double)time);
149 
153 
154  VuoList_VuoPoint3d points = VuoListCreateWithCount_VuoPoint3d(rows*columns, (VuoPoint3d){0,0,0});
155  VuoPoint3d *pointsArray = VuoListGetData_VuoPoint3d(points);
156 
157  try
158  {
159  for(int y = 0; y < rows; y++)
160  {
161  if (rows > 1)
162  vVar = VuoReal_lerp(vMin, vMax, y/(float)(rows-1));
163  else
164  vVar = (vMin + vMax)/2.;
165 
166  for(int x = 0; x < columns; x++)
167  {
168  if (columns > 1)
169  uVar = VuoReal_lerp(uMin, uMax, x/(float)(columns-1.));
170  else
171  uVar = (uMin + uMax)/2.;
172 
173  iVar = x + 1;
174  jVar = y + 1;
175 
176  pointsArray[y*columns + x] = (VuoPoint3d){
177  (float)xParser.Eval(),
178  (float)yParser.Eval(),
179  (float)zParser.Eval()};
180  }
181  }
182  }
183  catch (mu::Parser::exception_type &e)
184  {
185  VUserLog("Error: %s", e.GetMsg().c_str());
186  }
187  return points;
188 }