8

给定一个矩形 S,纵横比为 sx/sy,以及另外两个矩形 A(纵横比为 ax/ay)和 B(纵横比为 bx/by),我如何找出形状 A 或 B 中的哪一个具有最接近 S 的纵横比?形状的大小并不重要。

它只是 (sx/sy)/(ax/ay) 和 (sx/sy)/(bx/by) 中最接近 1 的那个吗?

我实际上想要做的是找出 PPTX 幻灯片上的哪个形状最适合将调整大小然后裁剪以适合该形状的图像。我想另一种方法是确定哪种形状导致丢失的像素最少,尽管在我的代码中,如果我可以通过比较纵横比来做到这一点会更容易。

最后我使用了下面的算法,实现如下(感谢 Matt Ball 的反馈):

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

2 回答 2

3

它只是 (sx/sy)/(ax/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

更新:此答案中的算法不太有效,如下面的评论中所述。OP 更新了他的问题以包括他使用的算法,该算法似乎工作正常。

于 2012-05-02T15:05:43.603 回答
3

看了上面的建议,我不相信:

考虑以下示例:A = 1:2 B = 2:1 和

目标比率 = 1:1

显然 A 和 B 都应该同样合适,但比较

( 1 - GoalAR/CandiateAR) 如建议的那样,

aspectRatioCandidateA = 0.5 [ 1 : 2 ]

aspectRatioCandidateB = 2 [ 2 : 1 ]

你会得到

亲密度A = 1

亲密度B = 0.5

比较纵横比的最佳方法是将它们视为定义一个角度:

tan(o) = h/w

o = atan( h/w )

然后,您现在可以简单地比较角度的差异。

于 2014-04-09T00:04:33.917 回答