public Tuple <Second[], Second[], MeterPerSecond[]> CheckPattern(List <Tuple <GeoLocationDecimalDegree, DateTime> > pings) { if (pings.Count < 2) { return(new Tuple <Second[], Second[], MeterPerSecond[]>(new Second[pings.Count], new Second[pings.Count], new MeterPerSecond[pings.Count])); } int ping_count = pings.Count; GeoLocationDecimalDegree[] ship_ping_locations = new GeoLocationDecimalDegree[ping_count]; for (int ping_index = 0; ping_index < ping_count; ping_index++) { ship_ping_locations[ping_index] = pings[ping_index].Item1; } Second[] ping_seconds = new Second[ping_count]; MeterPerSecond[] ping_velocities = new MeterPerSecond[ping_count]; //double[] ping_areas = new double[ping_count]; Second[] ping_seconds_in_range = new Second[ping_count]; Meter[,] distance_matrix = ToolsMathFunction.FillArray <GeoLocationDecimalDegree, GeoLocationDecimalDegree, Meter>(new FunctionDistanceGeoLocation(), ship_ping_locations, ship_ping_locations); Meter ping_distance = new Meter(); ping_seconds[0] = (Second)((pings[1].Item2 - pings[0].Item2).TotalMilliseconds) / 2000.0; ping_distance = distance_matrix[0, 1] / 2.0; ping_velocities[0] = ping_distance / ping_seconds[0]; for (int ping_index = 1; ping_index < ping_count - 1; ping_index++) { ping_seconds[ping_index] += new Second((pings[ping_index].Item2 - pings[ping_index - 1].Item2).TotalMilliseconds) / 2000.0; ping_seconds[ping_index] += new Second((pings[ping_index + 1].Item2 - pings[ping_index].Item2).TotalMilliseconds) / 2000.0; ping_distance = (distance_matrix[ping_index, ping_index - 1] + distance_matrix[ping_index, ping_index + 1]) / 2.0; ping_velocities[ping_index] = ping_distance / ping_seconds[ping_index]; } ping_seconds[ping_count - 1] = new Second((pings[ping_count - 1].Item2 - pings[ping_count - 2].Item2).TotalMilliseconds) / 2000.0; ping_distance = distance_matrix[ping_count - 2, ping_count - 1] / 2.0; ping_velocities[ping_count - 1] = ping_distance / ping_seconds[ping_count - 1]; for (int index_ping_0 = 0; index_ping_0 < ping_count; index_ping_0++) { for (int index_ping_1 = 0; index_ping_1 < ping_count; index_ping_1++) { if (distance_matrix[index_ping_0, index_ping_1] < SurveyRangeInMeters) { ping_seconds_in_range[index_ping_0] += ping_seconds[index_ping_1]; } } } return(new Tuple <Second[], Second[], MeterPerSecond[]>(ping_seconds, ping_seconds_in_range, ping_velocities)); }
public static ImageRaster2D <RangeType> ConvertWriteableBitmapToImageRaster2D <RangeType>(WriteableBitmap writeable_bitmap, IFunction <int, RangeType> converter) { int width = writeable_bitmap.PixelWidth; int height = writeable_bitmap.PixelHeight; System.Windows.Media.PixelFormat format = System.Windows.Media.PixelFormats.Bgr24; int stride = (format.BitsPerPixel / 8) * width; int bytes = stride * height; int[] pixels = new int[width * height]; writeable_bitmap.CopyPixels(new Int32Rect(0, 0, width, height), pixels, bytes, stride); return(new ImageRaster2D <RangeType>(width, height, ToolsMathFunction.Convert(pixels, converter), false)); }
public static WriteableBitmap ConvertImageRaster2DToWriteableBitmap <RangeType>(ImageRaster2D <RangeType> image_raster_base, IFunction <RangeType, int> converter) { int width = image_raster_base.Raster.Size0; int height = image_raster_base.Raster.Size1; System.Windows.Media.PixelFormat format = System.Windows.Media.PixelFormats.Bgr24; WriteableBitmap result = new WriteableBitmap(width, height, 96, 96, System.Windows.Media.PixelFormats.Bgr24, null); int[] pixels = ToolsMathFunction.Convert(image_raster_base.GetElementValues(false), converter); int stride = (format.BitsPerPixel / 8) * width; int bytes = stride * height; //TODO convert result.Lock(); result.WritePixels(new Int32Rect(0, 0, width, height), pixels, bytes, stride); result.Unlock(); return(result); }