SelectionBox mit festen Seitenverhältnis programmieren



  • Hallo!

    Ich versuche derzeit eine Art SelectionBox zu programmieren, bei der ein festes Seitenverhältnis erzwungen wird.

    F---------------------+
    |                     m
    |                     m
    |                     m
    |      ^           <- m -> Bewegung
    |      |              m
    +mmmmmmmmmmmmmmmmmmmmmM
           |
           v
       Bewegung
    

    Das hier ist die beispielhafte Box, so wie sie jetzt ist.
    Ausgehend vom Punkt F wurde sie aufgezogen, bis zum Punkt M, an dem sich die Maus befindet. Mein Wunsch ist es jetzt, dass ich die Maus entlang dem mit "m" gekennzeichneten Rand bewegen kann und sich die Box proportional anpasst (z.B. im Verhältnis Breite/Höhe = 4/3).

    Das habe ich auch noch hinbekommen, mit einem Code der in etwa so aussieht:

    int deltaX = MauspositionX - AlteMauspositionX;
    int deltaY = MauspositionY - AlteMauspositionY;
    
    // Die Seite der Box, dessen Größe "stärker" verändert wurde, bleibt erhalten
    // Die andere Seite wird angepasst
    if(deltaX > deltaY)
    {
    	Box_X_Ende = Box_X_Start + neue Breite;
    
            // Höhe der Box wird proportional angepasst
    	Box_Y_Ende = Box_Y_Start + neue Breite / aspectX * aspectY;
    }
    else
    {
    	Box_Y_ende = Box_Y_Start + neue Höhe;
    
            // Breite der Box wird porportional angepasst
    	Box_X_Ende = Box_X_Start + neue Höhe / aspectY * aspectX;
    }
    

    Das funkioniert auch soweit supergut, allerdings nur in einem, und zwar dem vierten Qudranten! Hier noch eine Skizze zur Verdeutlichung:

    |
                    |
             II     |     I
                    |
    ----------------F----------------> X
                    |
             III    |    IV: In diesem Bereich darf sich die Maus befinden
                    |    
                    |
                    v
                    Y
    

    Ich möchte jetzt aber, dass ich genau dieses Verhalten über alle Quadranten hinweg nutzen kann! Allerdings habe ich das bisher noch nicht hinbekommen und wäre über Lösungsansätze, evtl. Pseudocode echt dankbar.

    Hoffentlich lässt es sich einigermaßen nachvollziehen. 🙂

    Danke im Voraus!


Anmelden zum Antworten