Пример #1
0
        void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            SkeletonFrame allSkeletons = e.SkeletonFrame;

            //if (allSkeletons != null)
            //{
            // allSkeletons is not null iff allSkeletons has a skeleton?
            skeleton = (from s in allSkeletons.Skeletons
                        where s.TrackingState == SkeletonTrackingState.Tracked
                        select s).FirstOrDefault();

            if (skeleton != null)
            {
                var leftHandY  = skeleton.Joints[JointID.HandLeft].ScaleTo(640, 480, .5f, .5f).Position.Y;
                var rightHandY = skeleton.Joints[JointID.HandRight].ScaleTo(640, 480, .5f, .5f).Position.Y;


                if (allSkeletons.FrameNumber % 1 == 0)                  // how many skeletons/second should be looked at and smoothed?
                {
                    // initial skeleton
                    if (smoothSkeleton == null)
                    {
                        smoothSkeleton = new SmoothSkeleton(leftHandY, rightHandY);
                    }
                    // process every new skeleton
                    else
                    {
                        smoothSkeleton.update(leftHandY, rightHandY);
                    }

                    //
                    // Console.Write(allSkeletons.FrameNumber + " " + allSkeletons.TimeStamp + " ");

                    // set background color
                    SetColor(proportion, smoothSkeleton);
                }
            }
            //}
        }
Пример #2
0
        //private void SetColor(double setProportion, SkeletonData skeleton)
        private void SetColor(double setProportion, SmoothSkeleton skeleton)
        {
            // top of screen = 0
            // bottom of screen = 480
            double leftHandPosition  = skeleton.leftOutput;
            double rightHandPosition = skeleton.rightOutput;



            crosshair1.SetValue(Canvas.BottomProperty, Math.Min(0, leftHandPosition - calibrationBaseline) * crosshairRate);
            crosshair2.SetValue(Canvas.BottomProperty, Math.Min(0, rightHandPosition - calibrationBaseline) * crosshairRate);


            double calibratedLeftHandPosition  = leftHandPosition - calibrationBaseline;
            double calibratedRightHandPosition = rightHandPosition - calibrationBaseline;

            if (calibratedRightHandPosition == 0)
            {
                calibratedRightHandPosition += .0001;
            }

            // TODO Don't divide by zero
            double currentProportion = calibratedLeftHandPosition / calibratedRightHandPosition;


            // tolerance settings
            if (toleranceMode == true)            // relative tolerance is enabled
            {
                toleranceLeftHand  = Math.Abs(leftHandPosition - 480);
                toleranceRightHand = Math.Abs(rightHandPosition - 480);

                if (toleranceLeftHand > toleranceRightHand)
                {
                    maxHandPosition = toleranceLeftHand;
                }
                else
                {
                    maxHandPosition = toleranceRightHand;
                }

                tolerance = (maxHandPosition * ((maxTolerance - minTolerance) / 480) + minTolerance) / 100;       // dimensions

                sendMessage("tolerance: " + tolerance.ToString());
            }


            // display heights
            textBlock1.Text = currentProportion.ToString();

            // determine gradient points
            double bottomTolerance = setProportion - (tolerance * 1 / 2);
            double topTolerance    = setProportion + (tolerance * 1 / 2);
            double topYellow       = setProportion + (tolerance * 1 / 2) + greenYellowFade;
            double bottomYellow    = setProportion - (tolerance * 1 / 2) - greenYellowFade;
            double topRed          = setProportion + (tolerance * 1 / 2) + greenYellowFade + yellowRedFade;
            double bottomRed       = setProportion - (tolerance * 1 / 2) - greenYellowFade - yellowRedFade;

            // determine gradient mappings
            // slope*currentProportion - y-intercept
            double topToleranceYellowMap    = ((1 / (greenYellowFade)) * currentProportion) - ((1 / (greenYellowFade)) * topTolerance);
            double topYellowRedMap          = ((1 / (yellowRedFade)) * currentProportion) - ((1 / (greenYellowFade)) * topYellow);
            double bottomYellowToleranceMap = ((1 / (greenYellowFade)) * currentProportion) - ((1 / (greenYellowFade)) * bottomYellow);
            double bottomRedYellowMap       = ((1 / (yellowRedFade)) * currentProportion) - ((1 / (greenYellowFade)) * bottomRed);



            System.Windows.Media.Color interpolatedColor = Colors.Red;
            if (currentProportion >= bottomTolerance &&
                currentProportion <= topTolerance)   // green
            {
                interpolatedColor = Colors.Green;
            }


            // green to yellow (top)
            else if (currentProportion > topTolerance &&
                     currentProportion <= topYellow)
            {
                interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Green, Colors.Yellow, topToleranceYellowMap);
            }
            // green to yellow (bottom)
            else if (currentProportion < bottomTolerance &&
                     currentProportion >= bottomYellow)
            {
                interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Yellow, Colors.Green, bottomYellowToleranceMap);
            }


            // yellow to red (top)
            // (.57, .59]
            else if (currentProportion > topYellow &&
                     currentProportion <= topRed)
            {
                interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Yellow, Colors.Red, topYellowRedMap);
            }
            // yellow to red (bottom)
            else if (currentProportion < bottomYellow &&
                     currentProportion >= bottomRed)
            {
                interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Red, Colors.Yellow, bottomRedYellowMap);
            }
            else
            {
                interpolatedColor = Colors.Red;
            }

            //interpolatedColor = ColorInterpolator.InterpolateBetween(Colors.Yellow, Colors.Green, currentProportion);
            SolidColorBrush interpolatedColorBrush = new SolidColorBrush(interpolatedColor);

            MainCanvas.Background = interpolatedColorBrush;      // set Background to a colorString, e.g. "#113355FF"
        }