Разделить прямоугольник как мозаику - PullRequest
0 голосов
/ 11 июня 2018

Со вчерашнего дня я пытаюсь создать функцию, которая делит прямоугольник следующим образом:

n = 1

 ____________
|            |
|____________|

n = 2

 ____________
|____________|
|____________|

n =3

 ____________
|______|_____|
|____________|

n = 4

 ____________
|______|_____|
|______|_____|

n = 5

 ____________
|__ |__|_____|
|______|_____|

Я нашел, но не нашел ни одного имени алгоритма.В конце я хочу что-то вроде массива с (x, y, Long, larg) каждого прямоугольника.Я думаю, что это что-то рекурсивное с несколькими делениями на 2, но ... я не нашел решения своей проблемы.Так что, если у вас есть только несколько советов для меня (не весь код), я буду очень признателен.

Извините, если мой английский плохой, если вы хотите немного точности, не стесняйтесь.

Raph.

РЕДАКТИРОВАТЬ:

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 комментарии находятся в странном желтом фоне и вызывают головную боль ... Поэтому я перевожу его частично на английский для вас.

Заранее спасибо, естьхороший день

Raph.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

строка: - «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 доставят вам хорошую головную боль (:

0 голосов
/ 11 июня 2018

Вы не даете ни кода, ни алгоритма, а просто спрашиваете «несколько советов», поэтому я просто дам вам общее представление.Если вы хотите, чтобы я развил эту идею, покажите больше вашей собственной работы.

Если ваше значение 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.) Я оставлю эту проблему вам.

...