math - 像马赛克一样分割一个矩形
问题描述
我从昨天开始尝试构建一个像这样划分矩形的函数:
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 中,注释处于奇怪的黄色背景中,让我头疼……所以我为您翻译了部分英文。
提前谢谢,祝你有美好的一天
拉夫。
解决方案
你没有给出代码或算法,只是要求“一些提示”,所以我在这里只给出一个广泛的想法。如果您希望我扩展这个想法,请展示您自己的更多工作。
如果您的 值n
,即小矩形的数量,是一个合数(比如说n = a * b
),那么您可以轻松地制作一个有边的大矩形,a
并且b
它会有n
小矩形。
如果n
是素数且大于 3,n-1
则为合数。您可以用小矩形制作一个大矩形n-1
,然后将其中一个小矩形拆分为较小的矩形。这基本上就是您在示例中为n=3
and所做的n=5
。
请注意,不需要递归。当然,另一种可能性是只绘制一个大小为 的矩形1
,n
但这并不接近正方形。如果另一个目标是尽可能接近正方形,那么对于n
我的方法中的合成,您还有一个额外的问题是找到a
并b
尽可能接近彼此。(例如,如果n
是 12,您可能需要a=4
andb=3
而不是a=2
and b=6
。)我将把这个问题留给您。
推荐阅读
- reporting-services - Reporting Services (SSRS) 删除导出文件的名称
- sql - 在 SQL Server 2008 中使用 case 语句减去 2 行
- android - 发送短信失败
- arrays - Postgresql 用 array_to_string 将字符串放在引号内
- sql - 如何以特定格式插入日期时间
- python - 熊猫:TypeError:不可散列的类型:'list'
- c# - 获取 TraceTelemetry 以显示在 Application Insights 时间轴中
- lua - LUA|MTASA 尝试索引字段“?” (零值)
- c# - 如何在asp.net mvc5中操作ViewBag.Title中的文本
- c++ - [CURL][VS2017] 错误 LNK2019:未解析的外部符号 _curl_global_init 引用