Algorithm 将图像分布成正方形的算法

Algorithm 将图像分布成正方形的算法,algorithm,language-agnostic,Algorithm,Language Agnostic,我正在构建一个应用程序,它可以从一系列图像创建一个精灵表。目前,应用程序需要由用户指示列数,但我想添加一个选项,自动建议此参数,允许获得几乎正方形的精灵表。 如果图像是正方形,则图像总数的平方根就足够了,但情况并非如此。 所有图像的大小必须相同,但可能高于宽或相反。 例如:精灵表有一个行走角色,每个图像高331,宽160。帧数是25。 我应该找到一个算法,建议列(和行)的数量,使我能够获得一个尽可能正方形的工作表。 不幸的是,我没有代码可以展示,因为我不知道该做什么样的推理。 你有什么建议要做吗

我正在构建一个应用程序,它可以从一系列图像创建一个精灵表。目前,应用程序需要由用户指示列数,但我想添加一个选项,自动建议此参数,允许获得几乎正方形的精灵表。 如果图像是正方形,则图像总数的平方根就足够了,但情况并非如此。 所有图像的大小必须相同,但可能高于宽或相反。 例如:精灵表有一个行走角色,每个图像高331,宽160。帧数是25。 我应该找到一个算法,建议列(和行)的数量,使我能够获得一个尽可能正方形的工作表。 不幸的是,我没有代码可以展示,因为我不知道该做什么样的推理。
你有什么建议要做吗?

从数学上讲,这是一个有趣的问题

我没有时间仔细考虑,但这是我的两分钱:

设精灵的宽度和高度分别为w和h,精灵的数量为n

如果将它们放在由c列和r行组成的网格中,网格的总宽度将为cw,总高度为rh。您希望商cw/rh尽可能接近1

现在,如果自由选择c和r,网格单元的数量N:=cr可能略大于N。在大多数情况下,我希望您接受部分为空的最后一行

因为N接近于N

因此,我们想要找到这样的c

它尽可能小。显然,当


因此,如果让列数为√(nh/w)四舍五入到最接近的整数,您可能会得到一个相当方形的网格。

从数学上讲,这是一个有趣的问题

我没有时间仔细考虑,但这是我的两分钱:

设精灵的宽度和高度分别为w和h,精灵的数量为n

如果将它们放在由c列和r行组成的网格中,网格的总宽度将为cw,总高度为rh。您希望商cw/rh尽可能接近1

现在,如果自由选择c和r,网格单元的数量N:=cr可能略大于N。在大多数情况下,我希望您接受部分为空的最后一行

因为N接近于N

因此,我们想要找到这样的c

它尽可能小。显然,当


因此,如果让列数为√(nh/w)四舍五入到最接近的整数,您可能会得到一个相当方形的网格。

基本思想是,如果图像高度是宽度的两倍,则需要比行多两倍的列

如果:

  • q是图像比率(宽度/高度)
  • c是列数
  • r是行数
  • n是图像的总数
然后我们有:

r/c=q和r*c=n

在几次替换之后:

  • c=sqrt(n/q)

  • r=q*c

在你的例子中,q=160/331=0.48

c=sqrt(25/0.48)=7.2

r=0.48*c=3.5


因此(四舍五入后)答案是4行7列。

基本思想是,如果图像高度是宽度的两倍,则需要比行多两倍的列

如果:

  • q是图像比率(宽度/高度)
  • c是列数
  • r是行数
  • n是图像的总数
然后我们有:

r/c=q和r*c=n

在几次替换之后:

  • c=sqrt(n/q)

  • r=q*c

在你的例子中,q=160/331=0.48

c=sqrt(25/0.48)=7.2

r=0.48*c=3.5


所以(四舍五入后)答案是4行7列。

也许值得指出的是,这实际上是一个纯粹的数学问题。它与Delphi和FreePascal无关。您可以在C#或Python标记中提出相同的问题,并获得完全相同的答案。这似乎是对该问题的相关答案吗?是的,你是对的,这是纯数学,但适用于特定的语言,如pascal。问题出在哪里?我还没有发布答案。我对你的问题发表了评论。我要说的是,一道纯数学题最好是在没有特定应用背景的情况下提出的。至少这是我在学术界工作10年后的坚定信念。我还可以补充一点,我既没有对你的Q投反对票,也没有对你的Q投反对票。(同样,一个人问同样的数学Q,但在C#上下文中可能找不到这个Q,因为他可能不会考虑搜索Delphi标记。等等。)我真的很抱歉你这么想。基于文本的交流是困难的。如果我们在同一个房间里交谈,当我第一次发表评论时,我就可以用我的肢体语言、语调和旋律向大家展示我非常不想听起来很刺耳。我只是想给你一些关于如何写一个好问题的建设性反馈。这就是注释部分的用途。实际上,由于这是一个纯数学问题,您可能会在数学堆栈交换中得到更好的答案:。然后,任何一个程序集,Pascal,C++,Python,或者FORTRAN开发人员都在寻找这样的算法,可以找到数学Q及其答案!也许值得指出的是,这实际上是一道纯粹的数学题。它与Delphi和FreePascal无关。您可以在C#或Python标记中提出相同的问题,并获得完全相同的答案。这似乎是对该问题的相关答案吗?是的,你是对的,这是纯数学,但适用于特定的语言,如pascal。问题出在哪里?我还没有发布答案。我对你发表了评论