Java – нарисуйте треугольник

java
Вопрос: Эй, я знаю, что просто рисовать овал/прямоугольник и заполнять его, используя g.fillOval(30, 40, 20, 20); но как рисовать треугольник? Было бы лучше, если бы у него были случайные координаты. Лучший ответ: Есть как минимум два основных способа, которыми вы можете достичь, исходя из ваших потребностей. Вы можете использовать Polygon или вы можете использовать API

Вопрос:

Эй, я знаю, что просто рисовать овал/прямоугольник и заполнять его, используя

g.fillOval(30, 40, 20, 20);

но как рисовать треугольник? Было бы лучше, если бы у него были случайные координаты.

Лучший ответ:

Есть как минимум два основных способа, которыми вы можете достичь, исходя из ваших потребностей.

Вы можете использовать Polygon или вы можете использовать API 2D-графики

Который вы можете выбрать, сводится к вашим требованиям. Polygon требует, чтобы вы заранее знали положение точек в трехмерном пространстве, где API Shape дает вам больше свободы для определения формы, не заботясь о позиции заранее.

Это делает API Shape более гибким, поскольку вы можете определить форму один раз и просто перевести контекст Graphics мере необходимости и перерисовать его.

Например…

Triangle

Красный – Polygon, зеленый – это Shape, которая переведена в положение…

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.geom.Path2D; import java.awt.geom.Point2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TriangleTest { public static void main(String[] args) { new TriangleTest(); } public TriangleTest() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(«Testing»); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private TriangleShape triangleShape; private Polygon poly; public TestPane() { triangleShape = new TriangleShape( new Point2D.Double(50, 0), new Point2D.Double(100, 100), new Point2D.Double(0, 100) ); poly = new Polygon( new int[]{50, 100, 0}, new int[]{0, 100, 100}, 3); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(Color.RED); g2d.fill(poly); g2d.setColor(Color.GREEN); g2d.translate(50, 100); g2d.fill(triangleShape); g2d.dispose(); } } public class TriangleShape extends Path2D.Double { public TriangleShape(Point2D… points) { moveTo(points[0].getX(), points[0].getY()); lineTo(points[1].getX(), points[1].getY()); lineTo(points[2].getX(), points[2].getY()); closePath(); } } } Ответ №1

Используя устаревший класс Graphics, это будет сделано с использованием устаревшего метода
drawPolygon(int[] x, int[] y, int pointCount).

Новый класс Graphics2D поддерживает гораздо более Path2D реализацию с использованием Path2D. Вам понадобится метод draw(Shape) или fill(Shape). Учитывая тот факт, что почти везде в Java объект Graphics самом деле является объектом Graphics2D, вы можете его отличить, это путь, ИМХО.

Graphics g = …; Graphics2D g2d = (Graphics2D) g; Path2D.Double triangle = new Path2D.Double(); triangle.moveTo(x1, y1); triangle.pathTo(x2, y2); triangle.pathTo(x3, y3); triangle.closePath(); g2d.fill(triangle);

Оцените статью
Добавить комментарий