2009-09-03 100 views
42

Tôi có hình chữ nhật nguồn và hình chữ nhật đích. Tôi cần phải tìm quy mô tối đa mà nguồn có thể được thu nhỏ trong khi lắp trong hình chữ nhật đích và duy trì tỷ lệ khung hình gốc của nó.Làm cách nào để chia tỷ lệ hình chữ nhật thành kích thước tối đa trong hình chữ nhật khác?

Google tìm thấy one cách để làm điều đó nhưng tôi không chắc liệu nó có hoạt động trong mọi trường hợp hay không. Đây là giải pháp pha chế tại nhà của tôi:

  • Tính chiều cao/chiều rộng cho mỗi hình chữ nhật. Điều này cho các sườn của các đường chéo msrcmdest.
  • Nếu msrc < mdst, nguồn quy mô rộng để phù hợp với điểm đến rộng (và chiều cao quy mô của các tỷ lệ giống nhau)
  • Nếu không, nguồn quy mô chiều cao để phù hợp với điểm đến chiều cao (và quy mô chiều rộng bằng cùng tỷ lệ)

Tìm các giải pháp khả thi khác cho vấn đề này. Tôi thậm chí không chắc chắn nếu thuật toán của tôi hoạt động trong mọi trường hợp!

Trả lời

84
scale = min(dst.width/src.width, dst.height/src.height) 

Đây là cách tiếp cận của bạn nhưng được viết rõ ràng hơn.

+4

Ngọt ngào! Khi bạn có tỷ lệ, hãy sử dụng các thứ nguyên này để có được thứ nguyên cuối cùng: 'width = src.width * scale' và' height = src.height * scale' –

+4

Thay đổi min bằng max nếu bạn muốn bao phủ toàn bộ khu vực đích. – Glogo

+6

Cùng một giải pháp, nhưng với tên rõ ràng hơn với tôi: 'scale = min (maxWidth/actualWidth, maxHeight/actualHeight)', 'newWidth = actualWidth * scale',' newHeight = actualHeight * scale'. –

1
  1. làm việc ra nhỏ hơn của destWidth/srcWidthdestHeight/srcHeight
  2. Scale bởi rằng

chỉnh sửa đó là tất nhiên giống như phương pháp của bạn, với các mảnh của công thức di chuyển xung quanh. Ý kiến ​​của tôi là điều này rõ ràng hơn về mặt ngữ nghĩa, nhưng nó chỉ là một ý kiến.

10

Một lựa chọn khác có thể là để mở rộng quy mô chiều rộng tối đa và sau đó kiểm tra nếu chiều cao quy mô lớn thì chiều cao tối đa cho phép và nếu như vậy quy mô của chiều cao (hoặc ngược lại):

scale = (dst.width/src.width); 
if (src.height * scale > dst.height) 
scale = dst.height/src.height; 

Tôi nghĩ rằng giải pháp này là cả ngắn hơn, nhanh hơn và dễ hiểu hơn.

+0

Tôi nghĩ rằng bạn đã có tỷ lệ được lật trong dòng thứ ba của mình. – tom10

+0

bạn hoàn toàn chính xác. tôi sửa rồi. – Guss

1

Nếu tất cả các thứ nguyên khác không, tôi sẽ sử dụng mã sau (về cơ bản khớp với mã của bạn).

scaleFactor = (outerWidth/outerHeight > innerWidth/innerHeight) 
    ? outerHeight/innerHeight 
    : outerWidth/innerWidth 

Điều này cũng có thể được sửa đổi để cho phép bất kỳ thứ nguyên nào bằng không nếu được yêu cầu.

+1

Tôi nghĩ rằng một hình chữ nhật có kích thước bằng không được gọi là "dòng". : P – MusiGenesis

+1

Giải pháp này giống với toán học của tôi: nhân sự bất bình đẳng của bạn bằng (innerHeight * outerHeight/innerWidth) và bạn nhận được sự bất bình đẳng của tôi. Lợi thế của mã của tôi là nếu bất đẳng thức thất bại, thì giải pháp không cần phải được tính toán lại. – Guss

+0

Toán tử ternariy cũng sẽ chỉ đánh giá điều kiện một lần. Và, tất nhiên, tất cả các giải pháp phải tương đương toán học ... hoặc sai ... –

Các vấn đề liên quan