2013-04-27 2 views
1

Я написал программу, которая поддерживает 3 действия: вращать, переводить и масштабировать.Как повернуть 2D-объект вокруг себя?

Перевод & масштабирование отлично работает, но у меня возникли проблемы с вращением.

В начале кода я анализирую исходную точку из файла и затем рисую исходный объект в 2D-плоскости. Затем, вместо вращения вокруг себя, объект вращается вокруг начала координат.

Я проверяю все матрицы и математические уравнения, но не могу найти точную ошибку, любую идею, где я здесь ошибся?

Я приложил частичный код вращения без масштабирования и преобразования.

Вот SSCCE кода:

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.util.ArrayList; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.geom.Point2D; 
import java.awt.geom.Line2D; 
import java.io.IOException; 

import javax.swing.JFrame; 

public class SSCCE { 

    public static void main (String[] args) throws IOException 
    { 
     ClippingView1 CC = new ClippingView1(); 
     CC.start(); 
    } 


} 
  • Это SSCCE поддерживает только вращение, так как это моя главная проблема.

Любая идея для этой проблемы была бы принята с благодарностью!

С уважением

ответ

1

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

Таким образом, линия, где вы не делаете m_transforms.rotate, вы должны иметь что-то вроде:

currentLine = m_transforms.translate(-xPoint, -yPoint, 
        m_transforms.rotate(m_direction, 
         m_transforms.translate(xPoint, yPoint, currentLine); 

Где xPoint и yPoint являются какой бы точки вы хотите, чтобы повернуть вокруг.

Вы, вероятно, следует объединить эти 3 операции в одну матрицу, а затем применить это к currentLine, так что вы бы метод, как

Line2D rotate(double xPoint, double yPoint, double angle, Line2D line)

+0

Вы уверены в этом? он по-прежнему вращается вокруг центра, хотя я изменил, как вы упомянули выше .. спасибо. Изменено это: 'currentLine = m_transforms.translate (-this.m_orX, -this.m_orY, currentLine);', 'currentLine = m_transforms.rotate (m_direction, currentLine);', 'currentLine = m_transforms.translate (this.m_orX , this.m_orY, currentLine); ',' this.m_currentLines.set (i, currentLine); ' – ron

+0

Ну, я не пробовал, и это было какое-то время, но основное вращение всегда происходит вокруг, поэтому .. Но я понимаю, что тебе нужно работать тогда, хорошо :) – hyde

Смежные вопросы