private void TrackGesture(Person person, ref ScissorGestureTracker gestureTracker)
        {
            if (person.leftHand == null || person.rightHand == null)
            {
                gestureTracker.reset();
                return;
            }

            Hand leftHand = person.leftHand;
            Hand rightHand = person.rightHand;

            Vector2 leftHandVelocity = leftHand.getHeading();
            Vector2 rightHandVelocity = rightHand.getHeading();
            Vector2 relativeHeading = Vector2.Subtract(leftHandVelocity, rightHandVelocity);
            Vector2.Normalize(relativeHeading);

            DotNET.Point leftHandPosition = leftHand.getLocation();
            DotNET.Point rightHandPosition = rightHand.getLocation();

            DotNET.Vector tempVec = DotNET.Point.Subtract(rightHandPosition, leftHandPosition);
            Vector2 leftToRight = new Vector2((float) tempVec.X, (float) tempVec.Y);

            double dotProduct = Vector2.Dot(relativeHeading, leftToRight);

            if (dotProduct > 0)
            {
                gestureTracker.currState = ScissorGestureState.Converging;
            }
            else
            {
                gestureTracker.currState = ScissorGestureState.Diverging;
            }

            // If the user's hands are converging...
            if (gestureTracker.currState == ScissorGestureState.Converging)
            {
                double leftHandRadius = leftHand.getAgentRadius();
                double rightHandRadius = rightHand.getAgentRadius();

                double minContactRadius = (leftHandRadius + rightHandRadius) * CONTACT_SCALE;

                // Check if they're proximal
                if (minContactRadius <= leftToRight.Length())
                {
                    gestureTracker.currState = ScissorGestureState.Proximal;
                }
            }

            if (gestureTracker.currState == ScissorGestureState.Proximal)
            {
                // send message
                GestureDetected(this, new ScissorGestureEventArgs(person, false, CONTACT_SCALE));
            }
            else if (gestureTracker.currState == ScissorGestureState.Diverging)
            {
                GestureDetected(this, new ScissorGestureEventArgs(person, true, CONTACT_SCALE));
            }
        }
        private ScissorGestureTracker getTrackerForPerson(Person p)
        {
            bool extractionSuccessful;
            ScissorGestureTracker output;

            if (scissorGestureTrackers.ContainsKey(p) != true)
            {
                ScissorGestureTracker newSGT = new ScissorGestureTracker();

                scissorGestureTrackers.Add(p, newSGT);
            }

            extractionSuccessful = scissorGestureTrackers.TryGetValue(p, out output);

            return output;
        }