IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Range sur un Rectangle + rotation


Sujet :

Mathématiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Par défaut Range sur un Rectangle + rotation
    Salut,

    Je sais pas si je suis au bon endroit, ni si le terme «Range» est très approprié. :p

    Voici mon problème.

    Je suis occupé de bosser sur un éditeur (d'album photos) en Flash, et je m'attaque à la partie limite des images sur une page.

    Je souhaiterai arriver à créer une méthode permet de me retourner un rectangle (== une image) qui soit toujours contenu dans un autre rectangle (== la page).

    à priori rien de très compliqué, seulement on peut effectuer une rotation sur l'image (dont le centre est le coins supérieur droit de l'image), là je commence à m'arracher les cheveux.

    Pour le moment je pars sur la solution suivante :
    • Tracer la zone (un rectangle sans rotation) occupé par l'image.
    .

    • Ensuite tester si ce rectangle est contenu dans la Zone évitable (la page).
    • Si oui, c'est super la méthode renvoi le rectangle d'origine.
    • Si non, calculer la nouvelle position/taille de l'image.

    Je coince sur deux points :
    • Calculer le rectangle de la zone occupé par l'image.
    • Calculer un nouveau rectangle qui entre dans la page.

    Toutes les pistes sont les bienvenue.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    • Calculer la rotation des 4 sommets
    • En déduire le rectangle final
    • Tester par rapport a rectangle de la page
    • Ajuster


  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut calculer la hauteur et la largeur du rectangle englobant aligné sur les axe est facile a partir de l'angle de rotation et de la hauteur largeur du rectangle initiale rotationné, c'est de la trigonométrie de base.

    Une fois que tu as cette hauteur et cette largeur, tu fais le rapport hauteur de la page / hauteur de la zone et largeur de la page/ largeur de la zone. Si le plus petit des 2 rapport est inferieur a 1, il te suffit de scaler le rectangle rotationné de ce rapport pour le faire rentrer dans la page.

    Ca ca marche uniquement si le rectangle n'est pas translaté. S'il peut etre translaté il y a une petite étape supplémentaire à faire.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Par défaut
    Salut et merci

    Effectivement le triangle peut-être translaté.

    Je suis arrivé jusqu'au calcule le rectangle de la zone du rectangle roté inscris dans la page.

    Là où je bloque c'est pour définir la nouvelle largeur/hauteur du rectangle dans cette zone.

    Je joints un petit fichier swf du résultat actuel.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut. J'ai regardé ton appli. Voila comment tu pourrais faire. En fait tu as conservation du rapport des distance entre ton rectangle englobant et ton rectangle orienté (thales). Si on part du principe que le scale de ton rectangle conserve le point d'origine en haut a gauche, Il te suffit de regarder pour les quatre cotés quel est le rapport de scale a appliquer (en utilisant le rectangle englobant) pour que le rectangle orienté rentre dans la zone.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    // (x0,y0) est le point d'origine du rectangle orienté
    // zoneXMax est la coordonée max de la zone en x
    // xMax est la coordonée max du rectangle englobant en x
    // ...
     
    // On regarde les scale necessaires de chaques cotés + test pour eviter les cas particuliers qui entraine des divisions par zero
    // le cas particulier est setté a l'infini (enfin ce sera plutot valeur_max en pratique) comme ca il ne pertube pas la recherche de minimum
    scaleXMin = xMin = x0 ? INFINI : (zoneXMin - x0) / (xMin - x0)
    scaleXMax = xMax = x0 ? INFINI : (zoneXMax - x0) / (xMax - x0)
    scaleYMin = yMin = y0 ? INFINI : (zoneYMin - x0) / (yMin - x0)
    scaleYMax = yMax = y0 ? INFINI : (zoneYMax - x0) / (yMax - x0)
     
    // On prend le plus petit scale qui permet de faire rentrer entierement le rectangle
    scale = min(scaleXMax,scaleXMin,scaleYMax,scaleYMin)
     
    // le rapport peut tres bien etre superieur a 1 (si le rectangle ne sors pas de la zone) mais on veut pas occuper le maximum de la zone mais juste empecher que le rectangle ne sorte, alors on scale uniquement si le rectangle sort d'un coté
    si scale < 1
        scaleOrientatedRectangle(scale,scale)
    Voila un truc dans le style devrait marcher. J'espere que je me suis pas trop mal exprimer
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Par défaut
    Merci,

    Je suis enfin arrivé à bout du problème.

    Je suis resté sur une base purement trigonométrique.

    • Calcule de la zone occupé (dit A) par le rectangle de référence (dit R).
    • Calcule de l'intersection entre la page (dit P) et ce rectangle (dit a).
    • Ensuite calcules des ratios :
    --> largeur a / largeur A.
    --> hauteur a / hauteur A.
    --> longueur du segment qui part du sommet (même angle que la largeur de R) jusqu'au point de croisement avec a / largeur R.
    --> longueur du segment qui part du sommet (même angle que la longueur de R) jusqu'au point de croisement avec a / longueur R.
    • Récupération du plus petit ratio.
    • r.width = R.width*ratio; r.height = R. height*ratio;

    Emballer, c'est pesé!

    Je vous joints le code sources pour ceux que ça intéresse.
    Fichiers attachés Fichiers attachés

  7. #7
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!

    Si je t'ai bien compris, tu as un rectangle OPQR (l'espace disponible sur ta page), avec O(0,0), P(xp,0), Q(xp,yr) et R(0,yr) et un rectangle ABCD (ta photo), avec A(xa,ya), B(xb,yb), C(xc,yc) et D(xd,yd). Si j'en crois ta figure, tu imposes les conditions
    xa=0
    yb=0
    xc=xp
    yd=yr
    ya+yc=yr
    xb+xd=xp
    Est-ce bien le cas?

    Si oui, ton problème peut être résolu par une suite de 3 transformations géométriques élémentaires:
    1. une translation pour amener le sommet A sur l'origine O;
    2. une rotation pour amener la droite AB sur l'axe OP;
    3. une homothétie pour amener les sommets B, C et D sur P, Q et R.


    Si non, tu as le choix entre deux facteurs d'échelle, un pour les abscisses et un autre pour les ordonnées. Si tu prends ces deux facteurs, tu déformes ta photo, ce qui n'est pas le but. Tu dois donc choisir le plus petit comme rapport d'homothétie.

    Jean-Marc Blanc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bordure degrade sur un rectangle
    Par Fynchi dans le forum Windows Forms
    Réponses: 6
    Dernier message: 28/11/2007, 19h05
  2. problème de collision sur objet en rotation
    Par filiplj dans le forum ODE
    Réponses: 2
    Dernier message: 21/08/2007, 16h00
  3. Questions sur la fonction Rotate
    Par emilieGre dans le forum Images
    Réponses: 5
    Dernier message: 16/08/2007, 13h18
  4. Evolution des grades et rangs sur le forum
    Par lucky31 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 09/05/2006, 18h27
  5. Mettre une info bulle Tooltiptext sur un rectangle?
    Par danje dans le forum Graphisme
    Réponses: 7
    Dernier message: 21/11/2005, 09h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo