public LineToPointAdapter2(LineNew line)
        {
            hash = line.GetHashCode();
            if (cache.ContainsKey(hash))
            {
                return;                          // we already have it
            }
            WriteLine($"{++count}: Generating points for line [{line.Start.X},{line.Start.Y}]-[{line.End.X},{line.End.Y}] (with caching)");
            //                                                 ^^^^

            List <Point2> points = new List <Point2>();

            int left   = Math.Min(line.Start.X, line.End.X);
            int right  = Math.Max(line.Start.X, line.End.X);
            int top    = Math.Min(line.Start.Y, line.End.Y);
            int bottom = Math.Max(line.Start.Y, line.End.Y);
            int dx     = right - left;
            int dy     = line.End.Y - line.Start.Y;

            if (dx == 0)
            {
                for (int y = top; y <= bottom; ++y)
                {
                    points.Add(new Point2(left, y));
                }
            }
            else if (dy == 0)
            {
                for (int x = left; x <= right; ++x)
                {
                    points.Add(new Point2(x, top));
                }
            }

            cache.Add(hash, points);
        }
 protected bool Equals(LineNew other)
 {
     return(Equals(Start, other.Start) && Equals(End, other.End));
 }