Example #1
0
        //return key when Jump (highest point)
        public static List <int_double> calJump(List <UKI_DataMovement> list_movement)
        {
            List <int_double> list_key    = new List <int_double>();
            Boolean           duringJump  = false;
            UKI_DataMovement  highest_key = new UKI_DataMovement();

            foreach (UKI_DataMovement u in list_movement)
            {
                if (u.spine_Y > jump_threshold)
                {
                    if (u.spine_Y > highest_key.spine_Y)
                    {
                        highest_key = u;
                    }
                    duringJump = true;
                    if (highest_key.type_algo != 0)
                    {
                        highest_key.type_algo = 0.33;
                    }
                }
                else if (duringJump)
                {
                    highest_key.type_algo = 0.66;
                    int[] key = new int[] {};
                    list_key.Add(new int_double()
                    {
                        i = highest_key.id, v = highest_key.spine_Y
                    });
                    duringJump  = false;
                    highest_key = new UKI_DataMovement();
                }
            }
            return(list_key);
        }
Example #2
0
        public void collectData_Movement()
        {
            UKI_DataMovement new_data = new UKI_DataMovement();

            new_data.id          = current_id;
            new_data.time        = current_time;
            new_data.spine_Y     = diff_sp_Y;
            new_data.ms_all_avg  = tool_posExtract.ms_all_avg;
            new_data.ms_hand_avg = tool_posExtract.ms_hand_avg;
            new_data.ms_leg_avg  = tool_posExtract.ms_leg_avg;
            new_data.ms_core_avg = tool_posExtract.ms_core_avg;
            new_data.ms_all      = tool_posExtract.ms_all;
            new_data.ms_hand     = tool_posExtract.ms_hand;
            new_data.ms_leg      = tool_posExtract.ms_leg;
            new_data.ms_core     = tool_posExtract.ms_core;
            data_movement.Add(new_data);
        }
Example #3
0
        public static List <int[]> calMinMaxMin(List <UKI_DataMovement> list_movement)
        {
            List <int[]> list_MMM = new List <int[]>();

            int[] MMM = new int[] { -1, -1, -1 };
            if (list_movement.Count > 0)
            {
                try
                {
                    //-- check Min Max value ----------------------------
                    double d     = 0; //current
                    double d_min = 0; //must be > 0 after process
                    double d_max = 0;
                    foreach (UKI_DataMovement u in list_movement)
                    {
                        d = u.ms_all_avg;
                        if (d > 0)
                        {
                            if (d_min == 0)
                            {
                                d_min = d;
                            }
                            else if (d < d_min)
                            {
                                d_min = d;
                            }
                            if (d > d_max)
                            {
                                d_max = d;
                            }
                        }
                    }
                    double d_range      = d_max - d_min;
                    double d_minmove    = Math.Abs(d_range * threshold_minmove);
                    double d_lowerBound = d_min + d_minmove; //at Percentile 20 from Global Min
                    double predictMin   = d_lowerBound;      //highest point that next minimum can be accepted
                    double predictMax   = d_lowerBound;      //lowest point that next maximum can be accepted
                    //-- fin Min Max location -------------- -------------
                    Boolean goUp_current  = true;            //current direction
                    Boolean goUp_last     = true;            //last scaned direction
                    double  value_last    = 0;               //last scaned unit
                    double  value_current = 0;               //current scaned unit
                    double  value_change  = 0;
                    //-----------------
                    UKI_DataMovement recentAccepted = list_movement.First(); //last accepted Minima / Maxima
                    UKI_DataMovement lastItem       = list_movement.First(); //last accepted Minima / Maxima
                    recentAccepted.type_algo = -1;
                    MMM[0] = recentAccepted.id;
                    //Start higher than threshold, use 0 as Min1
                    foreach (UKI_DataMovement u in list_movement.Skip(1))
                    {
                        u.type_algo   = 0;
                        value_current = u.ms_all_avg;
                        value_change  = value_current - value_last;
                        //---------------------------------
                        if (value_change >= 0)
                        {
                            goUp_current = true;
                        }
                        else
                        {
                            goUp_current = false;
                        }
                        //
                        if (predictMin == 0 || value_current < predictMin)
                        {
                            predictMax = Math.Max(Math.Min(value_current + d_minmove, predictMax), d_lowerBound);
                            predictMin = Math.Max(value_current, d_lowerBound);
                        }
                        if (value_current > predictMax)
                        {
                            predictMax = value_current;
                            predictMin = Math.Max(value_current - d_minmove, d_lowerBound);
                        }
                        //---------------------------------
                        //Min0 by Bound-Pass or LastAccept-Pass
                        if ((boundPass && value_last < d_lowerBound && value_current >= d_lowerBound)
                            ||
                            (!boundPass && value_last < recentAccepted.ms_all_avg && value_current >= recentAccepted.ms_all_avg))
                        {
                            if (list_MMM.Count == 0 || (list_MMM.Last()[2] != MMM[0]))
                            {
                                recentAccepted.type_algo = 0;
                            }
                            recentAccepted           = u;
                            recentAccepted.type_algo = -1;
                            MMM[0] = recentAccepted.id;
                        }
                        //Min2 by Bound
                        else if (value_last >= d_lowerBound && value_current < d_lowerBound)
                        {
                            if (MMM[1] >= 0 && MMM[2] < 0)
                            {
                                //found Min2 & Complete
                                recentAccepted           = u;
                                recentAccepted.type_algo = -1;
                                MMM[2] = recentAccepted.id; list_MMM.Add(MMM);
                                //
                                MMM    = new int[] { -1, -1, -1 };
                                MMM[0] = recentAccepted.id;//First of new set
                            }
                            else if (MMM[1] < 0 && list_MMM.Count > 0 && list_MMM.Last()[2] > d_lowerBound)
                            {
                                //adjust last End
                                recentAccepted.type_algo = 0;
                                recentAccepted           = u;
                                recentAccepted.type_algo = -1;
                            }
                        }
                        else if (goUp_current != goUp_last) //found change in Direction
                        {
                            //During finding Min2
                            if (MMM[1] >= 0 && MMM[2] < 0)
                            {
                                if (s_locate && goUp_current && value_last <= predictMin)
                                {
                                    //found Min2 & Complete
                                    if (MMM[2] >= 0)
                                    {
                                        recentAccepted.type_algo = 0;
                                    }
                                    recentAccepted     = lastItem;
                                    lastItem.type_algo = -1;
                                    MMM[2]             = recentAccepted.id; list_MMM.Add(MMM);
                                    //
                                    MMM    = new int[] { -1, -1, -1 };
                                    MMM[0] = recentAccepted.id;//First of new set
                                }
                                else if (!goUp_current && value_last > recentAccepted.ms_all_avg)
                                {
                                    //found higher Max1
                                    if (MMM[1] >= 0)
                                    {
                                        recentAccepted.type_algo = 0;
                                    }
                                    recentAccepted           = lastItem;
                                    recentAccepted.type_algo = 1;
                                    MMM[1] = recentAccepted.id;// -1 because we collect last data before change
                                    //
                                    predictMin = Math.Max(value_last - d_minmove, d_lowerBound);
                                }
                            }
                            //During finding Max1
                            else if (MMM[0] >= 0 && MMM[1] < 0)
                            {
                                if (!goUp_current && value_last >= predictMax)
                                {
                                    //found Max
                                    if (MMM[1] >= 0)
                                    {
                                        recentAccepted.type_algo = 0;
                                    }
                                    recentAccepted           = u;
                                    MMM[1]                   = recentAccepted.id;
                                    recentAccepted.type_algo = 1;
                                    //
                                    predictMin = Math.Max(value_current - d_minmove, d_lowerBound);
                                }
                                else if (value_last < recentAccepted.ms_all_avg && value_last > d_lowerBound)
                                {
                                    //found lower Min0
                                    recentAccepted.type_algo = 0;
                                    recentAccepted           = lastItem;
                                    MMM[0] = recentAccepted.id;
                                    recentAccepted.type_algo = -1;
                                    //
                                    if (list_MMM.Count > 0)
                                    {
                                        list_MMM.Last()[2] = recentAccepted.id;
                                    }
                                }
                            }
                        }
                        //-----------------------------------------
                        u.myalgo_bound_lowest       = d_lowerBound;
                        u.myalgo_bound_predictedMin = predictMin;
                        u.myalgo_bound_predictedMax = predictMax;
                        //----
                        goUp_last  = goUp_current;
                        value_last = value_current;
                        lastItem   = u;
                    }//for each
                     //if (MMM[2] >= 0) { list_MMM.Add(MMM); }//add last item
                     //else if (MMM[0] >= 0 && MMM[1] < 0) { recentAccepted.type_algo = 0; }//delete last item
                }
                catch (Exception ex) { TheSys.showError(ex); }
            }
            //------------------------------------
            return(list_MMM);
        }