我如何在java中绘制三角形?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29447994/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 08:00:41  来源:igfitidea点击:

How do i draw a triangle in java?

javaswingjframejpanel

提问by Hyman Zhang

Ok so first of all i know how to draw a rectangle and circles and ect with g.drawRect or g.drawOval but there is no g.drawtriangle so can you guys tell me if there is a way to draw a triangle with out me having to draw it out each side of the triangle.

好的,首先我知道如何使用 g.drawRect 或 g.drawOval 绘制矩形和圆形,但是没有 g.drawtriangle 所以你们能告诉我是否有办法在没有我的情况下绘制三角形把它画出来三角形的每一边。

采纳答案by Constant

You may use Graphics.drawPolygon(int[], int[], int)where the first int[] is the set of x values, the second int[] is the set of y values, and the int is the length of the array. (In a triangle's case, the int is going to be 3)

您可以使用Graphics.drawPolygon(int[], int[], int)where 第一个 int[] 是 x 值的集合,第二个 int[] 是 y 值的集合,而 int 是数组的长度。(在三角形的情况下,int 将是 3)

Example:

例子:

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

Output:

输出:

Output

输出

回答by Hovercraft Full Of Eels

I would use a Path2D object, and would place my first point with its moveTo(...)method, and then add additional points with its lineTo(...)method. Then I could draw it or fill it via Graphics2D#draw(...)and Graphics2D#fill(...). Also calling closePath()on it will make sure that your triangle closes appropriately.

我会使用一个 Path2D 对象,并用它的moveTo(...)方法放置我的第一个点,然后用它的lineTo(...)方法添加其他点。然后我可以绘制它或通过Graphics2D#draw(...)和填充它Graphics2D#fill(...)。同时调用closePath()它可以确保您的三角形适当关闭。

For example, the following code produces:

例如,以下代码产生:

enter image description here

在此处输入图片说明

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();
         }
      });
   }
}


An additional benefit to use of a Path2D object is that if you want to drag the Shape, it's not hard to do with a MouseListener and MouseMotionListener, say something like:

使用 Path2D 对象的另一个好处是,如果您想拖动形状,使用 MouseListener 和 MouseMotionListener 并不难,例如:

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();
  };

}

The whole thing could look like:

整个事情可能看起来像:

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();
         }
      });
   }
}