2012-03-28 4 views
1

Können sagen, ich habe ein XNA Rechteck mitClamp Rechteck innen größer Rechteck

X = 0, Y = 0, Width = 25, Height = 25. 

Was ich will, ist ein Verfahren, ein weiteres Rechteck innen zu klemmen, so dass das kleineren Rechteck nie ‚Blätter‘ die Grenzen des größeren .

Zum Beispiel, wenn ich ein neues Rechteck machen mit:

X = 23, Y = 20, Width = 10, Height = 10, 

mag ich die Methode ein Rechteck zurück mit:

X = 23, Y = 20, Width = 2, Height = 5. 

Auch, wenn ich ein neues Rechteck machen mit:

X = -8, Y = 8, Width = 10, = 10, 

ich möchte, dass die Methode ein Rechteck zurück mit:

X = 0, Y = 8, Width = 2, Height = 10. 

In der Zwischenzeit habe ich die Klemm zu arbeiten. Dennoch, es ist eine Menge hässlichen Code, so die neue Frage ist, wie kann ich das vereinfachen?

if (SelectionRectangle.X < 0) 
     { 
      SelectionRectangle.Width = SelectionRectangle.Width + SelectionRectangle.X; 
      SelectionRectangle.X = 0; 
     } 
     if (SelectionRectangle.X + SelectionRectangle.Width > tileset.Width) 
     { 
      if (SelectionRectangle.X > tileset.Width) 
      { 
       SelectionRectangle.X = tileset.Width; 
       SelectionRectangle.Width = 0; 
      } 
      else 
      { 
       SelectionRectangle.Width = tileset.Width - SelectionRectangle.X; 
      } 
     } 
     if (SelectionRectangle.Y < 0) 
     { 
      SelectionRectangle.Height = SelectionRectangle.Height + SelectionRectangle.Y; 
      SelectionRectangle.Y = 0; 
     } 
     if (SelectionRectangle.Y + SelectionRectangle.Height > tileset.Height) 
     { 
      if (SelectionRectangle.Y > tileset.Height) 
      { 
       SelectionRectangle.Y = tileset.Height; 
       SelectionRectangle.Height = 0; 
      } 
      else 
      { 
       SelectionRectangle.Height = tileset.Height - SelectionRectangle.Y; 
      } 
     } 
+0

Können Sie uns zeigen, was Sie probiert haben? Der Code, den du geschrieben hast, warum hat es nicht funktioniert, was war dein Problem? – TJHeuvel

+0

können Sie uns bitte zeigen, wo Sie die Klemme anbringen? –

Antwort

2

Ist das nicht nur Rectangle.Intersect?

Erstellt ein Rechteck, das den Bereich definiert, in dem ein Rechteck ein anderes Rechteck überlappt.

Wenn das kleinere Rechteck vollständig innerhalb des größeren Rechtecks ​​liegt, entspricht der Schnittpunkt dem kleineren Rechteck. Wenn sich das kleinere Rechteck außerhalb des größeren Rechtecks ​​erstreckt, wird dieser Teil nicht zurückgegeben.

+0

Eigentlich habe ich diese Methode in den letzten zwei Jahren übersehen. Vielen Dank – Taelia

0

Wie wäre es etwa so:

Rectangle clamp(Rectangle smaller, Rectangle larger) 
    { 
     Rectangle ret; 
     ret.X = Math.Max(smaller.X, larger.X); 
     ret.Y = Math.Max(smaller.Y, larger.Y); 
     ret.Width = Math.Min(smaller.X + smaller.Width, larger.X + larger.Width) - ret.X; 
     ret.Height = Math.Min(smaller.Y + smaller.Height, larger.Y + larger.Height) - ret.Y; 
     return ret; 
    } 
0
private void ClampRectangle(Rectangle outside, Rectangle inside) { 
    if(inside.left < outside.left) { 
     inside.width -= outside.left - inside.left; 
     inside.left = outside.left 
    } 
    if(inside.right > outside.right) { 
     inside.width -= inside.right - outside.right; 
    } 
    if(inside.top < outside.top) { 
     inside.height -= outside.top - inside.top; 
     inside.top = outside.top; 
    } 
    if(inside.bottom > outside.bottom) { 
     inside.height -= inside.height - outside.height; 
    } 
} 

Ich tippte nur den Code hier, also auf Rechtschreibfehler überprüfen.
Ich bin mir nicht sicher, ob die Eigenschaften mit Großbuchstaben sind oder nicht (Höhe/Höhe ...)

+0

Aber was, wenn innen. Rechts = 23, außen. Rechts = 25, und innen. Breite = sagen, 15? – Taelia

+0

Die 'richtige' = linke Grenze + Breite, also wenn die Innenseite.Recht GroundZero