Вращая треугольник вокруг своей оси - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть круг и треугольник внутри. Мне нужно, чтобы эта фигура вращалась вокруг своей оси, и каждый раз, когда она поворачивается на определенный угол, она должна быть нарисована в целом, чтобы получить что-то вроде «орнамента» (на экране ниже). Я пытался с Graphics2D, но все пошло плохо. Как я могу это сделать?

Код:

import org.omg.CORBA.TIMEOUT;
import javax.swing.*;
import java.awt.*;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

public class Main extends JPanel {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Laboratorna 1");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(new Main());
        frame.setSize(1200, 800);
        frame.setVisible(true);
    }

    public void paintComponent(Graphics g){

        int num_2 = 8;
        int bigOval_h = 300, bigOval_w = 300;

        g.setColor(Color.BLUE);
        g.drawOval(0+500, 0, bigOval_h, bigOval_w);
        g.drawLine(150+500, 0, 20+500, 225);
        g.drawLine(150+500, 0, 280+500, 225);
        g.drawLine(20+500, 225,280+500, 225);
        g.setColor(Color.RED);

    }
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Одним из способов определения многоугольника является радиус, вращение и количество сторон.Треугольник - это трехсторонний многоугольник.Таким образом, класс треугольника может просто сохранить радиус и вращение, а затем вычислить три вершины многоугольника для рисования вокруг центральной точки.

public class Triangle {
    private final int radius;
    private final double rotation;

    public Triangle(int radius, double rotation) {
        this.radius = radius;
        this.rotation = rotation;
    }

    public void paintComponent(Graphics2D g, Point center) {    
        int[] xVertices = new int[3];
        int[] yVertices = new int[3];

        xVertices[0] = (int) (center.getX() - (Math.cos(rotation) * radius));
        yVertices[0] = (int) (center.getY() - (Math.sin(rotation) * radius));
        xVertices[1] = (int) (center.getX() - (Math.cos(Math.PI * 0.66667 + rotation) * radius));
        yVertices[1] = (int) (center.getY() - (Math.sin(Math.PI * 0.66667 + rotation) * radius));
        xVertices[2] = (int) (center.getX() - (Math.cos(Math.PI * 1.33333 + rotation) * radius));
        yVertices[2] = (int) (center.getY() - (Math.sin(Math.PI * 1.33333 + rotation) * radius));

        Polygon polygon = new Polygon(xVertices, yVertices, 3);
        g.setColor(Color.RED);
        g.drawPolygon(polygon);
    }
}

Это даст два повернутых треугольника PI радианы.

Triangle t = new Triangle(100, 0.0);
t.paintComponent((Graphics2D)g, new Point(250,250));
Triangle t2 = new Triangle(100, Math.PI);
t2.paintComponent((Graphics2D)g, new Point(250,250));

enter image description here

0 голосов
/ 11 сентября 2018

Хитрость заключается в том, чтобы выполнить аффинное преобразование для каждого угла.Кроме того, вы должны определить точку поворота для каждого преобразования, которая равна центру круга.Следующие модификации метода paintComponent, возможно, должны выполнить эту работу.

    public void paintComponent(Graphics g){

       int num_2 = 8;
       int bigOval_h = 300, bigOval_w = 300;

       g.setColor(Color.BLUE);
       g.drawOval(0 + 500, 0, bigOval_h, bigOval_w);
       // REMOVE -------------------------------------------
       // g.drawLine(150+500, 0, 20+500, 225);
       // g.drawLine(150+500, 0, 280+500, 225);
       // g.drawLine(20+500, 225,280+500, 225);
       // REMOVE -------------------------------------------
       g.setColor(Color.RED);

       // ADD -------------------------------------------------------------------
       // Create, transform and draw the lines
       Line2D lin1 = new Line2D.Float(150f + 500f, 0f, 20f + 500f, 225f);
       Line2D lin2 = new Line2D.Float(150f + 500f, 0f, 280f + 500f, 225f);
       Line2D lin3 = new Line2D.Float(20f + 500f, 225f, 280f + 500f, 225f);
       double pivotX = 500.0 + bigOval_w / 2.0; // center of the circle (x)
       double pivotY = 0.0 + bigOval_h / 2.0;   // center of the circle (y)
       for (int i = 0; i < num_2; i++) {
          AffineTransform affineTransform = AffineTransform.getRotateInstance(Math.toRadians(360.0 / num_2 * i), pivotX, pivotY);
          ((Graphics2D)g).draw(affineTransform.createTransformedShape(lin1));
          ((Graphics2D)g).draw(affineTransform.createTransformedShape(lin2));
          ((Graphics2D)g).draw(affineTransform.createTransformedShape(lin3));
       }
       // ADD -------------------------------------------------------------------
   }

Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...