MCPcopy Create free account
hub / github.com/bfbbdecomp/bfbb / ArcLength3

Function ArcLength3

src/SB/Core/x/xSpline.cpp:161–218  ·  view source on GitHub ↗

Implementation of Composite Simpson's 1/3 Rule to calculate arc length

Source from the content-addressed store, hash-verified

159
160// Implementation of Composite Simpson's 1/3 Rule to calculate arc length
161F32 ArcLength3(xCoef3* coef, F64 ustart, F64 uend)
162{
163 U32 i;
164 F64 u;
165 F64 h;
166 F64 sum;
167
168 F64 A;
169 F64 B;
170 F64 C;
171 F64 D;
172 F64 E;
173
174 F64 u_eval;
175 F64 temp_y1;
176 F64 temp_z1;
177
178 A = (coef->x).a[0];
179 C = (coef->y).a[0];
180 h = (coef->z).a[0];
181
182 B = (coef->x).a[1];
183 temp_y1 = (coef->y).a[1];
184 temp_z1 = (coef->z).a[1];
185
186 sum = (coef->x).a[2];
187 u = (coef->y).a[2];
188 u_eval = (coef->z).a[2];
189
190 E = (h * h + A * A + C * C) * 9.0;
191 D = (h * temp_z1 + A * B + C * temp_y1) * 12.0;
192
193 C = (temp_z1 * temp_z1 + B * B + temp_y1 * temp_y1) * 4.0 +
194 (h * u_eval + A * sum + C * u) * 6.0;
195 A = u_eval * u_eval + sum * sum + u * u;
196 h = (uend - ustart) / 50.0;
197 B = (temp_z1 * u_eval + B * sum + temp_y1 * u) * 4.0;
198 u = ustart + h;
199 sum = 0.0;
200
201 for (i = 2; i <= 51; i += 1)
202 {
203 if ((i & 1) == 0)
204 {
205 u_eval = xsqrt(A + u * (B + u * (C + u * (D + E * u)))) * 4.0;
206 }
207 else
208 {
209 u_eval = xsqrt(A + u * (B + u * (C + u * (D + E * u)))) * 2.0;
210 }
211 sum = sum + u_eval;
212 u = u + h;
213 }
214
215 return (h * (sum + xsqrt(A + ustart * (B + ustart * (C + ustart * (D + E * ustart)))) +
216 xsqrt(A + uend * (B + uend * (C + uend * (D + E * uend)))))) /
217 3.0;
218}

Callers 2

ArcEvalIterateFunction · 0.70
xSpline3_ArcInitFunction · 0.70

Calls 1

xsqrtFunction · 0.85

Tested by

no test coverage detected