Implementation of Composite Simpson's 1/3 Rule to calculate arc length
| 159 | |
| 160 | // Implementation of Composite Simpson's 1/3 Rule to calculate arc length |
| 161 | F32 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 | } |
no test coverage detected