像马赛克一样分割一个矩形
Split a rectangle like a mosaic
我从昨天开始尝试构建一个像这样划分矩形的函数:
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 中,评论是一种奇怪的黄色背景,让我很头疼……
所以我为你翻译了部分英文。
提前致谢,祝您有愉快的一天
拉夫
你没有给出代码或算法,只要求 "some tips," 所以我在这里只给出一个大致的想法。如果你想让我扩展这个想法,请展示你自己的更多作品。
如果你的 n
的值,小矩形的数量,是一个合数(假设 n = a * b
),那么你可以很容易地制作一个边长 a
的大矩形b
将有 n
个小矩形。
如果 n
是素数且大于 3,则 n-1
是合数。您可以用 n-1
个小矩形制作一个大矩形,然后将其中一个小矩形拆分为更小的矩形。这基本上就是您在 n=3
和 n=5
.
示例中所做的
请注意,不需要递归。当然,另一种可能是只画一个1
乘以n
的矩形,但这并不接近正方形。如果另一个目标是尽可能接近正方形,那么对于我的方法中的复合 n
,您还有一个额外的问题,即找到 a
和 b
彼此尽可能接近可能的。 (例如,如果 n
是 12,您可能需要 a=4
和 b=3
而不是 a=2
和 b=6
。)我会把这个问题留给你.
字符串:- "Hello world"
我在这里找到一个可行的解决方案是代码
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]
IF n=1
ArrayAdd(tabResultat,resolution)
ELSE IF n=2
ArrayAdd(tabResultat,resBL)
ArrayAdd(tabResultat,resHL)
ELSE IF n=3
ArrayAdd(tabResultat,resBD)
ArrayAdd(tabResultat,resBG)
ArrayAdd(tabResultat,resHL)
ELSE IF n=4
ArrayAdd(tabResultat,resBD)
ArrayAdd(tabResultat,resBG)
ArrayAdd(tabResultat,resHD)
ArrayAdd(tabResultat,resHG)
ELSE IF n>4
tabNbImages is array of int = NbFenetresParEcrans(n,4)
tabResolutions is array of arrays of int
ArrayAdd(tabResolutions,resBD)
ArrayAdd(tabResolutions,resBG)
ArrayAdd(tabResolutions,resHD)
ArrayAdd(tabResolutions,resHG)
FOR i = 1 TO 4
ArrayAdd(tabResultat, CalculResolution(tabNbImages[i], tabResolutions[i]))
END
END
RESULT tabResultat
END
RESULT CalculResolution(nImages,tabResolutionEcran)
还有"NbFenetresParEcrans"函数
PROCEDURE NbFenetresParEcrans(nNbFichiers is int, nNbEcrans is int)
tabFenetres is array of int = []
nDivision is int
nFichiersRestants is int = nNbFichiers
i is int = nNbEcrans
WHILE i > 0
nDivision = RoundUp(nFichiersRestants/i)
ArrayAdd(tabFenetres, nDivision)
nFichiersRestants -= nDivision
i--
END
RESULT tabFenetres
谢谢大家的帮助,如果你想要精度,我可以给你。
祝你今天愉快,WinDev 中的评论让你很头疼 (:
我从昨天开始尝试构建一个像这样划分矩形的函数:
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 中,评论是一种奇怪的黄色背景,让我很头疼…… 所以我为你翻译了部分英文。
提前致谢,祝您有愉快的一天
拉夫
你没有给出代码或算法,只要求 "some tips," 所以我在这里只给出一个大致的想法。如果你想让我扩展这个想法,请展示你自己的更多作品。
如果你的 n
的值,小矩形的数量,是一个合数(假设 n = a * b
),那么你可以很容易地制作一个边长 a
的大矩形b
将有 n
个小矩形。
如果 n
是素数且大于 3,则 n-1
是合数。您可以用 n-1
个小矩形制作一个大矩形,然后将其中一个小矩形拆分为更小的矩形。这基本上就是您在 n=3
和 n=5
.
请注意,不需要递归。当然,另一种可能是只画一个1
乘以n
的矩形,但这并不接近正方形。如果另一个目标是尽可能接近正方形,那么对于我的方法中的复合 n
,您还有一个额外的问题,即找到 a
和 b
彼此尽可能接近可能的。 (例如,如果 n
是 12,您可能需要 a=4
和 b=3
而不是 a=2
和 b=6
。)我会把这个问题留给你.
字符串:- "Hello world"
我在这里找到一个可行的解决方案是代码
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]
IF n=1
ArrayAdd(tabResultat,resolution)
ELSE IF n=2
ArrayAdd(tabResultat,resBL)
ArrayAdd(tabResultat,resHL)
ELSE IF n=3
ArrayAdd(tabResultat,resBD)
ArrayAdd(tabResultat,resBG)
ArrayAdd(tabResultat,resHL)
ELSE IF n=4
ArrayAdd(tabResultat,resBD)
ArrayAdd(tabResultat,resBG)
ArrayAdd(tabResultat,resHD)
ArrayAdd(tabResultat,resHG)
ELSE IF n>4
tabNbImages is array of int = NbFenetresParEcrans(n,4)
tabResolutions is array of arrays of int
ArrayAdd(tabResolutions,resBD)
ArrayAdd(tabResolutions,resBG)
ArrayAdd(tabResolutions,resHD)
ArrayAdd(tabResolutions,resHG)
FOR i = 1 TO 4
ArrayAdd(tabResultat, CalculResolution(tabNbImages[i], tabResolutions[i]))
END
END
RESULT tabResultat
END
RESULT CalculResolution(nImages,tabResolutionEcran)
还有"NbFenetresParEcrans"函数
PROCEDURE NbFenetresParEcrans(nNbFichiers is int, nNbEcrans is int)
tabFenetres is array of int = []
nDivision is int
nFichiersRestants is int = nNbFichiers
i is int = nNbEcrans
WHILE i > 0
nDivision = RoundUp(nFichiersRestants/i)
ArrayAdd(tabFenetres, nDivision)
nFichiersRestants -= nDivision
i--
END
RESULT tabFenetres
谢谢大家的帮助,如果你想要精度,我可以给你。
祝你今天愉快,WinDev 中的评论让你很头疼 (: