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

2D Java Discussion :

lissage d'une courbe + masquage


Sujet :

2D Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 96
    Points : 32
    Points
    32
    Par défaut lissage d'une courbe + masquage
    Bonjour

    Mon but est de cree l'illusion d''un decor destructible, pour cela mon idee est de supperposer 2 images l'une en tant que fond l'autre comme decor a proprement parler.

    par exemple une maison (décor) avec un ciel bleu (fond).

    La destruction d'une partie du toit serait crée par la modification du contour du toit d'aprés certain points generes aleatoirement. Puis la modification de la transparence de la zone correspondant aux parties detruites revelera le fond.

    Mais j'aimerais pouvoir avoir des formes arrondis.

    Existe il une fonction qui fasse cela sachant que ce que je manipule un type point definit par un ensemble de coordonnees ?


    PS: si quelqu'un voit une meilleur façon de faire.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 872
    Points : 22 939
    Points
    22 939
    Billets dans le blog
    53
    Par défaut
    En gros tu voudrais coder une espece de Worms en Java ?

    Tu peux aller voir du cote de la composite AlphaComposite.SrcIn et la forme Area, par exemple :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    /**
     *
     * @author fabriceb
     */
    public class Main extends JComponent {
     
        private LinearGradientPaint skyGradient = new LinearGradientPaint(0, 0, 0, 500, new float[]{0.6f, 0.98f, 1f}, new Color[]{Color.BLUE, Color.CYAN, Color.WHITE});
        private LinearGradientPaint houseTexture = new LinearGradientPaint(0, 0, 0, 500, new float[]{0f, 1f}, new Color[]{Color.ORANGE, Color.YELLOW});
        private Color transparent = new Color(0, 0, 0, 0);
        private BufferedImage offscreenImage = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
     
        public Main() {
            setPreferredSize(new Dimension(500, 500));
            setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
            updateImage();
            addMouseListener(new MouseAdapter() {
     
                /**
                 * {@inheritDoc}
                 */
                @Override
                public void mouseClicked(MouseEvent event) {
                    int x = event.getX();
                    int y = event.getY();
                    mask.subtract(new Area(new Ellipse2D.Float(x - 25, y - 25, 50, 50)));
                    updateImage();
                    repaint();
                }
            });
            addMouseMotionListener(new MouseMotionAdapter() {
     
                /**
                 * {@inheritDoc}
                 */
                @Override
                public void mouseDragged(MouseEvent event) {
                    int x = event.getX();
                    int y = event.getY();
                    mask.subtract(new Area(new Ellipse2D.Float(x - 25, y - 25, 50, 50)));
                    updateImage();
                    repaint();
                }
            });
        }
        private Area mask = new Area(new Rectangle(50, 50, 400, 500));
     
        private void clearBuffer() {
            int w = offscreenImage.getWidth();
            int h = offscreenImage.getHeight();
            Graphics2D g2d = (Graphics2D) offscreenImage.createGraphics();
            try {
                g2d.setColor(Color.BLACK);
                g2d.fillRect(0, 0, w, h);
                g2d.setComposite(AlphaComposite.SrcIn);
                g2d.setColor(transparent);
                g2d.fillRect(0, 0, w, h);
            } finally {
                g2d.dispose();
            }
        }
     
        private void updateImage() {
            clearBuffer();
            Graphics2D g2d = (Graphics2D) offscreenImage.createGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.BLACK);
            g2d.fill(mask);
            g2d.setComposite(AlphaComposite.SrcIn);
            g2d.setPaint(houseTexture);
            g2d.fill(mask);
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            try {
                g2d.setPaint(skyGradient);
                g2d.fillRect(0, 0, getWidth(), getHeight());
                g2d.drawImage(offscreenImage, 0, 0, null);
            } finally {
                g2d.dispose();
            }
        }
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            Main main = new Main();
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(main, BorderLayout.CENTER);
            frame.pack();
            frame.setResizable(false);
            frame.setVisible(true);
        }
    }
    Note: cet exemple n'est pas très optimise mais donne un exemple de comment cela fonctionne. Une légère bordure noire peut apparaitre car j'utilise l'antialiasing et la couleur noire transparente.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 96
    Points : 32
    Points
    32
    Par défaut
    Bonjour

    Tout d'abord merci pour votre reponse et votre code.

    Mon idée est, effectivement, de faire quelquechose d'assez proche d'un Worms, avec comme besoins sous-jacents pour mon projet: la détection de collisions ainsi que le calcul d'enveloppes convexes.

    Aprés avoir farfouillé sur le net, j'ai vu qu'il était possible de dessiner des formes géometriques et d'appliquer à l'interieur de celle ci des textures.
    Ce qui correspond assez à mes besoins, cependant aprés avoir regardé votre code plus en détails, je ne vois pas comme vous faite pour faire "disparaitre" le cube en premier plan.

    Pourriez vous me donner quelques explications a ce sujet.


    D'avance merci

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tout se joue au niveau du compositing, l'option choisie (AlphaComposite.SrcIn ) permet de n'afficher que la partie du cube qui nous intéresse.

    Je te conseille la lecture du tutoriel suivant pour comprendre les divers mode de compositing...

    http://download.oracle.com/javase/tu...mpositing.html

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 872
    Points : 22 939
    Points
    22 939
    Billets dans le blog
    53
    Par défaut
    A noter qu'un alternative plus simple est bien sur de texturer directement la shape sans passer par la composite (mais bon, la question portait sur un masque donc et qui dit masque dit composite).

    Ce qui reviendrai grosso-modo à (code pas compilé) :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    /**
     *
     * @author fabriceb
     */
    public class Main extends JComponent {
     
        private LinearGradientPaint skyGradient = new LinearGradientPaint(0, 0, 0, 500, new float[]{0.6f, 0.98f, 1f}, new Color[]{Color.BLUE, Color.CYAN, Color.WHITE});
        private LinearGradientPaint houseTexture = new LinearGradientPaint(0, 0, 0, 500, new float[]{0f, 1f}, new Color[]{Color.ORANGE, Color.YELLOW});
     
        public Main() {
            setPreferredSize(new Dimension(500, 500));
            setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
            addMouseListener(new MouseAdapter() {
     
                /**
                 * {@inheritDoc}
                 */
                @Override
                public void mouseClicked(MouseEvent event) {
                    int x = event.getX();
                    int y = event.getY();
                    shape.subtract(new Area(new Ellipse2D.Float(x - 25, y - 25, 50, 50)));
                    repaint();
                }
            });
            addMouseMotionListener(new MouseMotionAdapter() {
     
                /**
                 * {@inheritDoc}
                 */
                @Override
                public void mouseDragged(MouseEvent event) {
                    int x = event.getX();
                    int y = event.getY();
                    shape.subtract(new Area(new Ellipse2D.Float(x - 25, y - 25, 50, 50)));
                    repaint();
                }
            });
        }
     
        private Area shape= new Area(new Rectangle(50, 50, 400, 500));
     
     
        /**
         * {@inheritDoc}
         */
        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            try {
                g2d.setPaint(skyGradient);
                g2d.fillRect(0, 0, getWidth(), getHeight());
                g2d.setPaint(houseTexture);
                g2d.fill(shape);
            } finally {
                g2d.dispose();
            }
        }
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            Main main = new Main();
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(main, BorderLayout.CENTER);
            frame.pack();
            frame.setResizable(false);
            frame.setVisible(true);
        }
    }

Discussions similaires

  1. Lissage d'une courbe
    Par camounette dans le forum Mathématiques
    Réponses: 14
    Dernier message: 09/05/2013, 19h24
  2. Lissage d'une courbe XY
    Par mad_dream dans le forum LabVIEW
    Réponses: 1
    Dernier message: 09/08/2010, 22h25
  3. Lissage d'une courbe en 3D
    Par benoitbs dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/05/2009, 00h27
  4. Méthode lissage d'une courbe de vitesse
    Par fredg142 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 14/11/2008, 01h32
  5. Lissage d'une courbe sur graph XY
    Par Marc29 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 13/08/2008, 15h44

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