void IGestureRecognizer.UpdateJointData(Dictionary<Microsoft.Kinect.JointType, Point3D> jointData)
        {
            if (_recoginized)
                return;

            Point3D rightHand = jointData[JointType.HandRight];
            //Debug.WriteLine("z = " + rightHand.Z);
            Point3D hip = jointData[JointType.HipCenter];

            if (!_gestureStart)
            {
                // if the guesture has not started, and we found the right hand
                // is about the height of the right shoulder, and it's Z is also
                // close to the right shoulder, we will say the gesture starts.
                //double zDiff = lastRightHandPos != null ? lastRightHandPos.Z - rightHand.Z : 0;
                double yDiff = lastRightHandPos != null ? lastRightHandPos.Y - rightHand.Y : 0;
                //Debug.WriteLine("zDiff = " + zDiff);
                if (Math.Abs(hip.Y - rightHand.Y) < 0.1)
                {
                    //Debug.WriteLine("\n*** START ***");
                    _gestureStart = true;
                    startRightHandPos = rightHand;
                    totalDis = 0.0;
                }
            }
            else
            {
                totalDis += Math.Abs(startRightHandPos.Y - rightHand.Y);

                // the gesture has started, we need to track the hand position
                // to see if the guesture has completed.

                if (startRightHandPos.Y > rightHand.Y)
                {
                    //Debug.WriteLine("=== ABORT!");
                    _gestureStart = false;

                    totalDis = 0.0;
                    return;
                }

                if (totalDis > 0.5)
                {
                    _recoginized = true;
                    //Debug.WriteLine("\n!!!! RECOGNIZED!!! !!!");
                    //totalDis = 0.0;
                }
            }
            lastRightHandPos = rightHand;
        }
 public double Dist(Point3D p)
 {
     return Math.Sqrt(Math.Pow(_x - p.X, 2) +
                      Math.Pow(_y - p.Y, 2) +
                      Math.Pow(_z - p.Z, 2));
 }
 public static double Dist(Point3D p1, Point3D p2)
 {
     return Math.Sqrt(Math.Pow(p1.X - p2.X, 2) +
                      Math.Pow(p1.Y - p2.Y, 2) +
                      Math.Pow(p1.Z - p2.Z, 2));
 }
        // Normalize all joint data by setting shoulder center to be origin
        // and shoulder width to be 1.0.
        private Dictionary<JointType, Point3D> NormalizeJoints(Skeleton sk)
        {
            Dictionary<JointType, Point3D> normalizedJointData = new Dictionary<JointType, Point3D>();

            // Make all joints' position relative to the shoulder center
            SkeletonPoint shouldCenter = sk.Joints[JointType.ShoulderCenter].Position;
            foreach (JointType jointType in Enum.GetValues(typeof(JointType)).Cast<JointType>())
            {
                Point3D newPoint = new Point3D();
                normalizedJointData.Add(jointType, newPoint);
                newPoint.X = sk.Joints[jointType].Position.X - shouldCenter.X;
                newPoint.Y = sk.Joints[jointType].Position.Y - shouldCenter.Y;
                newPoint.Z = sk.Joints[jointType].Position.Z - shouldCenter.Z;
            }

            // Normalize the distance between each point and the shoulder center
            double shouldWidth = Point3D.Dist(sk.Joints[JointType.ShoulderLeft].Position,
                                              sk.Joints[JointType.ShoulderRight].Position);
            foreach (JointType jointType in Enum.GetValues(typeof(JointType)).Cast<JointType>())
            {
                Point3D p = normalizedJointData[jointType];
                p.X /= shouldWidth;
                p.Y /= shouldWidth;
                p.Z /= shouldWidth;
            }

            return normalizedJointData;
        }