给定矩形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;
}
答案 0 :(得分:4)
它是(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更新了他的问题,包括他使用的算法,其工作似乎工作正常。
答案 1 :(得分:3)
看看上面的建议,我不相信:
请考虑以下示例: A = 1:2 B = 2:1 和
targetRatio = 1:1
显然A&amp; B应该同样适合,但与
进行比较 建议(1 - GoalAR / CandiateAR),
aspectRatioCandidateA = 0.5 [1:2]
aspectRatioCandidateB = 2 [2:1]
你得到
closenessScoreA = 1
closenessScoreB = 0.5
比较宽高比的最佳方法是将它们视为定义角度:
tan(o)= h / w
o = atan(h / w)
然后,您可以简单地比较角度的差异。