private bool HasSplitResults(PointBuffer _snakeBody)
        {
            bool result;

            result = false;

            for (int i = 1; i < _snakeBody.Size; i++)
            {
                if (Geometry.GetDistance(_snakeBody.PeekAt(i - 1), _snakeBody.PeekAt(i)) > 1)
                {
                    result = true;
                    break;
                }
            }

            return(result);
        }
        private void DrawStrandTail(Graphics g, PointBuffer points)
        {
            if (points.Size > 1)
            {
                // don't do this!
                //g.DrawLines(_bodyPen, points.ToArray());

                if (!this.HasSplitResults(points))
                {
                    Point[] _buffer;

                    // this isn't great, but as Graphics.DrawLines
                    // isn't enlightened enough to take a start and length,
                    // we copy the buffer out of the CircularBuffer into an
                    // existing byte array so in theory we aren't allocating
                    // an array over and over again

                    _buffer = ArrayPool <Point> .Shared.Allocate(points.Size);

                    points.CopyTo(_buffer);

                    g.DrawLines(_tailPen, _buffer);

                    ArrayPool <Point> .Shared.Free(_buffer);
                }
                else
                {
                    int   start;
                    Point previous;
                    Point current;

                    // if we've wrapped the playing field, I can't just
                    // call DrawLines with the entire buffer as we'll get
                    // lines drawn across the entire playing field, so
                    // instead I need to break it down into smaller buffers

                    start    = 0;
                    previous = points.PeekAt(0);

                    for (int i = 1; i < points.Size; i++)
                    {
                        current = points.PeekAt(i);

                        if (Geometry.GetDistance(previous, current) > 1)
                        {
                            // here we have a split, so let us grab a subset of
                            // the buffer and draw our lines
                            this.DrawSection(g, points, start, i - start);
                            start = i;
                        }

                        previous = current;
                    }

                    if (start < points.Size)
                    {
                        this.DrawSection(g, points, start, points.Size - start);
                    }
                }
            }
        }