【问题标题】:C# redrawing rectangles logicC#重绘矩形逻辑
【发布时间】:2012-03-14 06:26:47
【问题描述】:

这可能更多的是逻辑问题而不是语法问题,所以我不知道是否有人愿意提供帮助,但我有一个 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);
            }
        }

我需要查看当前矩形,如果下一个矩形更高,那么我知道宽度需要增加,但是当它到达低于当前高度的矩形时需要停止。一旦到达那个矩形,它就需要向后移动,以防它不是系列中的第一个矩形。

如果您对重新绘制矩形的更好方法有任何建议或想法,请告诉我。

【问题讨论】:

    标签: c# logic


    【解决方案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
    

    它是由原来的:

                      ___________ 
    ____              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
    

    等等。最终你会生成旋转的图案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2013-08-02
      • 1970-01-01
      相关资源
      最近更新 更多