Итак, прежде всего позвольте мне показать вам, чего я хочу достичь:
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));
}