Случайный цвет для заполнения треугольников в java - PullRequest
0 голосов
/ 20 марта 2020

Я создаю приложение, которое рисует aws 5 случайных треугольников разных случайных цветов. Случайное рисование треугольников работает, но по какой-то причине все треугольники имеют одинаковый цвет, иногда разные цвета в местах пересечения треугольников. Вот изображение:

изображение того, что приложение создает

Кто-нибудь знает, как решить эту проблему и сделать так, чтобы каждый треугольник был другого цвета?

ТреугольникиJPanel. java:

import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import java.util.Random;

public class TrianglesJPanel extends JPanel 
{
    public void paintComponent(Graphics g) {
        //call superclass's paintComponent
        super.paintComponent(g);
        Random random = new Random();

        Graphics2D g2 = (Graphics2D) g;
        GeneralPath triangle = new GeneralPath();  //create general path object

        //get the height and width
        int height = this.getHeight();
        int width = this.getWidth();

        int[] x = new int[3];
        int[] y = new int[3];

        //draw 5 random triangles in application frame that can be adjusted
        for (int i = 0; i < 5; i++) {
            //get random points on the panel
            for (int j = 0; j < 3; j++) {
                x[j] = random.nextInt(width + 1); //random number from 0 to width
                y[j] = random.nextInt(height + 1);  //random number from 0 to height
                //Ex. Frame 500x500: x could be from 0 to 500, y from 0 to 500
            }

            triangle.moveTo(x[0], y[0]);  //start pos
            triangle.lineTo(x[1], y[1]);  //2nd point
            triangle.lineTo(x[2], y[2]);  //3rd point
            triangle.lineTo(x[0], y[0]);  //back to start pos
            triangle.closePath();         //close the triangle

            System.out.println(g2.getColor());
            //set random color for triangle
            g2.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));

            g2.fill(triangle);  //draw filled triangle
        }
    }
}

Треугольник. java:

import java.awt.Color;
import javax.swing.JFrame;

public class Triangles
{
    public static void main(String args[]) {
        //choose title
        JFrame frame = new JFrame("Drawing random triangles");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //drawing done on JPanel, embedded in a JFrame
        TrianglesJPanel triangle = new TrianglesJPanel();
        frame.add(triangle);               //add the triangles to frame
        frame.setBackground(Color.WHITE);   //set background of frame to white color
        frame.setSize(500,500);    //set frame size to 500x500
        frame.setVisible(true);    //display frame
    }
}

Ответы [ 2 ]

3 голосов
/ 20 марта 2020

Ответ уже предоставлен, но есть и другие предложения.

  • Не рисуйте линию обратно к x[0], y[0]. Это задача closePath.
  • Используйте renderHints, чтобы усреднить края, чтобы они выглядели более сглаженными.
   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
  • Если вы хотите, чтобы рамка центрировалась на экране, может сделать это.
        frame.setLocationRelativeTo(null);
  • И наконец, объявите x и y как floats или doubles. Вероятно, это не имеет никакого значения, но следует по возможности соответствовать ожидаемым типам.
1 голос
/ 20 марта 2020

Все треугольники имеют один и тот же объект GeneralPath, и он заполняется последним использованным цветом. Чтобы решить эту проблему, вам нужен новый объект GeneralPath для каждого треугольника

, поэтому:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    // GeneralPath triangle = new GeneralPath();  //create general path object
    int height = this.getHeight();
    int width = this.getWidth();
    int[] x = new int[3];
    int[] y = new int[3];
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 3; j++) {
            x[j] = random.nextInt(width + 1); //random number from 0 to width
            y[j] = random.nextInt(height + 1);  //random number from 0 to height
        }
        GeneralPath triangle = new GeneralPath();
        triangle.moveTo(x[0], y[0]);  //start pos
        triangle.lineTo(x[1], y[1]);  //2nd point
        triangle.lineTo(x[2], y[2]);  //3rd point
        triangle.lineTo(x[0], y[0]);  //back to start pos
        triangle.closePath();         //close the triangle
        System.out.println(g2.getColor());
        g2.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
        g2.fill(triangle);  //draw filled triangle
    }
}
...