2013-04-27 40 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); 

xPointyPoint是要繞任意點。

你或許應該將這些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 2013-04-27 19:50:51

+0

呃,我沒有嘗試,它已經有一段時間了,但基本的旋轉總是圍繞原點,所以..但是我收集到了,你已經有所作爲了,那麼好:) – hyde 2013-04-28 05:34:41