【问题标题】:Split a rectangle like a mosaic像马赛克一样分割一个矩形
【发布时间】: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


【解决方案1】:

你没有给出代码或算法,只是要求“一些提示”,所以我在这里只给出一个广泛的想法。如果您希望我扩展这个想法,请展示您自己的更多作品。

如果n 的值(小矩形的数量)是一个合数(假设为n = a * b),那么您可以轻松地制作一个带有边ab 的大矩形,其中@ 987654325@ 小矩形。

如果n 是质数并且大于3,那么n-1 是合数。您可以用n-1 小矩形制作一个大矩形,然后将其中一个小矩形分割成更小的矩形。这基本上就是您在 n=3n=5 的示例中所做的。

请注意,不需要递归。当然,另一种可能性是通过n 绘制一个大小为1 的矩形,但这并不接近正方形。如果另一个目标是尽可能接近正方形,那么对于复合 n 在我的方法中,您还有一个额外的问题是找到尽可能靠近彼此的 ab。 (例如,如果 n 是 12,那么您可能需要 a=4b=3 而不是 a=2b=6。)我会把这个问题留给你。

【讨论】:

  • 是的,我写了一个算法,但它是 WinDev,我用法语写的,所以不太合适。感谢您的帮助,我今天下午将工作,我将向您展示我的工作(我只需要在软件上找到翻译功能)。谢谢道尔顿先生
  • 这是一个绝妙的主意!
【解决方案2】:

字符串:-“你好世界”

我在这里找到一个可行的解决方案是代码

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 中的 cmets 让你头疼(:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2011-08-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多