【发布时间】:2018-06-11 09:52:03
【问题描述】:
我从昨天开始尝试构建一个分割矩形的函数:
n = 1
____________
| |
|____________|
n = 2
____________
|____________|
|____________|
n = 3
____________
|______|_____|
|____________|
n = 4
____________
|______|_____|
|______|_____|
n = 5
____________
|__ |__|_____|
|______|_____|
我已搜索但未找到任何算法名称。 最后,我想要一个带有每个矩形的 (x, y, Long, larg) 的数组。 我认为这是递归的,只有一些除以 2 但是......我还没有找到任何解决我的问题的方法。 因此,如果您对我有一些提示(而不是完整的代码),我将非常感激。
对不起,如果我的英语不好,如果您想要精确一点,请不要犹豫。
拉夫。
编辑:
n = 5 更像这样:
____________
|______| |
|______|_____|
|______|_____|
编辑 2:这是我一直工作到 8 次分离的代码
PROCEDURE TrouveCoordsV2(nImages is int, nNoEcran is int)
listeEcran is string = SysListScreen()
tabNoms is array of strings = StringSplit(listeEcran,CR)
tabResolutionInt is array of strings = StringSplit(SysScreenResolution(tabNoms[nNoEcran]), TAB)
tabResolutionEcran is array of int
dimensionsEcran is array of int
FOR i = 1 TO 2
ArrayAdd(dimensionsEcran, Val(tabResolutionInt[i]))
END
ArrayAdd(tabResolutionEcran, TrouvePositionEcranX(nNoEcran, SysScreenRectangle()))
ArrayAdd(tabResolutionEcran, 0)
ArrayAdd(tabResolutionEcran, dimensionsEcran)
INTERNAL PROCEDURE CalculResolution(n is int, resolution is array of int)
tabResultat is array of arrays of int = []
nLongueur is int = RoundDown(resolution[3]/2)
nLargeur is int = RoundDown(resolution[4]/2)
resHG, resHD, resBG, resBD, resHL, resBL are arrays of int
resHG = [resolution[1], resolution[2], nLongueur, nLargeur]
resHD = [resolution[1]+nLongueur, resolution[2], nLongueur, nLargeur]
resBG = [resolution[1], resolution[2]+nLargeur, nLongueur, nLargeur]
resBD = [resolution[1]+nLongueur, resolution[2]+nLargeur, nLongueur, nLargeur]
resHL = [resolution[1], resolution[2], resolution[3], nLargeur]
resBL = [resolution[1], resolution[2]+nLargeur, resolution[3], nLargeur]
SWITCH n
CASE 1
ArrayAdd(tabResultat, resolution)
RESULT tabResultat
CASE 2
ArrayAdd(tabResultat, resHL)
ArrayAdd(tabResultat, resBL)
RESULT tabResultat
CASE 3
ArrayAdd(tabResultat, resHL)
ArrayAdd(tabResultat, resBG)
ArrayAdd(tabResultat, resBD)
RESULT tabResultat
CASE 4
ArrayAdd(tabResultat, resHG)
ArrayAdd(tabResultat, resHD)
ArrayAdd(tabResultat, resBG)
ArrayAdd(tabResultat, resBD)
RESULT tabResultat
CASE >4
mod is int = modulo(n, 4)
SWITCH mod
CASE 0
ArrayAdd(tabResultat, CalculResolution(n-6, resHG))
ArrayAdd(tabResultat, CalculResolution(n-6, resHD))
ArrayAdd(tabResultat, CalculResolution(n-6, resBG))
ArrayAdd(tabResultat, CalculResolution(n-6, resBD))
RESULT tabResultat
CASE 1
ArrayAdd(tabResultat, CalculResolution(n-5, resHG))
ArrayAdd(tabResultat, CalculResolution(n-5, resHD))
ArrayAdd(tabResultat, CalculResolution(n-5, resBG))
ArrayAdd(tabResultat, CalculResolution(n-3, resBD))
RESULT tabResultat
CASE 2
ArrayAdd(tabResultat, CalculResolution(n-6, resHG))
ArrayAdd(tabResultat, CalculResolution(n-6, resHD))
ArrayAdd(tabResultat, CalculResolution(n-4, resBG))
ArrayAdd(tabResultat, CalculResolution(n-4, resBD))
RESULT tabResultat
CASE 3
ArrayAdd(tabResultat, CalculResolution(n-7, resHG))
ArrayAdd(tabResultat, CalculResolution(n-5, resHD))
ArrayAdd(tabResultat, CalculResolution(n-5, resBG))
ArrayAdd(tabResultat, CalculResolution(n-5, resBD))
RESULT tabResultat
OTHER CASE
Info("Une erreur inattendue est survenue au niveau de l'affichage des fenetres")
END
CASE <=0
RESULT resolution
OTHER CASE
Info("Une erreur inattendue est survenue au niveau de l'affichage des fenetres")
END
END
IF nImages > 8 THEN
Info("Certaines aides n'ont pas pu êtres affichées")
nImages = 8
END
RESULT CalculResolution(nImages,tabResolutionEcran)
我将尝试为 n 次分离找到解决方案。 如果您想让我解释我的代码,请告诉我,因为在 WinDev 中 cmets 处于奇怪的黄色背景中,让我头疼...... 所以我为你翻译了部分英文。
提前感谢,祝你有美好的一天
拉夫。
【问题讨论】:
-
你能详细说明一下吗(x, y, Long, larg)。我的意思是他们的意思
-
x 和 y 是子矩形的左上角坐标,对不起我用法语写的,Long 是长度,Larg 是这个子矩形的宽度,这是屏幕上显示窗口的一些信息
-
根据我们划分的地方,x,y可以改变。有没有划分模式?
-
我不太明白你的问题,但模式是这样的:你有一个矩形,你水平分割然后你垂直分割第一个子矩形,然后你也垂直分割第二个子矩形
-
我不懂WinDev,所以不能多说代码。
n=5的第二个示例打印输出只有 4 个小矩形,而不是 5。我不明白你在 5 和 8 的结果中所说的“尺寸”是什么意思。如果你使用我的算法,你应该会发现 5 是素数,所以用4分割一个矩形,8只能分解为1x8和2x4。
标签: math recursion geometry rectangles divide