2010-02-04 91 views
3

什麼是通過鼠標移動旋轉圖像後面的邏輯。我知道如何使用graphics2d.rotate進行旋轉,但使用鼠標作爲旋轉源時遇到了困難。下面是基本步驟:爪哇2D - 拖動鼠標以平滑旋轉圖像

  1. 獲取鼠標X(DX)和鼠標Y(DY)距錨固點(在這種情況下,這將是 我們要旋轉圖像的中心)。
  2. 在Math.arcTan2(dy,dx)中使用此點來獲取角度或旋轉。
  3. 使用Graphics2D.rotate方法的步驟中的值。

有了這個策略,每當我旋轉圖像,圖像開始旋轉從-pi旋轉90度後,它回到-pi。我不明白我在這裏做錯了什麼,它應該是非常基本的。

下面是代碼的一部分:

// mouse dragged events get sent here. 
public void mouseDragged(MouseEvent e) { 
    int mx = e.getX(), my = e.getY(); 
    // just checking if it falls within bounds of the image we 
    // want to rotate. 
    if(mx > speedKX || mx < speedKX + speedK.getWidth() || my > speedKY || my < speedKY + speedK.getHeight()/2) 
    { 
     theta += getTheta(e.getX(), e.getY()); 
    } 
} 
+0

是否可以看到一些代碼?看起來像一個三角函數問題... – 2010-02-04 08:45:48

+0

是肯定,在這裏: //鼠標拖動事件被送到這裏。 public void mouseDragged(MouseEvent e) int mx = e.getX(),my = e.getY(); //只是檢查它是否落在我們想要旋轉的圖像的邊界內 。如果(mx> speedKX || mx speedKY || my dave 2010-02-04 08:56:18

+0

我不確定爲什麼,但以前的評論沒有格式好,你們可以閱讀嗎?如果不讓我知道謝謝。 – dave 2010-02-04 08:57:08

回答

4

據我瞭解,你應該尋找初始角度(當你點擊時,錨和你的點擊之間的線),當前角度(當你拖動,同一行)。該角度(獨立於當前到錨點的距離)會給你旋轉。

所以,你必須:

rotate(anglenow - angle0) 

如何找到它:

在這兩種情況下(首次點擊鼠標移動事件),你必須要找到錨和鼠標點思考主播之間的夾角起源。

我會使用一種方法(getAngle(X1,Y1,X2,Y2)。該方法(除競爭條件等相同的x或相同的Y,可容易檢測的)應計算反正切(DY/DX)。

註冊

但是當你將DY/DX可以這樣:

+/+ -> + 
+/- -> - 
-/+ -> - 
-/- -> + 

是,四個posibilities給你兩個樣的結果所以,你必須尋找一些條件來檢測它們。 。

我應該查看arctan doc或source來查看它給出的值(在0和pi之間,或-pi/2和+ pi/2之間),然後檢查dx或dy的符號(取決於arctan返回的範圍)並使用它來添加/減少pi,然後生成角度。

然後,您將得到一個getAngle方法,可以正確返回360º空間。

編輯

的Javadoc說:

Math.atan retuns角的反正切,在-pi/2到pi/2的範圍內。

因此,假設您的角度值爲0的X軸,因爲我假設,它返回的範圍是右半球。所以你必須從左邊的那個區分出右半球。

如果計算DX = xtarget - xorigin(像你一樣爲師),如果正確的半球是正確的,且負,如果不是這將是積極的。

因此,如果dy < 0那麼你必須添加pi到你的合成角度。它將在-pi/2和3pi/2之間。您也可以通過全部傳遞(-pi,pi)範圍或(0,2pi)範圍來更正結果。

編輯:僞代碼,請仔細檢查!

onmousedown { 
    startpoint = (x,y); 
    startangle = getAngle(origin, startpoint); 
} 

onmousemove { 
    currentpoint = (x,y); 
    currentangle = getAngle(origin, currentpoint); 
    originalimage.rotate(currentangle - startangle); 
} 

getAngle(origin, other) { 
    dy = other.y - origin.y; 
    dx = other.x - origin.x; 
    if (dx == 0) // special case 
     angle = dy >= 0? PI/2: -PI/2; 
    else 
    { 
     angle = Math.atan(dy/dx); 
     if (dx < 0) // hemisphere correction 
      angle += PI; 
    } 
    // all between 0 and 2PI 
    if (angle < 0) // between -PI/2 and 0 
     angle += 2*PI; 
    return angle; 
} 
+0

哇,我真的很喜歡這個網站上的即時反饋,比y好多了!讓我儘快地嘗試一下。 – dave 2010-02-04 09:00:48

+0

這就是另一個問題,java的arctan2(dy,dx)方法返回一個介於-pi和pi之間的值。 – dave 2010-02-04 09:05:17

+0

-PI到PI =整圈:) – helios 2010-02-04 09:09:38