2013-04-04 2 views
2

Мне нужно нарисовать некоторые квадраты внутри другого квадрата, но я не знаю, как повернуть мои квадраты по центру их и сделать их меньше? Вот картина, как это должно выглядеть в конце:Как нарисовать и повернуть квадрат внутри центра другой площади?

enter image description here

Теперь у меня есть некоторый код, который нарисовать квадраты, которые делают круг.

class MySquare extends JComponent { 
public void paint(Graphics g) { 

    Graphics2D g2d = (Graphics2D) g; 
    for (int i = 0; i < 20; i++) { 

     g2d = (Graphics2D) g.create(); 
     g2d.rotate(Math.toRadians(45 - (i * 10)), 100, 100); 

     // Difrent colors: 
     if (i % 2 == 0) 
      g2d.setColor(Color.black); 
     else 
      g2d.setColor(Color.green); 
     g2d.fillRect(50, 50, 100, 100); 

    } 
    } 
} 

public class DrawRect { 
    public static void main(String[] a) { 
    JFrame window = new JFrame(); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setBounds(30, 30, 800, 800); 
    window.getContentPane().add(new MySquare()); 
    window.setVisible(true); 
    } 
} 

ответ

7

Вы могли бы сначала сделать вашу фигуру вокруг начала координат (это легко), а затем перевести:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 

     frame.add(new JPanel() { 

      @Override 
      protected void paintComponent(Graphics g) { 
       Graphics2D g2d = (Graphics2D) g; 

       double alpha = Math.toRadians(5); 
       double factor = 1/(Math.sin(alpha) + Math.cos(alpha)); 
       double size = 200; 

       g2d.translate(size, size); 

       for (int i = 0; i < 20; i++) { 
        g2d.setColor(i % 2 == 0 ? Color.black : Color.green); 

        int intSize = (int) Math.round(size); 

        g2d.fillRect(-intSize/2, -intSize/2, intSize, intSize); 

        size = size * factor; 

        g2d.rotate(alpha); 
       } 
      } 
     }); 
    } 
} 

Screenshot

+0

я запускаю этот код, но квадраты даже не в одном месте, так что я Я не уверен, хочу ли я этого. – user2245026

+2

пользовательская покраска для компонентов Swing должна выполняться в paintComponent (против краски) - to @ user2245026, а также – kleopatra

+0

@ user2245026 Вы правы, космические преобразования всегда сбивают с толку. Я должен был сделать перевод перед поворотом. Обновил код и сделал SSCCE, чтобы показать концепцию. –