2013-03-14 2 views
0

J'ai actuellement un code qui redimensionne un rectangle basé sur le mouvement de la souris lorsque l'utilisateur clique sur plusieurs ancres qui correspondent aux zones suivantes: Gauche, Haut, Droite, Bas, TopLeft, TopRight, BottomLeft, BottomRight.Redimensionnement d'un rectangle et accrochage à un taux fixe

Ainsi, l'utilisateur peut cliquer et faire glisser l'ancre supérieure et ajustera la coordonnée supérieure du rectangle en fonction de l'emplacement de la souris. Pareil pour tous les autres ancres. Après le fait je veux imposer un rapport fixe (tel que 2: 3 ou 5: 7) en accrochant les côtés appropriés du rectangle basé sur l'action. Je l'ai fait pour les ancres Left, Top, Right et Bottom parce que c'est facile, si je redimensionne la largeur, j'ai juste besoin d'auto-dimensionner la hauteur en fonction du ratio, et vice-versa. La difficulté que j'ai est quand l'utilisateur est en train de glisser un coin tel que l'ancre en bas à droite ou en haut à gauche. J'ai besoin de comprendre comment choisir le côté à enclencher. J'ai la coordonnée de la souris et la gauche, le haut, la droite et le bas du rectangle.

Voici le code que j'ai essayé:

case Anchor.BottomRight: 
    float maxRight = CursorPosition.X; 
    float maxBottom = CursorPosition.Y; 

    float newRight = Bounds.Left + (Bounds.Width * widthRatio); 
    float newBottom = Bounds.Top + (Bounds.Height * heightRatio); 

    if (newRight < maxRight) 
    { 
     Width = Height * widthRatio; 
    } 
    else 
    { 
     Height = Width * heightRatio; 
    } 

    break; 

Dans un exemple d'un rapport fixe de 2: 3 la widthRatio serait 0,666 et heightRatio serait 1,5.

Ce code fonctionne la moitié du temps, mais bien sûr, il s'agit essentiellement d'une chance de travailler 50/50. Je dois identifier une condition appropriée pour casser la largeur ou la taille.

Répondre

1

Je l'ai compris.

if (Height * widthRatio <= Width) 
    Width = Height * widthRatio; 
else if (Width * heightRatio <= Height) 
    Height = Width * heightRatio; 

Ceci émulera la fonctionnalité dans Photoshop avec un rapport fixe.

+0

Super! Que se passe-t-il si cela ne convient pas à l'un ou l'autre cas? Alors c'est déjà convenablement en ratio? –

+0

C'est correct. –

0

Juste accrochage à celui qui a le rapport le plus élevé. Celui qui est le plus grand devrait conduire la forme du rectangle. Assurez-vous d'attraper tous les cas - à la fois> 1, à la fois < 1, et l'un ou l'autre:

bool calcHeight; 
if (widthRatio >= 1 && heightRatio >=1) 
{ 
    calcHeight= (widthRatio > heightRatio); 
} 
else if (widthRatio < 1 && heightRatio < 1) 
{ 
    calcHeight= (widthRatio < heightRatio); // because the width change is "bigger" 
} 
else if (widthRatio >= 1) 
{ 
    calcHeight= (widthRatio > (1.0/heightRatio)); // get them both > 1 
} 
else 
{ 
    calcHeight= (widthRatio < (1.0/heightRatio)); // get them both < 1 
} 

if (calcHeight) 
{ 
    Height = Width * heightRatio; 
} else { 
    Width = Height * widthRatio; 
} 

Bien sûr, cela suppose que je savais ce que vous parlez de vos rapports. Je supposais que c'est le rapport de l'ancienne longueur (ou largeur) à la nouvelle longueur (ou largeur).

Une chose que je recommanderais très fortement est - forcez la contrainte de rapport d'aspect pendant que l'utilisateur glisse votre ancre, pas quand ils la placent. Si vous faites cela, la sensation sera beaucoup plus intuitive pour l'utilisateur.

+0

Il s'agit toujours uniquement de l'alignement d'un côté. Je veux qu'il se casse en fonction de la largeur ou de la hauteur en fonction de l'emplacement de la souris. Un exemple est comment l'outil Rectangle Marquee fonctionne dans Photoshop avec un rapport fixe. –

Questions connexes