/// <summary>
 /// ユーザのセグメンテーションと新IDの割り当て
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Segmentation_Click(object sender, RoutedEventArgs e)
 {
     UserSegmentation[] segm = new UserSegmentation[frameSequence.recordNum];
     for (int i = 0; i < frameSequence.recordNum; i++)
     {
         segm[i] = UserSegmentation.Segment(frameSequence.GetMotionDataSequence(i), new TimeSpan(0, 0, 1));
     }
     frameSequence.Segmentations = segm.ToList();
     // 統合IDの生成
     segm = UserSegmentation.Identification(frameSequence, 1);
     frameSequence.Segmentations = segm.ToList();
     // UserIdを選択するUIのリフレッシュ
     this.UpdateIntegratedIds();
 }
        public static UserSegmentation Segment(IEnumerable <MotionData> recordData, TimeSpan segmentTimeSpan)
        {
            int numUser           = 0;
            UserSegmentation segm = new UserSegmentation();
            Dictionary <ulong, Tuple <int, DateTime> > currentConversions = new Dictionary <ulong, Tuple <int, DateTime> >();
            int frameIndex = 0;

            foreach (MotionData md in recordData)
            {
                bool changed = false;
                foreach (ulong user in md.bodies.ToList().Select(b => b.TrackingId))
                {
                    Tuple <int, DateTime> converted;
                    if (currentConversions.TryGetValue(user, out converted))
                    {
                        // 前回と比べて時間内なら継続
                        if (md.TimeStamp - converted.Item2 <= segmentTimeSpan)
                        {
                            currentConversions[user] = new Tuple <int, DateTime>(converted.Item1, md.TimeStamp);
                            continue;
                        }
                    }
                    // 新しい番号を与える
                    currentConversions[user] = new Tuple <int, DateTime>(numUser, md.TimeStamp);
                    numUser++;
                    changed = true;
                }
                if (changed)
                {
                    segm.Conversions[frameIndex] = currentConversions.ToDictionary(p => p.Key, p => p.Value.Item1);
                }
                frameIndex++;
            }
            segm._numUsers = numUser;
            return(segm);
        }