rotate rombo metodo lineas graficos dibujar coordenadas clase avanzados java graphics paintcomponent

rombo - java 2d pdf



Rotación de gráficos 2D de Java alrededor del punto especificado (1)

Recuerde, translate y rotate son compuestos, es decir, cada vez que los aplica, se agregan a la transformación actual.

Hay varias formas en que puede lograr esto, pero primero, necesitamos hacer una copia del contexto de Graphics . Es importante que cada vez que te metas con la transformación en particular, lo hagas con una copia del contexto de Graphics , ya que esto dejará intacto al original (y no afectará a nada que pueda ser pintado después)

Graphics2D g2d = (Graphics2D) g.create(); //... g2d.dispose();

Entonces, cualquier cosa que hagas a g2d ahora, no afectará el estado de g

Ahora, podemos usar el efecto de "composición" de una transformación para nuestra ventaja

Rectangle tangle = new Rectangle(0, 0, radius, radius); //g2d.translate(centerX, centerY); g2d.rotate(Math.toRadians(angle), centerX, centerY); g2d.draw(tangle);

Entonces, todo lo que hace es aplicar el valor de angle a la copia del contexto de Graphics en cada ciclo. El punto de anclaje se establece en los puntos centerX y centerY

De acuerdo, se ve bien, pero ¿qué ocurre si cambio el tamaño de la ventana?

De acuerdo, no realmente lo que esperaba. Esto ocurre por una combinación de razones, el tamaño de la forma, el punto de anclaje, la rotación, el desplazamiento de la traducción, todos estos compuestos para producir el efecto (sin embargo, genial).

Está bien, entonces, en su lugar, podemos simplemente crear una nueva transformación para cada ciclo, suministrando los parámetros exactos que queremos, por ejemplo ...

Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(Color.blue); Rectangle tangle = new Rectangle(0, 0, radius, radius); g2d.translate(centerX, centerY); g2d.rotate(Math.toRadians(curAngle)); g2d.draw(tangle); curAngle += angle; g2d.dispose();

Esto ahora produce ...

Mientras jugaba con el código, noté que a medida que aumentaba el número de repeticiones, no obtenía los resultados deseados.

Después de excavar, cambié

angle = 360 / repeats;

a

angle = 360.d / repeats;

que detuvo el problema de división entera (y el truncamiento de los valores decimales) y comenzó a producir los resultados deseados

Una simple comparación de antes y después ...

Intento escribir un programa que dibujará varias formas giradas alrededor de un punto central. El resultado debería ser algo así como un Spirograph. Intento probarlo con rectángulos, pero solo puedo hacer que aparezcan dos en la ventana. Uno de ellos está donde debería estar, pero luego, después de la primera rotación, arroja el otro cuadrado hacia arriba en la esquina superior izquierda de la ventana. Se debe rotar y dibujar alrededor del punto central. Aquí hay una parte de mi código.

import java.awt.*; import java.awt.geom.Ellipse2D; import javax.swing.JPanel; public class Shapes extends JPanel { private double angle; private int type; private int radius; private int repeats; public Shapes(int t, int r, int z) { type = t; radius = r; repeats = z; angle = 360 / repeats; } public void paintComponent( Graphics g ) { super.paintComponent( g ); Graphics2D g2d = (Graphics2D)g; g.setColor(Color.red); int centerX = getWidth()/2; int centerY = getHeight()/2; double curAngle = 0; for(int i=0; i<=repeats; i+=1) { g.setColor(Color.blue); Rectangle tangle = new Rectangle(0, 0, radius, radius); g2d.rotate(Math.toRadians(curAngle)); g2d.translate(centerX, centerY); g2d.draw(tangle); curAngle += angle; }

}