提取最接近的两个数字相乘以创建给定数字

问题描述 投票:0回答:1

我在 PyGame 中制作了一个基于 CPU 的光线追踪器,它使用每个线程一个图块来渲染屏幕的每个部分。目前,我在行之间垂直划分屏幕,这并没有给我最好的分布:我想将线程划分在覆盖 X 和 Y 方向的偶数框中。例如:如果我的分辨率为

x = 640, y = 320
并且我有 4 个线程,我想要一个由 4 个框组成的列表,以
(x_min, y_min, x_max, y_max)
的形式表示图块边界,在本例中结果为
[(0, 0, 320, 160), (320, 0, 640, 160), (0, 160, 320, 320), (320, 160, 640, 320)]

问题是我不知道如何自动将线程数划分为 2D 网格:我想提取最接近的两个整数相乘以匹配线程设置。如果这个数字不能被整除,则跳转到最接近的那个可以整除的数字...例如,没有两个整数可以相乘得到 7,请使用 6 或 8 代替。我尝试过

math.sqrt
,但它只适用于完全可整除的数字,如 16,即使四舍五入,它也不会为 32 等值提供准确的结果。最简单的解决方案是什么?

示例:

4 = 2 * 2
6 = 2 * 3
8 = 2 * 4
9 = 3 * 3
16 = 4 * 4
24 = 4 * 6
32 = 4 * 8
64 = 8 * 8

python algorithm math 2d
1个回答
0
投票

您首先需要找到

nThreads
的约数,如下所示:

nThreads = 16;
divisors = [i for i in range(2,floor(nThreads/2)+1) if nThreads%i==0]

您最终会得到一个数字不断增加的列表(我不是 Python 开发人员,但这对您来说不是问题)。

如果其长度大于2:

  • 如果是奇数,则选择中心值,如
    16 -> [2,4,8]
    所示:最终得到
    16=4*4
  • 如果是偶数,则选择两个中心值,如
    24 -> [2,3,4,6,8,12]
    所示:最终得到
    24=4*6

否则你选择较少数量的线。

© www.soinside.com 2019 - 2024. All rights reserved.