首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >像马赛克一样分割长方形

像马赛克一样分割长方形
EN

Stack Overflow用户
提问于 2018-06-11 09:52:03
回答 2查看 132关注 0票数 0

从昨天开始,我试着构建一个函数,它可以像下面这样划分一个矩形:

N=1

代码语言:javascript
复制
 ____________
|            |
|____________|

N=2

代码语言:javascript
复制
 ____________
|____________|
|____________|

N=3

代码语言:javascript
复制
 ____________
|______|_____|
|____________|

N=4

代码语言:javascript
复制
 ____________
|______|_____|
|______|_____|

N=5

代码语言:javascript
复制
 ____________
|__ |__|_____|
|______|_____|

我搜索过但没有找到任何算法名。最后,我想要一个类似于每个矩形(x,y,Long,larg)的数组。我认为这是递归的,只有2的除法,但是.我还没有找到解决问题的办法。因此,如果您有一些提示给我(不是完整的代码),我会非常感激的。

对不起,如果我的英语不好,如果你想要一些精度,不要犹豫。

拉斐尔

编辑:

N=5更像是:

代码语言:javascript
复制
    ____________
   |______|     |
   |______|_____|
   |______|_____|

编辑2:这是我一直工作到8次分离的代码

代码语言:javascript
复制
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中,注释有一个奇怪的黄色背景,让我头疼.所以我为你翻译了一部分英文。

提前谢谢,祝你今天愉快

拉斐尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-13 08:57:38

字符串:-“你好世界”

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

代码语言:javascript
复制
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“函数

代码语言:javascript
复制
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中的评论会让您头痛(:

票数 0
EN

Stack Overflow用户

发布于 2018-06-11 10:00:18

你没有给出任何代码或算法,只需要“一些提示”,所以我在这里给出一个大致的想法。如果你想让我扩展这个想法,展示更多你自己的作品。

如果您的n值,即小矩形的数量,是一个复合数字(例如n = a * b),那么您可以很容易地生成一个边为ab的大矩形,其中包含n小矩形。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50794919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档