2012-03-14 4 views
1

cela peut être plus une question de logique que de syntaxe, donc je ne sais pas si quelqu'un serait prêt à aider mais j'ai une liste de type Rectangle que j'ai besoin de boucler et de passer à travers.C# redessiner les rectangles logiques

la liste contient une plage aléatoire de rectangles de gauche à droite avec des largeurs et hauteurs aléatoires, par ex.

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

J'ai besoin de faire tourner les rectangles afin qu'ils ressemblent à ce qui suit

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

donc je pense que le moyen le plus simple est de prendre le premier rectangle et le comparer à le prochain le long. Cependant, lorsque je tente d'obtenir les valeurs du prochain rectangle le long je reste bloqué parce que je vais la gamme des indices possibles

Voici le code pour dessiner les rectangles originaux qui fonctionne comme il est censé

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; 
      } 

Je tente d'utiliser le code suivant pour faire tourner les rectangles tout en conservant la même forme mais je reçois de toute évidence des erreurs de portée

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); 
      } 
     } 

je dois regarder le rectangle en cours, si le prochain les rectangles sont plus élevés alors je connais le widt h doit augmenter mais il doit s'arrêter quand il atteint un rectangle inférieur à sa hauteur actuelle. Une fois qu'il atteint ce rectangle, il doit revenir en arrière et ne pas être le premier rectangle de la série.

Si vous avez des suggestions ou des idées sur une meilleure façon de redessiner les rectangles s'il vous plaît faites le moi savoir.

Répondre

0

Plutôt que de réutiliser les rectangles en les faisant pivoter, il est plus facile de les traiter comme des entrées qui sont utilisées pour générer les rectangles de sortie corrects.

Une autre façon de simplifier est de couper les rectangles désirés plutôt que d'essayer de les construire.

Voici un algorithme simple. D'abord vous aurez besoin d'une forme de biscuit faite en inversant votre modèle. Voici la forme de coupe cookie:

____________________________ 
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 

qui a été formé à partir de l'original:

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

Maintenant commencer par un rectangle de la taille de votre zone entière

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

Prenez le rectangle le plus haut de le coupeur:

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

Utilisez-le pour diviser le grand rectangle comme celui-ci:

____________________________ 
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 

Maintenant vous avez 3 rectangles dans votre sortie.

Continuer en prenant le rectangle suivant le plus grand de la fraise:

____ 
    1 1  
    1 1  
    1 1  
    1 1 
    1__1 

Calculer qui rectangle sortie est en (il ne sera en un) et l'utiliser pour diviser ce rectangle:

____________________________ 
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 

Et ainsi de suite. Finalement, vous allez générer le motif pivoté.