/// <summary>
 /// Feature extraction. True if the polyline goes through the ball.
 /// </summary>
 /// <param name="b">The ball.</param>
 /// <returns>True if the polyline crosses the ball.</returns>
 public bool Crosses(Ball b)
 {
     bool res = false;
     for (int i = 0; i < _polylineX.Length; i++)
         res = res || ((_polylineX[i] - b.X) * (_polylineX[i] - b.X) + (_polylineY[i] - b.Y) * (_polylineY[i] - b.Y) < b.Radius * b.Radius);
     return res;
 }
        /// <summary>
        /// Builds a cover from a .csv file.
        /// </summary>
        /// <param name="csvFilePath">.csv file containing the cover. Must contain a header.</param>
        public Cover(string csvFilePath)
        {
            using (StreamReader reader = new StreamReader(csvFilePath))
            {
                string line = "";
                reader.ReadLine(); // header
                while ((line = reader.ReadLine()) != null)
                {
                    string[] res = line.Split(',');
                    double x = Convert.ToDouble(res[0], CultureInfo.GetCultureInfo("en-US"));
                    double y = Convert.ToDouble(res[1], CultureInfo.GetCultureInfo("en-US"));
                    double radius = Convert.ToDouble(res[2], CultureInfo.GetCultureInfo("en-US"));

                    Ball current = new Ball(x, y, radius);
                    _balls.Add(current);
                    _names.Add(line.Replace(',', '_'));
                }
            }
        }