Définition d'une action de dessin

Définition d'une action de dessin - Algo - Programmation

Marsh Posté le 27-02-2009 à 14:59:28    

Bonjour,
 
Je réalise un éditeur d'icone qui dessine sur une image pixel par pixel (c++ / Qt4). Mon problème se situe sur le système de undo/redo. L'application doit-être capable d'annuler ou refaire une action/commande. Aujourd'hui je le gère comme ça et ce n'est pas top niveau performance :
 
Je choisis l'outil "pen"
Je clic sur le dessin (reste appuyé) // Création d'un objet command (command est un objet qui contient une liste de points). J'ajoute le point dans la liste.
Je me déplace sur la zone de dessin. // J'enregistre chaque point dans la liste de mon objet command
Je relache le bouton de la souris. // J'arrête l'ajout de points et je stock mon objet command dans une liste
 
Sur l'évenement paintEvent de mon composant graphique, je parcours toutes mes commandes
Et pour chaque commande, je dessine tous ses points.
 
... ça fonctionne mais c'est lourd :(
 
L'avantage, c'est que si je retire une action/commande de la liste, l'action n'est pas dessiné.
 
Mon problème est de définir une action/commande. Actuellement c'est une liste de point mais je cherche une meilleur solution. J'avais commencé à gérer une action/commande sur une QImage différente (QImage est objet représentant une image dans Qt), mais ça me semblait un peu démesurer comme solution.
 
Merci de m'avoir lu !

Reply

Marsh Posté le 27-02-2009 à 14:59:28   

Reply

Marsh Posté le 27-02-2009 à 17:04:19    

c'ets lourd = c'ets deja lent ou ca te plait pas a priori ?

Reply

Marsh Posté le 27-02-2009 à 19:32:23    

Joel F a écrit :

c'ets lourd = c'ets deja lent ou ca te plait pas a priori ?


Si j'ai bien compris ce qu'il fait, à chaque redraw il redéroule tout l'historique des modifications, ça peut vite devenir lent.

 

Pour le pb, bah il me semble que le plus simple c'est déja d'avoir une structure de donnée type tableau de pixels (un QImage en fait), que tu puisse lire directement pendant ton paintEvent. Ensuite dans tes commande, au lieu de faire une liste de "nouvelle couleur du point", tu fait une liste de paires "ancienne couleur du point + nouvelle couleur du point", comme ça quand tu veut faire un undo, tu utilise la valeur "ancienne couleur" pour modifier ton tableau de pixels, quand tu veut faire un redo tu utilise la nouvelle couleur.

Message cité 1 fois
Message édité par 0x90 le 27-02-2009 à 19:32:56

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 28-02-2009 à 11:55:35    

Effectivement, je reparcours tout l'historique pour dessiner sur mon image. Pour répondre à Joel F, c'est lourd et ça me plait pas trop :(
Je pensais limiter le nombre d'actions à un nombre définit en paramètre et écrire les n-monombred'actionmax dernières actions définitivement dans l'image, mais si une autre solution existe, je la prend.

 

Si j'ai bien compris t'as solution 0x90,
Ma commande serait constitué d'un point (coord sur l'image), de la couleur de ce point et de l'ancienne couleur. Et lors du undo, je redessine la dernière commande mais avec l'ancienne couleur. Ai-je bien compris ? L'idée me plait assez :)

 

Merci


Message édité par alexandre_j le 28-02-2009 à 11:56:49
Reply

Marsh Posté le 28-02-2009 à 12:47:36    

0x90 a écrit :

Ensuite dans tes commande, au lieu de faire une liste de "nouvelle couleur du point", tu fait une liste de paires "ancienne couleur du point + nouvelle couleur du point", comme ça quand tu veut faire un undo, tu utilise la valeur "ancienne couleur" pour modifier ton tableau de pixels, quand tu veut faire un redo tu utilise la nouvelle couleur.


Le même système qu'un repo svn ou mercurial quoi :D


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed