2013-05-27 35 views
6

Mam prostokąt, który obraca się wokół środka i mam kolejny prostokąt, który chcę połączyć z prawym górnym rogiem obracającego się prostokąta. Problem polega na tym, że nie mam pojęcia, jak dostać się do zakrętu, aby drugi prostokąt zawsze utknął w tym rogu.Zdobądź rogi obracającego się prostokąta.

To jest mój przykładowy kod. W tej chwili drugi prostokąt będzie cały czas w tym samym miejscu, co nie jest rezultatem tego, o co prosiłem.

package Test; 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import javax.swing.*; 

class Test{ 

    public static void main(String[] args){ 
     new Test(); 
    } 

    public Test(){ 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new Graphic()); 
       frame.setSize(1000,700); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

class Graphic extends JPanel{ 
    private int x, y, windowW, windowH; 
    private double angle; 
    private Rectangle rect1, rect2; 
    private Path2D path; 
    private Timer timer; 
    private AffineTransform rotation; 

    public Graphic(){ 
     windowW = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); 
     windowH = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); 
     path = new Path2D.Double(); 
     rotation = new AffineTransform(); 
     angle = 0; 
     x = windowW/2; 
     y = windowH/2; 
     timer = new Timer(100, new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       angle += .1; 
       if(angle > 360) angle -= 360; 
       repaint(); 
      } 
     }); 
     timer.start(); 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     rotation.setToTranslation(500, 200); 
     rotation.rotate(angle, 32, 32); 
     rect1 = new Rectangle(0, 0, 64, 64); 
     path = new Path2D.Double(rect1, rotation); 
     rect2 = new Rectangle(path.getBounds().x, path.getBounds().y, 10, 50); 
     g2d.fill(path); 
     g2d.fill(rect2); 
    } 
} 
+0

związanego umieścić na 'angle' zdaje się sugerować, chcesz wyrazić w stopniach; jednak funkcja 'obróć' przyjmuje swój pierwszy parametr w radianach. Warunek 'if (kąt> 360) kąt - = 360' faktycznie powoduje dziwny skok, gdy zostanie osiągnięty, a prostokąt obraca się o wiele szybciej, niż tego chciałeś. – Arend

Odpowiedz

4

rozwiązanie matematyczne :)

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    rotation.setToTranslation(500, 200); 
    rotation.rotate(angle, 32, 32); 
    rect1 = new Rectangle(0, 0, 64, 64); 
    path = new Path2D.Double(rect1, rotation); 
    double r = 32.0 * Math.sqrt(2); 
    // (532, 232) - coordinates of rectangle center  | 
    // you can change position of second rectangle by this V substraction (all you need to know is that the full circle corresponds to 2Pi) 
    int x2 = (int) Math.round(532 + r * Math.cos(angle - Math.PI/4)); 
    int y2 = (int) Math.round(232 + r * Math.sin(angle - Math.PI/4)); 
    rect2 = new Rectangle(x2, y2, 10, 50); 
    g2d.fill(path); 
    g2d.fill(rect2); 
} 

Oczywiście, niektóre stałe powinny być pola klasy, a nie zmienne metoda.

2

nie mogę przetestować ten kod, aby mieć pewność, ale wierzę, że jest to właściwy kod roboczych, które chcesz

int hw = -width/2; 
int hh = -height/2; 
int cos = Math.cos(theta); 
int sin = Math.sin(theta); 
int x = hw * cos - hh * sin; 
int y = hw * sin + hh * cos; 

To będzie Ci lewy górny róg na podstawie theta, obrót, z plac. Aby uzyskać inne zakątki wystarczy użyć zmienić HW i HH wartości:

//top right corner 
hw = width/2 
hh = -height/2 

//bottom right corner 
hw = width/2 
hh = height/2 

//bottom left corer 
hw = -width/2 
hh = height/2 

Mam nadzieję, że to pomoże