C # перерисовывает логику прямоугольников - PullRequest
1 голос
/ 14 марта 2012

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

список содержит случайный диапазон прямоугольников слева направо со случайной шириной и высотой, например,

                  ___________ 
____              l         l
l  l              l         l
l  l   ________   l         l
l  l___l      l   l         l
l  l   l      l___l         l
l__l___l______l___l_________l

Мне нужно повернуть прямоугольники, чтобы они выглядели следующим образом

                  ___________
____              l         l
l  l              l         l
l  l   ________   l         l
l__l___l______l   l         l
l_____________l___l_________l
l___________________________l

Так что я думаю, что самый простой способ сделать это - взять первый прямоугольник и сравнить его со следующим. Однако, когда я пытаюсь получить значения следующего прямоугольника, я застреваю, потому что я выхожу из диапазона возможных индексов

Это код для рисования оригинальных прямоугольников, который работает так, как это и задумано

Graphics RectangleGraphics = DrawingSurface;

            for (int x = 0; x < userInput; ++x)
            {
                int Height = myRectangleClass.genHeight();
                int Width = myRectangleClass.genWidth();
                RectangleGraphics.DrawRectangle(Pen, myRectangleClass.MyRectangle(startPositionX, (450 - Height), Width, Height));

                ReadWrite.writeOutput(startPositionX, (450 - Height), Width, Height);
                startPositionX = startPositionX + Width;
            }

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

Graphics RectangleGraphics = DrawingSurface;

        int previousX = 0;
        int width = 0;
        int height = 0;
        int xCoordinate = 0;
        int yCoordinate = 0;


        for (int i = 0; i < Rectangles.Count; ++i)
        {
            if ((Rectangles[i].X < Rectangles[i + 1].X) && (Rectangles[i].Height > Rectangles[i + 1].Height))
            {
                width = Rectangles[i].Width;
                height = Rectangles[i].Height - Rectangles[i + 1].Height;
                xCoordinate = Rectangles[i].X;
                yCoordinate = 250 - height;

                Rectangle DrawRec = myRectangleClass.MyRectangle(xCoordinate, yCoordinate, width, height);
                RectangleGraphics.DrawRectangle(Pen, DrawRec);
            }
        }

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

Если у вас есть предложения или идеи относительно лучшего способа перерисовать прямоугольники, пожалуйста, сообщите мне.

1 Ответ

0 голосов
/ 23 октября 2013

Вместо повторного использования прямоугольников путем их поворота легче рассматривать их как входные данные, которые используются для создания правильных выходных прямоугольников.

Другой способ сделать это проще - вырезать нужные прямоугольники, а не пытаться их построить.

Вот простой алгоритм. Сначала вам понадобится форма печенья, сделанная путем переворачивания вашего рисунка. Вот форма печенья:

____________________________
1  1  1       1   1_________1
1__1  1       1   1
   1  1       1   1
   1  1_______1   1
   1__1       1   1
              1___1

который был сформирован из оригинала:

                  ___________ 
____              l         l
l  l              l         l
l  l   ________   l         l
l  l___l      l   l         l
l  l   l      l___l         l
l__l___l______l___l_________l

Теперь начните с прямоугольника размером с всю вашу область

____________________________
1                           1
1                           1
1                           1
1                           1
1                           1
1                           1
1___________________________1

Возьмите самый высокий прямоугольник из фрезы:

              _____       
              1   1     
              1   1
              1   1
              1   1
              1   1
              1___1

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

____________________________
1             1###1         1
1             1###1         1
1     1       1###1    2    1
1             1###1         1
1             1###1         1
1_____________1###1_________1
1__________3________________1

Теперь у вас есть 3 прямоугольника на выходе.

Продолжайте, беря следующий самый большой прямоугольник из фрезы:

   ____ 
   1  1      
   1  1     
   1  1       
   1  1  
   1__1   

Вычислить, в каком выходном прямоугольнике он находится (он будет только в одном), и использовать его для деления этого прямоугольника:

____________________________
1  1##1       1###1         1
1  1##1       1###1         1
1  1##1       1###1         1
1  1##1       1###1         1
1__1##1_______1###1         1
1_____________1###1_________1
1___________________________1

И так далее. В конце концов вы будете генерировать повернутый шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...