using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11.common { public class Frame { public int Width { get; set; } public int Height { get; set; } public Frame() // standard frame { this.Width = 640; this.Height = 480; } public Frame(int width, int height) { Width = width; Height = height; } public static Frame StandardFrame() { return new Frame(); } public override string ToString() => $"{Width}x{Height}"; // Static method to parse string like "1920x1080" public static Frame Parse(string resolution) { var match = Regex.Match(resolution, @"^\s*(\d+)\s*[xX]\s*(\d+)\s*$"); if (!match.Success) { throw new FormatException($"Invalid resolution format: '{resolution}'"); } int width = int.Parse(match.Groups[1].Value); int height = int.Parse(match.Groups[2].Value); return new Frame(width, height); } /// /// Finds nearest frame based on selected dimension /// example: /// /// var input = new Frame(1500, 800); /// //Nearest by Width /// var nearestByWidth = input.FindNearest(allFrames, f => f.Width); /// Console.WriteLine($"Nearest by width: {nearestByWidth}"); // → 1280x720 /// //Nearest by Height /// var nearestByHeight = input.FindNearest(allFrames, f => f.Height); /// Console.WriteLine($"Nearest by height: {nearestByHeight}"); // → 1280x720 /// public Frame FindNearest(IEnumerable candidates, Func dimensionSelector) { int target = dimensionSelector(this); return candidates .OrderBy(f => Math.Abs(dimensionSelector(f) - target)) .ThenBy(dimensionSelector) // tie-breaker: prefer smaller .FirstOrDefault(); } } }