private void Nui_Tick() { Image oldFrame = null; BeginInvoke(new Action(() => oldFrame = frameImage.Image)); if (mEnabled) { Bitmap frame = mDepth ? Nui.DepthFrame : Nui.ColourFrame; Func <Vector, Point> toP = v => { Point p = mDepth ? Nui.SkeletonToDepth(v) : Nui.SkeletonToColour(v); return(new Point(p.X - R, p.Y - R)); }; if (Nui.HasSkeleton) { using (Graphics g = Graphics.FromImage(frame)) { using (Pen p = new Pen(Color.Red, R / 2)) { g.DrawEllipse(p, new Rectangle(toP(mHead), mSize)); g.DrawEllipse(p, new Rectangle(toP(mHandL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mHandR), mSize)); g.DrawEllipse(p, new Rectangle(toP(mWristL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mWristR), mSize)); g.DrawEllipse(p, new Rectangle(toP(mElbowL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mElbowL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mShoulderL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mShoulderR), mSize)); g.DrawEllipse(p, new Rectangle(toP(mShoulderC), mSize)); g.DrawEllipse(p, new Rectangle(toP(mHipC), mSize)); g.DrawEllipse(p, new Rectangle(toP(mHipL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mHipR), mSize)); g.DrawEllipse(p, new Rectangle(toP(mKneeL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mKneeR), mSize)); g.DrawEllipse(p, new Rectangle(toP(mAnkleL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mAnkleR), mSize)); g.DrawEllipse(p, new Rectangle(toP(mFootL), mSize)); g.DrawEllipse(p, new Rectangle(toP(mFootR), mSize)); } } } BeginInvoke(new Action(() => { frameImage.Image = frame; if (oldFrame != null) { oldFrame.Dispose(); } })); } }