Franchement, je ferais le truc suivant : découper l'espcace en quatre quadrants (haut bas droite gauche), et naviguer vers la fenêtre la plus proche dans le quadrant correspondant au déplacement. Quelque chose comme (sans les pointeurs nus dégueus):
Widget * current = get_current_widget();
Widget * next = NULL;
vector<Widget *> all_windows;
int direction = 1; // 1, 2, 3, or 4
for (auto ww = all_windows.begin(); ww != all_windows.end(); w++) {
bool keep = false;
double angle = arccos(/* bla bla, don't forget the sign */);
switch(direction) { // first, keep the widget only if it is in the good quadrant
case 1: // say, right
if ((angle > 7*pi/4) || (angle < pi/4)) {
keep = true;
break;
case 2:
/* etc */
}
if (keep) { // Then, select the closest one
if (next == NULL)
next = ww;
else {
if (dist (current, ww) < dist(current, next)) // if necessary: in case of equality, choose according to some stable criterion
next = ww;
}
}
}
Bon, après, il faudrait vérifier si c'est intuitif. En cas d'égalité, il faut choisir toujours le même, quelle que soit la règle (histoire d'avoir de la cohérence dans l'interface).
Ça me semble vachement plus simple que les autres solutions envisagées.
# Algo simple
Posté par arnaudus . En réponse au journal Les artistes, ce fléau ou l'invasion des profanateurs de GUI. Évalué à 7.
Franchement, je ferais le truc suivant : découper l'espcace en quatre quadrants (haut bas droite gauche), et naviguer vers la fenêtre la plus proche dans le quadrant correspondant au déplacement. Quelque chose comme (sans les pointeurs nus dégueus):
Bon, après, il faudrait vérifier si c'est intuitif. En cas d'égalité, il faut choisir toujours le même, quelle que soit la règle (histoire d'avoir de la cohérence dans l'interface).
Ça me semble vachement plus simple que les autres solutions envisagées.