java swing rotation geometry

Girando un triángulo alrededor de un punto java



swing rotation (1)

Comience por echar un vistazo a los gráficos 2D , en particular Transformar formas, texto e imágenes .

Básicamente, tu "polígono" tendrá un tamaño definible (el máximo punto x / y), a partir de esto, puedes determinar la posición central del "polígono", por ejemplo ...

protected Dimension getTriangleSize() { int maxX = 0; int maxY = 0; for (int index = 0; index < xPoints.length; index++) { maxX = Math.max(maxX, xPoints[index]); } for (int index = 0; index < yPoints.length; index++) { maxY = Math.max(maxY, yPoints[index]); } return new Dimension(maxX, maxY); }

Esto solo devuelve los límites xy y máximos de su polígono. Esto le permite calcular la posición central del polígono. Verá por qué en un segundo por qué no necesita especificar realmente el punto de origen ...

A continuación, calculamos una AffineTransform , que se aplica directamente al contexto de Graphics ...

Graphics2D g2d = (Graphics2D) g.create(); AffineTransform at = new AffineTransform(); Dimension size = getTriangleSize(); int x = clickPoint.x - (size.width / 2); int y = clickPoint.y - (size.height / 2); at.translate(x, y); at.rotate(Math.toRadians(angle), clickPoint.x - x, clickPoint.y - y); g2d.setTransform(at); g2d.drawPolygon(xPoints, yPoints, 3); // Guide g2d.setColor(Color.RED); g2d.drawLine(size.width / 2, 0, size.width / 2, size.height / 2); g2d.dispose();

Esto no solo traduce la posición del triángulo, sino que también la rota. Esto significa que puede crear un polígono normalizado (cuyo punto de origen es 0x0) y permitir que el contexto de Graphics coloque donde lo desee, esto hace que la vida sea TAN fácil ...

Ahora, el cálculo de rotación se basa en el cálculo del ángulo entre dos puntos, el punto de "clic" y el punto de "arrastre" ...

angle = -Math.toDegrees(Math.atan2(e.getPoint().x - clickPoint.x, e.getPoint().y - clickPoint.y)) + 180;

Que se basa en la solución en esta pregunta

Por ejemplo...

La línea roja es una guía simple para mostrar que la punta del triángulo apunta hacia el mouse ...

import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.AffineTransform; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class DrawTriangle extends JFrame { /** * The x points. */ private int[] xPoints = new int[]{0, 25, 50}; /** * The y points. */ private int[] yPoints = new int[]{50, 0, 50}; double angle = 0f; /** * Instantiates a new draw triangle. */ public DrawTriangle() { super("Dimitry Rakhlei"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setContentPane(new DrawTrianglePanel()); pack(); setLocationRelativeTo(null); setVisible(true); } /** * The Class DrawTrianglePanel. */ private class DrawTrianglePanel extends JPanel implements MouseListener, MouseMotionListener { private Point clickPoint; /** * Instantiates a new draw triangle panel. */ public DrawTrianglePanel() { addMouseListener(this); addMouseMotionListener(this); clickPoint = new Point(100, 100); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } protected Dimension getTriangleSize() { int maxX = 0; int maxY = 0; for (int index = 0; index < xPoints.length; index++) { maxX = Math.max(maxX, xPoints[index]); } for (int index = 0; index < yPoints.length; index++) { maxY = Math.max(maxY, yPoints[index]); } return new Dimension(maxX, maxY); } /** * Drawing the triangle. * * @param g the g * @see javax.swing.JComponent#paintComponent(java.awt.Graphics) */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); AffineTransform at = new AffineTransform(); Dimension size = getTriangleSize(); int x = clickPoint.x - (size.width / 2); int y = clickPoint.y - (size.height / 2); at.translate(x, y); at.rotate(Math.toRadians(angle), clickPoint.x - x, clickPoint.y - y); g2d.setTransform(at); g2d.drawPolygon(xPoints, yPoints, 3); // Guide g2d.setColor(Color.RED); g2d.drawLine(size.width / 2, 0, size.width / 2, size.height / 2); g2d.dispose(); } /** * (non-Javadoc). * * @param e the e * @see java.awt.event.MouseListener#mousePressed (java.awt.event.MouseEvent) */ @Override public void mousePressed(MouseEvent e) { System.out.println("Mouse pressed called"); // clickPoint = e.getPoint(); repaint(); } /** * (non-Javadoc). * * @param e the e * @see java.awt.event.MouseListener#mouseReleased (java.awt.event.MouseEvent) */ @Override public void mouseReleased(MouseEvent e) { System.out.println("Mouse released called"); } /** * (non-Javadoc). * * @param e the e * @see java.awt.event.MouseMotionListener#mouseDragged (java.awt.event.MouseEvent) */ public void mouseDragged(MouseEvent e) { System.out.println("Mouse dragged called"); angle = -Math.toDegrees(Math.atan2(e.getPoint().x - clickPoint.x, e.getPoint().y - clickPoint.y)) + 180; repaint(); } /** * (non-Javadoc). * * @param e the e * @see java.awt.event.MouseListener#mouseEntered (java.awt.event.MouseEvent) */ public void mouseEntered(MouseEvent e) { System.out.println("Mouse Entered."); } /** * (non-Javadoc). * * @param e the e * @see java.awt.event.MouseListener#mouseExited (java.awt.event.MouseEvent) */ public void mouseExited(MouseEvent e) { System.out.println("Mouse exited."); } /** * (non-Javadoc). * * @param e the e * @see java.awt.event.MouseListener#mouseClicked (java.awt.event.MouseEvent) */ public void mouseClicked(MouseEvent e) { } /** * (non-Javadoc). * * @param e the e * @see java.awt.event.MouseMotionListener#mouseMoved (java.awt.event.MouseEvent) */ public void mouseMoved(MouseEvent e) { } } /** * The main method. * * @param args the arguments */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } new DrawTriangle(); } }); } }

Ahora, antes de saltar sobre mí y quejarse de que la solución es "demasiado compleja", entender que soy un idiota, en serio, mi hijo de 2 años tiene una mejor comprensión de las matemáticas básicas que yo, esta es la solución más simple Puedo pensar que eso no funde mi cerebro y utiliza la API de polígono dual array. Personalmente, usaría la Shape API, pero eso no es con lo que comenzaste ...

Estoy teniendo problemas Necesito rotar un triángulo equilátero alrededor de su centro utilizando el oyente de arrastre y haciendo clic en oyente. El triángulo debería crecer, pero ahora cambia de ángulo y debe girar un punto mientras está centrado en el centro del triángulo. Este es mi problema, actualmente está arrastrando por el punto 3 y girando alrededor del punto 1. Tengo una matriz de valores xey y almacena 4 valores cada uno que contiene el punto inicial primero en el valor ordinal 0 y el punto 1 2 y 3 en los valores correspondientes.

`

public class DrawTriangle extends JFrame { enter code here /** The Constant NUMBER_3. */ private static final int NUMBER_3 = 3; /** The Constant EQUL_ANGLE. */ @SuppressWarnings("unused") private static final double EQUL_ANGLE = 1; /** The Constant TRIANGLE_POINTS. */ private static final int TRIANGLE_POINTS = 4; /** The Constant _400. */ private static final int SIZE = 400; /** The x points. */ private int [] xPoints = new int[TRIANGLE_POINTS]; /** The y points. */ private int [] yPoints = new int[TRIANGLE_POINTS]; private int xInitial; private int yInitial; /** The x. */ private double x = EQUL_ANGLE; /** The new x. */ private double newX; /** The new y. */ private double newY; /** * Instantiates a new draw triangle. */ public DrawTriangle() { super("Dimitry Rakhlei"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setContentPane(new DrawTrianglePanel()); setSize(SIZE, SIZE); // you can change this size but don''t make it HUGE! setVisible(true); } /** * The Class DrawTrianglePanel. */ private class DrawTrianglePanel extends JPanel implements MouseListener, MouseMotionListener { /** * Instantiates a new draw triangle panel. */ public DrawTrianglePanel() { addMouseListener(this); addMouseMotionListener(this); } /** * Drawing the triangle. * * @param g * the g * @see javax.swing.JComponent#paintComponent(java.awt.Graphics) */ public void paintComponent(Graphics g) { super.paintComponent(g); // DRAWING CODE HERE g.drawPolygon(xPoints, yPoints, 3); System.out.println("Paint called"); } /** * (non-Javadoc). * * @param e * the e * @see java.awt.event.MouseListener#mousePressed * (java.awt.event.MouseEvent) */ public void mousePressed(MouseEvent e) { System.out.println("Mouse pressed called"); e.getPoint(); xPoints[0] = e.getPoint().x; yPoints[0] = e.getPoint().y; repaint(); } /** * (non-Javadoc). * * @param e * the e * @see java.awt.event.MouseListener#mouseReleased * (java.awt.event.MouseEvent) */ public void mouseReleased(MouseEvent e) { System.out.println("Mouse released called"); } /** * (non-Javadoc). * * @param e * the e * @see java.awt.event.MouseMotionListener#mouseDragged * (java.awt.event.MouseEvent) */ public void mouseDragged(MouseEvent e) { System.out.println("Mouse dragged called"); newX = e.getPoint().x; newY = e.getPoint().y; xPoints[1] = (int) newX; yPoints[1] = (int) newY; newX = xPoints[0] + (xPoints[1]-xPoints[0])*Math.cos(x) - (yPoints[1]-yPoints[0])*Math.sin(x); newY = yPoints[0] + (xPoints[1]-xPoints[0])*Math.sin(x) + (yPoints[1]-yPoints[0])*Math.cos(x); xPoints[2] = (int) newX; yPoints[2] = (int) newY; newX = xPoints[0] + (xPoints[1]-xPoints[0])*Math.cos(x) - (yPoints[1]-yPoints[0])*Math.sin(x); newY = yPoints[0] + (xPoints[1]-xPoints[0])*Math.sin(x) + (yPoints[1]-yPoints[0])*Math.cos(x); xPoints[3] = (int) newX; yPoints[3] = (int) newY; repaint(); } /** * (non-Javadoc). * * @param e * the e * @see java.awt.event.MouseListener#mouseEntered * (java.awt.event.MouseEvent) */ public void mouseEntered(MouseEvent e) { System.out.println("Mouse Entered."); } /** * (non-Javadoc). * * @param e * the e * @see java.awt.event.MouseListener#mouseExited * (java.awt.event.MouseEvent) */ public void mouseExited(MouseEvent e) { System.out.println("Mouse exited."); } /** * (non-Javadoc). * * @param e * the e * @see java.awt.event.MouseListener#mouseClicked * (java.awt.event.MouseEvent) */ public void mouseClicked(MouseEvent e) { } /** * (non-Javadoc). * * @param e * the e * @see java.awt.event.MouseMotionListener#mouseMoved * (java.awt.event.MouseEvent) */ public void mouseMoved(MouseEvent e) { } } /** * The main method. * * @param args * the arguments */ public static void main(String[] args) { new DrawTriangle(); } };`

Mi problema es que este código básicamente funciona correctamente, pero me dicen que el punto de rotación del vértice debe estar en el medio del triángulo. El mío es el primer punto.