2012-05-02 38 views
7

Cho hình chữ nhật S, với tỷ lệ khung hình sx/sy và hai hình chữ nhật khác A (với tỉ lệ co/ay) và B (với tỷ lệ cỡ ảnh bx/theo) Tôi tìm ra hình dạng A hoặc B nào có tỷ lệ khung hình gần nhất với S? Kích thước của hình dạng không quan trọng.Cách xác định tỷ lệ cỡ ảnh nào gần nhất là

Có phải chỉ là bất kỳ (sx/sy)/(ax/ay) và (sx/sy)/(bx/by) gần nhất với 1 không?

Những gì tôi thực sự cố gắng làm là tìm ra hình dạng trên trang PPTX sẽ phù hợp nhất với hình ảnh sẽ được thay đổi kích thước và sau đó cắt để vừa với hình dạng đó. Tôi đoán cách tiếp cận khác sẽ là tìm ra hình dạng nào dẫn đến ít pixel nhất bị mất, mặc dù trong mã của tôi, sẽ dễ dàng hơn nếu tôi có thể làm điều đó bằng cách so sánh tỷ lệ khung hình.

Cuối cùng tôi đã đi với các thuật toán dưới đây, thực hiện như sau (nhờ Matt bóng cho ý kiến ​​phản hồi của mình):

ShapeInPPTXLocation closest; 
double imageAR = a_imageDim.getWidth()/a_imageDim.getHeight(); 
double aspectRatioCandidateA = a_candidateA.getWidth()/a_candidateA.getHeight(); 
double aspectRatioCandidateB = a_candidateB.getWidth()/a_candidateB.getHeight(); 
double closenessScoreA=1-(imageAR/aspectRatioCandidateA); 
double closenessScoreB=1-(imageAR/aspectRatioCandidateB); 

if (Math.abs(closenessScoreA) <= Math.abs(closenessScoreB)) 
{ 
    closest=a_candidateA; 
} 
else 
{ 
    closest=a_candidateB; 
} 

Trả lời

4

Là nó chỉ nào của (sx/sy)/(ax/ay) và (sx/sy)/(bx/by) gần nhất với 1?

Điều đó nghe có vẻ hợp lý. Bạn cũng có thể chỉ hạn chế tối đa sự khác biệt:

let target_ratio = sx/sy 
let a_ratio = ax/ay 
let b_ration = bx/by 

if |target_ratio - a_ratio| < |target_ratio - b_ratio| 
    a_ratio is closer to target 
else 
    b_ratio is closer to target 

Cập nhật: các thuật toán trong câu trả lời này không hoàn toàn công việc, như được giải thích trong các ý kiến ​​dưới đây. OP đã cập nhật câu hỏi của anh ta để bao gồm thuật toán mà anh ta sử dụng, hoạt động này dường như hoạt động tốt.

+0

Tôi đã nghĩ về điều này ban đầu nhưng tôi nghĩ nó chỉ hoạt động nếu chúng ta giả sử tất cả các hình dạng có X> Y (hoặc ngược lại).Ví dụ: đối với hình ảnh dọc, tỉ lệ khung hình luôn là một phần nhỏ; cho cảnh quan, nó là một số nguyên. Hãy cho tôi biết nếu tôi sai về điều này mặc dù - cảm ơn –

+0

Giả sử rằng 'target_ratio' là' 1', 'a_ratio' là' 1.1' và 'b_ratio' là' 0.5' (vì vậy câu trả lời đúng là 'a_ratio') . Sau đó, bạn có '| -0.1 | <| 0.5 | 'hoặc' 0.1 <0.5' để trường hợp 'if' là' true', vì vậy chúng ta nhận 'a_ratio' từ thuật toán giả mã. Vì vậy, điều này hoạt động tốt khi sử dụng kết hợp giữa phong cảnh và chân dung. –

+1

Chỉ cần thực hiện điều này trong mã của tôi và nó hoạt động hoàn hảo - nhờ :-) –

3

Nhìn vào gợi ý ở trên, tôi không thuyết phục:

suy nghĩ về ví dụ sau: A = 1: 2 B = 2: 1 và

targetRatio = 1: 1

rõ ràng cả hai Một & B nên được bình đẳng phù hợp, nhưng với sự so sánh của

(1 - GoalAR/CandiateAR) như đề xuất,

aspectRatioCandidateA = 0,5 [1: 2]

aspectRatioCandidateB = 2 [2: 1]

bạn muốn nhận được

closenessScoreA = 1

closenessScoreB = 0,5

Cách tốt nhất để so sánh tỷ lệ khung hình là suy nghĩ về chúng như định nghĩa một góc:

tan (o) = h/w

o = atan (h/w)

Sau đó, bạn có thể chỉ cần so sánh sự khác biệt của các góc bây giờ.

+0

Câu trả lời được chấp nhận như đã nêu không hoạt động, như ví dụ của bạn thể hiện. Nếu bạn đọc chuỗi nhận xét cho câu trả lời đó, bạn sẽ thấy những gì tôi đã làm - đó là sử dụng thuật toán tôi đưa ra trong câu hỏi. Dù sao, cảm ơn cho đầu vào của bạn :-) –

+0

Hi. Hơi bối rối ngay bây giờ. Khi tôi hiểu chủ đề hiện tại, mã được in trong câu hỏi (sau khi bạn chỉnh sửa) là những gì bạn đang sử dụng, phải không? Tôi đã đề cập đến điều đó với ví dụ phản đối của tôi. Lấy ví dụ về hai tỷ số A = 3: 4 = 0,75 và B = 17: 10 = 1,7. Đó là gần gũi hơn với G = 5: 4 = 1,25? Theo mã của bạn, nó sẽ là A với số điểm là 0,66 trong khi B có điểm số là 0,735. Tuy nhiên, nếu bạn so sánh các góc, bạn kết thúc với B là "gần hơn" với mục tiêu. B có theta 59.53, A có theta là 36.869 và mục tiêu là 51.34. – BmyGuest

+1

Phương pháp của bạn có thể chính xác hơn (có vẻ hợp lý). Tuy nhiên, sử dụng thuật toán 'my', B cũng thắng: s A (sx/sy)/(ax/ay) = 1,67; B (sx/sy)/(rìu/ay) = 0,74; Điểm A (gần bằng 1) = 1-1,67 = 0,67; Điểm B = 1-0,74 = 0,26. Trừ khi tôi đã thực hiện một sai lầm ;-) –

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