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 :

Simuler un kaleidoscope


Sujet :

Mathématiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut Simuler un kaleidoscope
    Bonjour,

    Je voudrais développer un plugin de kaleidoscope pour un programme graphique gratuit.
    Une recherche sur 'kaleidoscope' m'a conduit sur un topic ancien et non terminé.
    Une recherche Google(ou autre) me mène sur des sites de math trop élévés en niveau.
    Il me faudrait des formules claires pour pourvoir les utiliser en programmation.

    J'arrive à découper une image en quartiers égaux.
    Maintenant, je bloque pour recopier un quartier choisi sur les autres. Et cerise sur le gâteau, la recopie doit être inversée, un quartier sur deux.

    Je découpe une image en 12 quartiers égaux (un cercle pour faire plus simple).
    Je nomme chaque quartier en tournant dans le sens des aiguilles d'une montre: A, B, C, D, E, F, G, H, I, J, K, L.
    Je choisi mon quartier modèle: A
    Je dois recopier chaque point de ce quartier A en pivotant selon le centre du cercle sur C, E, G, I, K
    Je dois recopier chaque point de ce quartier A en pivotant selon le centre du cercle et en inversant (symétrie) sur B, D, F, H, L.

    Merci de vos conseils...

    /MadJik

  2. #2
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Le plus simple et efficace serait de passer par openGL (ou direct 3d), les rotations c'est son boulot. Ou encore une lib 2d.

    Sinon, à la main, le concept est de parcourir chaque pixel de la surface de destination et de calculer les coordonnées correspondantes dans la surface d'origine pour obtenir la couleur à utiliser. Avec deux ou trois changements de repère et rotations ça doit se régler (tout particulièrement si on prend comme quartier originel celui du haut en veillant à ce que l'axe vertical passe en son milieu).

    http://fr.wikipedia.org/wiki/Rotation_vectorielle
    http://humbert-florent.developpez.co.../SDL/rotation/

  3. #3
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Utiliser une librairie graphique paraît sensé.
    Tout faire à la main n'est pas insensé.
    Il faut seulement connaître.
    Le passage coordonnées polaires --> coordonnées cartésiennes
    La matrice d'une rotation
    La matrice d'une symétrie axiale.
    La matrice d'une rotation d'angle a est:

    cos(a) -sin(a)
    sin(a) cos(a)

    A passe sur C par rotation d'angle pi/3
    A passe sur E par rotation d'angle 2pi/3
    etc...

    la matrice de la symétrie d'axe x'Ox est:

    1 0
    0 -1

    L s'obtient à partir de A par cette transformation.
    Puis B s'obtient à partir de L par la rotation d'angle pi/3 ret ainsi de suite

    Pour finir balayez le secteur A en coordonnées polaires soit pixel par pixel soit par taches en définissant un step dt pour l'angle theta et un step dr pour le rayon R.
    Vous aurez donc deux boucles imbriquées d'ordre R/dr et (pi/6)/dt fournissant des taches colorées que vous reproduirez dans les autres secteurs pixel par pixel en utilisant les transfos qui conviennent.

    NB: passage polaires cartésiennes:

    r, t ---> (r*cos(t), r*sin(t))
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  4. #4
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut
    Merci à vous deux, j'ai pu comprendre la "matrice" de rotation d'angle, y a plus qu'à mettre en application.
    ...et en effet, je ne peux pas (ou ne sais pas) utiliser de dll externe. Je pense que pour cette première version, je vais mettre les mains dans le camboui et compiler ces infos pour travailler pixel par pixel...

    /MadJik

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut
    Encore besoin de vos lumières...
    Voici où j'en suis arrivé dans ce projet:
    Modèle:

    Résultat (j'ai ajouté les lignes de séparations):


    Résultat visé (j'ai ajouté les lignes de séparations):


    Je bute sur le retournement du quartier "pair"...

    Des suggestions?
    /MadJik

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    ajouter des fruits sur la pâte

  7. #7
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    En prenant comme origine le centre de l'image.
    Si l'angle entre le quartier d'origine et celui affiché est alpha, et l'angle entre l'un des axes et le milieu du quartier d'origine est theta.

    La version sans symétrie doit faire Rotation(-alpha).
    Avec (il y a peut-être plus simple) ce pourrait être Rotation(-alpha) x Rotation(-theta) x Symétrie x Rotation(+theta)
    ou encore Rotation(-alpha-theta) x Symétrie x Rotation(+theta).
    Reste à faire attention au signe des angles. La matrice pour la symétrie aura une forme sympathique (donnée par Zavonen, le signe doit même être bon). Reste à multiplier les matrices pour avoir la formule finale.


    ... ce smiley a décidément un air de psychopathe... le genre qui carbure depuis trois jours au café

  8. #8
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    http://sprott.physics.wisc.edu/pickover/ekscop.html

    from l'université du Wisconsin. Rapidement, je pense que cela peut t'inspirer. Je me souviens de ce lien car j'y ai trouvé un merveilleux livre sur les kaléidoscopes écrit par Cozy Baker.

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

Discussions similaires

  1. Probleme Voyageur de Commerce - Recuit Simulé
    Par dinver dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/06/2009, 22h26
  2. Développpement d'une application de simulation .....
    Par dada5455 dans le forum OpenGL
    Réponses: 6
    Dernier message: 14/12/2003, 10h27
  3. simuler l'execution d'un message
    Par gaut dans le forum C
    Réponses: 14
    Dernier message: 24/07/2003, 23h01
  4. Simuler un coup de molette sur un memo...
    Par dynobremo dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/02/2003, 11h31
  5. Simulation de transmission de paquet entre différent réseaux
    Par MelloW dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 19h51

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