2012-05-02 2 views
7

Для прямоугольной формы S с соотношением сторон sx/sy и двумя другими прямоугольными формами A (с отношением сторон ax/ay) и B (с форматным соотношением bx/by), как можно Я узнаю, какая форма A или B имеет самое близкое соотношение сторон к S? Размеры фигур несущественны.Как определить, какие пропорции ближе всего

Это только то, что из (sx/sy)/(ax/ay) и (sx/sy)/(bx/by) ближе всего к 1?

То, что я на самом деле пытаюсь сделать, это выяснить, какая форма на слайде PPTX наилучшим образом соответствует изображению, которое будет изменено, а затем обрезано, чтобы соответствовать этой форме. Я предполагаю, что другой подход заключается в том, чтобы определить, какая форма приводит к тому, что наименьшее количество пикселей будет потеряно, хотя в моем коде будет легче, если я смогу это сделать, сравнив пропорции.

В конце концов я пошел с ниже алгоритма реализуется следующим образом (благодаря Matt Болл для его обратной связи):

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; 
} 

ответ

4

это только в зависимости от того из (Sx/SY)/(топор/ay) и (sx/sy)/(bx/by) ближе всего к 1?

Звучит разумно. Кроме того, можно просто свести к минимуму разницу:

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 

Update: алгоритм в этом ответе не совсем работает, как описано в комментариях ниже. ОП обновил свой вопрос, включив алгоритм, который он использовал, и работает, кажется, работает нормально.

+0

Я думал об этом изначально, но я думаю, что он работает только, если мы предположим, что все формы имеют X> Y (или наоборот).Например, для портретных изображений соотношение сторон всегда является долей; для пейзажа это целое число. Дайте мне знать, если я ошибаюсь в этом вопросе - спасибо –

+0

Предположим, что 'target_ratio' -' 1', 'a_ratio' -' 1.1', а 'b_ratio' -' 0,5' (поэтому правильный ответ - 'a_ratio') , Тогда у вас есть '| -0.1 | <| 0,5 | 'или' 0.1 <0.5', поэтому случай 'if' является' true', поэтому мы получаем 'a_ratio' из псевдокода. Так что это прекрасно работает при использовании сочетания пейзажа и портрета. –

+1

Просто реализовано это в моем коде, и он отлично работает - спасибо :-) –

3

Глядя на выше предложение, я не уверен:

Подумайте на следующем примере: A = 1: 2 B = 2: 1 и

targetRatio = 1: 1

Ясно, что оба а & в должна быть в равной степени пригодны, но при сравнении

(1 - GoalAR/CandiateAR), как предложено,

aspectRatioCandidateA = 0,5 [1: 2]

aspectRatioCandidateB = 2 [2: 1]

вы получите

closenessScoreA = 1

closenessScoreB = 0,5

Лучший способ сравнить пропорции - это определить их как определяющий угол:

загар (о) = ч/б

O = Atan (ч/б)

Вы можете просто сравнить разницу углов в настоящее время.

+0

Принятый ответ, как указано, не работает, как показывает ваш пример. Если вы прочтете поток комментариев для этого ответа, вы увидите, что я закончил делать, - который использовал алгоритм, который я задал в вопросе. В любом случае, спасибо за ваш вклад :-) –

+0

Привет. Чуть смущенно. Насколько я понимаю текущий поток, код, напечатанный в вопросе (после вашего редактирования), является тем, что вы используете, не так ли? Я имел в виду это со своим встречным примером. Возьмем пример двух отношений A = 3: 4 = 0,75 и B = 17: 10 = 1,7. Что ближе к G = 5: 4 = 1,25? Согласно вашему коду, это будет A со счетом 0,66, а у B - 0,735. Однако, если вы сравните углы, вы окажетесь «ближе» к цели. B имеет тэта 59,53, A имеет тэта 36,869, а цель - 51,34. – BmyGuest

+1

Ваш метод может быть более точным (кажется разумным). Однако, используя «мой» алгоритм, B также выигрывает: s A (sx/sy)/(ax/ay) = 1,67; B (sx/sy)/(ax/ay) = 0,74; Оценка А (близость к 1) = 1-1,67 = 0,67; B = 1-0,74 = 0,26. Если я не ошибся ;-) –

Смежные вопросы