Comment dessiner un triangle en java?


Ok donc tout d'abord je sais dessiner un rectangle et des cercles et ect avec g. drawRect ou g. drawOval mais il n'y a pas de g. drawtriangle alors pouvez-vous me dire s'il y a un moyen de dessiner un triangle sans que je doive le dessiner de chaque côté du triangle.

Author: Hovercraft Full Of Eels, 2015-04-04

2 answers

Vous pouvez utiliser Graphics.drawPolygon(int[], int[], int) où le premier int [] est l'ensemble des valeurs x, le second int [] est l'ensemble des valeurs y et l'int est la longueur du tableau. (Dans un triangle, l'int va être 3)

Exemple:

graphics.drawPolygon(new int[] {10, 20, 30}, new int[] {100, 20, 100}, 3);

Sortie:

Sortie

 9
Author: Constant, 2015-04-04 15:22:20

J'utiliserais un objet Path2D et placerais mon premier point avec sa méthode moveTo(...), puis j'ajouterais des points supplémentaires avec sa méthode lineTo(...). Ensuite, je pourrais le dessiner ou de le remplir via Graphics2D#draw(...) et Graphics2D#fill(...). En appelant également closePath() dessus, vous vous assurerez que votre triangle se ferme correctement.

Par exemple, le code suivant produit:

entrez la description de l'image ici

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.geom.Path2D;    
import javax.swing.*;

public class Path2DExample extends JPanel {
   private static final int PREF_W = 600;
   private static final int PREF_H = PREF_W;
   private static final Color COLOR_1 = Color.blue;
   private static final Color COLOR_2 = Color.red;
   private static final Paint GRADIENT_PAINT = new GradientPaint(0, 0, COLOR_1, 20, 20, COLOR_2, true);
   private Path2D myPath = new Path2D.Double();

   public Path2DExample() {
      double firstX = (PREF_W / 2.0) * (1 - 1 / Math.sqrt(3));
      double firstY = 3.0 * PREF_H / 4.0;

      myPath.moveTo(firstX, firstY);
      myPath.lineTo(PREF_W - firstX, firstY);
      myPath.lineTo(PREF_W / 2.0, PREF_H / 4.0);
      myPath.closePath();
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;

      // to smooth out the jaggies
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setPaint(GRADIENT_PAINT);  // just for fun!
      g2.fill(myPath);  // fill my triangle
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGui() {
      Path2DExample mainPanel = new Path2DExample();

      JFrame frame = new JFrame("Path2DExample");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Un avantage supplémentaire à l'utilisation d'un objet Path2D est que si vous voulez faire glisser la forme, ce n'est pas difficile à faire avec un MouseListener et MouseMotionListener, disent quelque chose comme:

private class MyMouseAdapter extends MouseAdapter {
  private Point pPressed = null;

  @Override
  public void mousePressed(MouseEvent e) {
     if (e.getButton() != MouseEvent.BUTTON1) {
        return;
     }
     if (myPath.contains(e.getPoint())) {
        pPressed = e.getPoint();
     }
  }

  public void mouseDragged(MouseEvent e) {
     drag(e);
  }

  @Override
  public void mouseReleased(MouseEvent e) {
     drag(e);
     pPressed = null;
  }

  private void drag(MouseEvent e) {
     if (pPressed == null) {
        return;
     }
     Point p = e.getPoint();
     int tx = p.x - pPressed.x;
     int ty = p.y - pPressed.y;
     AffineTransform at = AffineTransform.getTranslateInstance(tx, ty);
     myPath.transform(at);
     pPressed = p;
     repaint();
  };

}

Le tout pourrait ressembler à:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import javax.swing.*;

@SuppressWarnings("serial")
public class Path2DExample extends JPanel {
   private static final int PREF_W = 600;
   private static final int PREF_H = PREF_W;
   private static final Color COLOR_1 = Color.blue;
   private static final Color COLOR_2 = Color.red;
   private static final Paint GRADIENT_PAINT = new GradientPaint(0, 0, COLOR_1,
         20, 20, COLOR_2, true);
   private Path2D myPath = new Path2D.Double();

   public Path2DExample() {
      double firstX = (PREF_W / 2.0) * (1 - 1 / Math.sqrt(3));
      double firstY = 3.0 * PREF_H / 4.0;

      myPath.moveTo(firstX, firstY);
      myPath.lineTo(PREF_W - firstX, firstY);
      myPath.lineTo(PREF_W / 2.0, PREF_H / 4.0);
      myPath.closePath();

      MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
      addMouseListener(myMouseAdapter);
      addMouseMotionListener(myMouseAdapter);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setPaint(GRADIENT_PAINT);
      g2.fill(myPath);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private class MyMouseAdapter extends MouseAdapter {
      private Point pPressed = null;

      @Override
      public void mousePressed(MouseEvent e) {
         if (e.getButton() != MouseEvent.BUTTON1) {
            return;
         }
         if (myPath.contains(e.getPoint())) {
            pPressed = e.getPoint();
         }
      }

      public void mouseDragged(MouseEvent e) {
         drag(e);
      }

      @Override
      public void mouseReleased(MouseEvent e) {
         drag(e);
         pPressed = null;
      }

      private void drag(MouseEvent e) {
         if (pPressed == null) {
            return;
         }
         Point p = e.getPoint();
         int tx = p.x - pPressed.x;
         int ty = p.y - pPressed.y;
         AffineTransform at = AffineTransform.getTranslateInstance(tx, ty);
         myPath.transform(at);
         pPressed = p;
         repaint();
      };

   }

   private static void createAndShowGui() {
      Path2DExample mainPanel = new Path2DExample();

      JFrame frame = new JFrame("Path2DExample");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
 3
Author: Hovercraft Full Of Eels, 2015-04-04 21:47:46