AA_API void aa_rx_ksol_opts_center_configs( struct aa_rx_ksol_opts *opts, const struct aa_rx_sg_sub *ssg, double gain ) { size_t n_qs = aa_rx_sg_sub_config_count(ssg); double *q_ref = AA_NEW_AR(double, n_qs); double *q_gain = AA_NEW_AR(double, n_qs); aa_rx_sg_sub_center_configs( ssg, n_qs, q_ref ); for( size_t i = 0; i < n_qs; i ++ ) { double min=0 ,max=0; aa_rx_config_id config_id = aa_rx_sg_sub_config(ssg, i); int r = aa_rx_sg_get_limit_pos( ssg->scenegraph, config_id, &min, &max ); if( 0 == r ) { q_gain[i] = gain * (2*M_PI) / (max - min); // scale gain based on range } else { q_gain[i] = 0; } } aa_rx_ksol_opts_take_config( opts, n_qs, q_ref, AA_MEM_STEAL ); aa_rx_ksol_opts_take_gain_config( opts, n_qs, q_gain, AA_MEM_STEAL ); }
AA_API void aa_rx_sg_sub_center_configs( const struct aa_rx_sg_sub *ssg, size_t n, double *q ) { size_t n_qs = aa_rx_sg_sub_config_count(ssg); size_t n_min = AA_MIN(n,n_qs); for( size_t i = 0; i < n_min; i ++ ) { double min=0 ,max=0; aa_rx_config_id config_id = aa_rx_sg_sub_config(ssg, i); int r = aa_rx_sg_get_limit_pos( ssg->scenegraph, config_id, &min, &max ); if( 0 == r ) { q[i] = (max + min) / 2; } else { q[i] = 0; } } }