2012-11-17 4 views
1

J'écris un programme de peinture qui utilise des formes pour dessiner en utilisant la fonction matrice. Tout va bien, mis à part le fait qu'il ne soit pas lisse du tout. Il y aura des lacunes dans la peinture si la souris est déplacée à grande vitesse.Actionscript 3 bitmapdata.draw avec un pinceau utilisant la matrice

J'ai regardé partout mais je n'ai pas trouvé de solution.

Le code ressemble fondamentalement ceci:

//Press mouse within container. Uses Matrix to draw instances of the brush. 
    private function handleMouseDown_drawContainer(e:MouseEvent):void 
    { 
      _matrix.identity(); 
      _matrix.translate(mouseX - 10, mouseY - 30); 
      _layout.bitmapData.draw(_layout.brush, _matrix); 

      _layout.drawContainer.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove_drawContainer); 
      _layout.drawContainer.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp_drawContainer) 

    } 

    //Move mouse within container. Uses Matrix to draw instances of the brush. 
    private function handleMouseMove_drawContainer(e:MouseEvent):void 
    { 
      _matrix.identity(); 
      _matrix.translate(mouseX - 10, mouseY - 30); 
      _layout.bitmapData.draw(_layout.brush, _matrix); 
    } 

Si quelqu'un pouvait me aider à comprendre comment lisser le dessin, je serais toujours reconnaissant! = p

Merci d'avance.

Répondre

0

Vous avez probablement besoin d'une sorte d'interpolation entre les positions de la souris ... il y a bien sûr plusieurs façons, je vais décrire une très facile à implémenter mais un peu difficile à affiner. Fondamentalement, au lieu de dessiner dans chaque position de la souris, vous utilisez une équation d'accélération qui suit la souris avec un certain retard ... de cette façon, la ligne décrite sera un peu plus lisse, et dessine quelques fois entre chaque position de la souris.
Ainsi, au lieu de faire (pseudocode):

onMouseMove { 
    draw(mouseX, mouseY); 
} 

Vous faites quelque chose comme:

x = 0; 
y = 0; 
onEnterFrame { 
    x += (mouseX - x) * 0.2; 
    y += (mouseY - y) * 0.2; 
    draw(x, y); 
} 

Bien que peut-être ce que vous avez vraiment besoin est un moyen de limiter la distance maximale entre les points, donc si la souris se déplace plus dans une image, vous interpolez les points entre les deux positions et dessinez autant de fois que nécessaire.
Ou si vous recherchez des lignes plus lisses (évitez les angles vifs), vous devrez peut-être également utiliser des béziers pour contrôler la ligne résultante.
De toute façon, tout dépend du type de dessin que vous recherchez.