Laden...

[gelöst] Gleichseitiges Rechteck (Quadrat) berechnen aus zwei beliebigen Punkten.

Erstellt von Zicore vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.153 Views
Z
Zicore Themenstarter:in
403 Beiträge seit 2007
vor 11 Jahren
[gelöst] Gleichseitiges Rechteck (Quadrat) berechnen aus zwei beliebigen Punkten.

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é

B
357 Beiträge seit 2010
vor 11 Jahren

Variablen überwachen und mal durchdebuggen? Irgendwo her muss die Verschiebung ja kommen und mit der Aufrufliste kann man dem schnell nachgehen.

Z
Zicore Themenstarter:in
403 Beiträge seit 2007
vor 11 Jahren

Ich kann garantieren das ausserhalb dieser Methode alles Einwandfrei ist 😃
Es liegt nur in dieser Berechnung.

49.485 Beiträge seit 2005
vor 11 Jahren

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

Z
Zicore Themenstarter:in
403 Beiträge seit 2007
vor 11 Jahren

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é

49.485 Beiträge seit 2005
vor 11 Jahren

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

Z
Zicore Themenstarter:in
403 Beiträge seit 2007
vor 11 Jahren

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 😉