c # wpf рисование нескольких строк на холсте с датчиком kinect

Итак, прежде всего позвольте мне показать вам, чего я хочу достичь:

http://www.youtube.com/watch?NR=1&feature=endscreen&v=FdwZEepJxJ4

Там парень рисует длинную кривую линию с помощью kinect. Мне нужно сделать что-то подобное. У меня было несколько идей с простым кодом, например

layoutGrid.Children.Add(myLine)

Это работает, но не так, как я хочу.

Я думал, что могу использовать DrawingContext для рисования линий с помощью:

DrawingContext.DrawLine(drawPen, pointprev, point1);

Проблема в том, что при использовании этого метода рисования линии, которые я рисую, не сохраняются на экране. Как будто линия всегда перерисовывается. Как сохранить свои линии?

Кстати, я тоже не понимаю, почему скелет, нарисованный тем же методом, обновляется и нам не нужно очищать предыдущие строки в изображении?

private void WindowLoaded(object sender, RoutedEventArgs e)
        {
            // Create the drawing group we'll use for drawing
            this.drawingGroup = new DrawingGroup();

            // Create an image source that we can use in our image control
            this.imageSource = new DrawingImage(this.drawingGroup);

            // Display the drawing using our image control
            Image2.Source = this.imageSource;

            ************Some other code here*******
         }


 private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            *****************Some code to get skeleton data here********

            using (DrawingContext dc = this.drawingGroup.Open())
            {

                if (skeletons.Length != 0)
                {
                    foreach (Skeleton skel in skeletons)
                    {

                        if (skel.TrackingState == SkeletonTrackingState.Tracked)
                        {

                            this.DrawBonesAndJoints(skel, dc);                            
                        }

                    }
                }
            }           
        }


private void DrawBonesAndJoints(Skeleton skeleton, DrawingContext drawingContext)
        {
            ***********************Some code to draw skeleton***************

            Joint righthand = skeleton.Joints[JointType.HandRight];

            if (init == true)
            {
                pointprev = SkeletonPointToScreen(righthand.Position);
                init = false;
                return;
            }


            Point point1 = SkeletonPointToScreen(righthand.Position);

            Pen drawPen = this.trackedBonePen;

            drawingContext.DrawLine(drawPen, pointprev, point1);


            pointprev = point1;

        }

private Point SkeletonPointToScreen(SkeletonPoint skelpoint)
        {
            // Convert point to depth space.  
            // We are not using depth directly, but we do want the points in our 640x480 output resolution.
            DepthImagePoint depthPoint = this.sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(skelpoint, DepthImageFormat.Resolution640x480Fps30);
            return new Point(depthPoint.X, depthPoint.Y);
        }


        private void DrawBone(Skeleton skeleton, DrawingContext drawingContext, JointType jointType0, JointType jointType1)
        {
            Joint joint0 = skeleton.Joints[jointType0];
            Joint joint1 = skeleton.Joints[jointType1];          

            Pen drawPen = this.trackedBonePen;   

            drawingContext.DrawLine(drawPen, this.SkeletonPointToScreen(joint0.Position),       this.SkeletonPointToScreen(joint1.Position));
        }

person user2151660    schedule 15.04.2013    source источник


Ответы (1)


Как сохранить свои линии?

Вам придется либо использовать полилинию, либо нарисуйте PathGeometry или StreamGeometry в DrawingContext с помощью DrawGeometry. Геометрия должна содержать один или несколько сегментов полилинии.

person Clemens    schedule 15.04.2013