Hallo zusammen,
ein Rechteck zu berechnen aus zwei beliebigen Punkten funktioniert soweit.
Wenn ich allerdings versuche beide Seiten gleich zu setzen, verschiebt sich augenscheinlich x und y.
Hat von euch einer eine Idee das elegant zu lösen ?
Ich beisse mir daran schon die Zähne aus und verliere den Überblick.
Ziel ist es ein Rechteck, wie in Paint gleichseitig zu zeichnen, indem während des Zeichenvorgangs Shift gedrückt hält.
public static RectangleF CalculateRect(PointF p, PointF p2,bool shiftDown)
{
float x = Math.Min(p.X, p2.X); // Punkt X
float y = Math.Min(p.Y, p2.Y); // Punkt Y
float w = Math.Max(p.X, p2.X) - Math.Min(p.X, p2.X); // Breite
float h = Math.Max(p.Y, p2.Y) - Math.Min(p.Y, p2.Y); // Höhe
if (shiftDown)
{
if (w > h)
{
h = w;
}
else
{
w = h;
}
}
RectangleF r = new RectangleF(x,y,w,h);
return r;
}
André
Variablen überwachen und mal durchdebuggen? Irgendwo her muss die Verschiebung ja kommen und mit der Aufrufliste kann man dem schnell nachgehen.
Ich kann garantieren das ausserhalb dieser Methode alles Einwandfrei ist 😃
Es liegt nur in dieser Berechnung.
Hallo TheGear,
verschiebt sich augenscheinlich x und y.
Was heißt das konkret? In welcher Weise verschiebt sich da was?
float w = Math.Max(p.X, p2.X) - Math.Min(p.X, p2.X);
BTW: Einfacher wäre wohl:
float w = Math.Abs(p.X - p2.X);
Ich kann garantieren das ausserhalb dieser Methode alles Einwandfrei ist 😃
so eine Garantie würde ich nie geben. Und ich finde es auch gefährlich, bestimmte Stellen so absolut/garantiert auszuschließen. Natürlich muss man versuchen, den Fehler einzugrenzen, aber wenn man dabei feststellt, dass er an der Stelle, auf die man eingegrenzt hat, doch nicht liegt, sollte man die vorher ausgeschlossen Stellen doch wieder ins Visier nehmen.
herbivore
Hallo,
wenn man ein Rechteck bei Paint von rechts-oben nach links-unten zieht und dabei shift gedrückt hält ist der Ursprung rechts-oben.
Wenn man das ganze nun nach rechts-unten, zieht soll der Ursprung links-oben sein.
Dieses Verhalten würde ich erwarten.
Und das funktioniert auch solange beide Seiten nicht gleich gesetzt werden.
Wenn ich beide Seiten auf den Wert des kleineren der beiden Seiten setze, verschiebt sich plötzlich das komplette Reckteck, wenn ich von rechts-oben nach links-unten ziehe.
André
Hallo TheGear,
deine Formeln sind auch darauf ausgelegt, dass der Ursprung links oben ist. Wenn der Ursprung auch rechts oben sein soll, musst du sie umstellen.
Das sollte kein Problem sein, weil wir hier über einfache geometrische Zusammenhänge reden und die zudem mit lediglich zwei der Grundrechenarten ausdrücken lassen.
herbivore
Gelöst mit:
public static RectangleF CalculateRect(PointF p, PointF p2, bool shiftDown)
{
bool vx = p2.X < p.X; //Vorzeichen merken
bool vy = p2.Y < p.Y; //Vorzeichen merken
float x = p.X; // Punkt X
float y = p.Y; // Punkt Y
float w = Math.Abs(p.X - p2.X); // Breite ohne Vorzeichen
float h = Math.Abs(p.Y - p2.Y); // Höhe ohne Vorzeichen
if (shiftDown)
{
if (w < h)
{
h = w;
}
else
{
w = h;
}
}
if (vx)
{
x -= w;
}
if (vy)
{
y -= h;
}
RectangleF r = new RectangleF(x, y, w, h);
return r;
}
Dank an Jano 😉