Đã thử mã của ông Warren, nhưng nó không tạo ra kết quả đáng tin cậy.
Ví dụ,
ExpandToBound(new Size(640,480), new Size(66, 999)).Dump();
// {Width=66, Height=49}
ExpandToBound(new Size(640,480), new Size(999,50)).Dump();
// {Width=66, Height=50}
Bạn có thể thấy, height = 49 và height = 50 trong khác.
Đây là phiên bản dựa trên của tôiđang Warren) mà không có sự khác biệt và một cấu trúc lại nhẹ:
// Passing null for either maxWidth or maxHeight maintains aspect ratio while
// the other non-null parameter is guaranteed to be constrained to
// its maximum value.
//
// Example: maxHeight = 50, maxWidth = null
// Constrain the height to a maximum value of 50, respecting the aspect
// ratio, to any width.
//
// Example: maxHeight = 100, maxWidth = 90
// Constrain the height to a maximum of 100 and width to a maximum of 90
// whichever comes first.
//
private static Size ScaleSize(Size from, int? maxWidth, int? maxHeight)
{
if (!maxWidth.HasValue && !maxHeight.HasValue) throw new ArgumentException("At least one scale factor (toWidth or toHeight) must not be null.");
if (from.Height == 0 || from.Width == 0) throw new ArgumentException("Cannot scale size from zero.");
double? widthScale = null;
double? heightScale = null;
if (maxWidth.HasValue)
{
widthScale = maxWidth.Value/(double)from.Width;
}
if (maxHeight.HasValue)
{
heightScale = maxHeight.Value/(double)from.Height;
}
double scale = Math.Min((double)(widthScale ?? heightScale),
(double)(heightScale ?? widthScale));
return new Size((int)Math.Floor(from.Width * scale), (int)Math.Ceiling(from.Height * scale));
}
Nguồn
2011-03-20 10:28:09
Xin đừng lạm dụng refs như thế. Tốt hơn hết là tạo một hình chữ nhật cấu trúc _immutable_ có trường chiều rộng và chiều cao, sau đó viết phương thức ExpandToBound lấy hai hình chữ nhật và trả về hình chữ nhật kết quả. Nó là dễ dàng hơn nhiều để lý do về chức năng khi bạn thực hiện chúng như _functions_. Đối số đi vào, kết quả đi ra; các chức năng không biến đổi trạng thái mà chúng không sở hữu. –
@Eric Lippert - Đồng ý, ví dụ không phải là chức năng tôi thực sự triển khai, chỉ là phiên bản được luộc để tránh nhầm lẫn vấn đề với cấu trúc Hình chữ nhật hoặc những thứ khác không phải là một phần cốt lõi của vấn đề. –