Home | History | Annotate | Download | only in math
      1 /*
      2  * This module provides a data structure, initialization, and fit
      3  * routine for algorithms that use the Kasa method for determining the
      4  * 3-dimensional offset vector from a set of points on a sphere.
      5  *
      6  * Reference: I. Ksa, "A circle fitting procedure and its error analysis," in
      7  * IEEE Transactions on Instrumentation and Measurement, vol. IM-25, no. 1, pp.
      8  * 8-14, March 1976.
      9  */
     10 
     11 #ifndef LOCATION_LBS_CONTEXTHUB_NANOAPPS_COMMON_MATH_KASA_H_
     12 #define LOCATION_LBS_CONTEXTHUB_NANOAPPS_COMMON_MATH_KASA_H_
     13 
     14 #include <stdbool.h>
     15 
     16 #include "common/math/vec.h"
     17 
     18 #ifdef __cplusplus
     19 extern "C" {
     20 #endif
     21 
     22 struct KasaFit {
     23   float acc_x, acc_y, acc_z, acc_w;
     24   float acc_xx, acc_xy, acc_xz, acc_xw;
     25   float acc_yy, acc_yz, acc_yw, acc_zz, acc_zw;
     26   size_t nsamples;
     27 };
     28 
     29 // Resets the KasaFit data structure (sets all variables to zero).
     30 void kasaReset(struct KasaFit *kasa);
     31 
     32 // Initializes the KasaFit data structure.
     33 void kasaInit(struct KasaFit *kasa);
     34 
     35 // Accumulates the Kasa acc_** variables with the input vector [x, y, z], and
     36 // updates the number of samples.
     37 void kasaAccumulate(struct KasaFit *kasa, float x, float y, float z);
     38 
     39 // Normalizes the Kasa acc_** variables. Returns 'false' if the number of
     40 // samples is zero, otherwise 'true'.
     41 bool kasaNormalize(struct KasaFit *kasa);
     42 
     43 // Uses the Kasa sphere-fit method to extract a 'bias' estimate (centroid) for
     44 // the best-fit sphere using the normal equations, and the sphere's 'radius'.
     45 // Returns '1' if the radius of the fit sphere is within the bounds
     46 // (min_fit, max_fit), otherwise '0'.
     47 int kasaFit(struct KasaFit *kasa, struct Vec3 *bias, float *radius,
     48             float max_fit, float min_fit);
     49 
     50 #ifdef __cplusplus
     51 }
     52 #endif
     53 
     54 #endif  // LOCATION_LBS_CONTEXTHUB_NANOAPPS_COMMON_MATH_KASA_H_
     55