2014-01-06 70 views
0

我試圖爲此發佈一個不同的主題,但人們似乎並沒有真正理解我想要做什麼,所以,現在我已經關閉了那個並打開了這個一個給予更多細節,並將整個問題重新解釋。在Java中的某個點旋轉和繪製圖像

好的。

所以基本上,我有一個繪製橢圓的應用程序。現在,我有一定數量的點(可以是隨機的),其中我必須旋轉圖像並繪製。

使用數學我知道,通過使用角度來獲得基於橢圓的點我使用下面的公式:

final int radiusW = (width/2); 
final int radiusH = (height/2); 
final int angle = 120; 

int pointX = (int) (radiusW + (radiusW * Math.cos(Math.toRadians(angle)))); 
int pointY = (int) (radiusH + (radiusH * Math.sin(Math.toRadians(angle)))); 

而且工作正常,我可以找到圍繞橢圓周長的絕對點。

但是,現在我正試圖在這一點上繪製圖像,以便圖像朝着橢圓的中心旋轉並以該點爲中心。

所以,爲了讓圖像旋轉到點的中心,我做了以下操作;

final AffineTransform at = new AffineTransform(); 
at.rotate(Math.toRadians(angle - 90), image.getWidth()/2, image.getHeight()/2); 
final AffineTransformOp ato = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 

然後我得到我新的旋轉的BufferedImage使用;

BufferedImage rotated = ato.filter(image, null); 

但是,我似乎無法得到圖像的中心點了。

如果角度爲0,以便圖像是原始方向,那麼我會乾脆;

graphics.drawImage(rotated, pointX - rotated.getWidth()/2, pointY - rotated.getHeight()/2, this); 

但是,我不知道如何找到中心點,並基於旋轉的圖像繪製它。

我知道它涉及到使用cos和sin來將原點x和點y乘以旋轉矩陣,但每次我嘗試並找出解決方案時,它總會引發完全錯誤。

任何幫助將非常感謝,因爲我花了一天的最佳時間來解決這個問題。

謝謝。

回答

0

問題是,如果您只是使用sin和cos來旋轉圖像的角落,您將以該角落的新旋轉位置結束 - 實際上您想要查找的是新的寬度和高度。

中心是width/2height/2

使用此來計算您的新高度和寬度:

Calculate Bounding box coordinates from a rotated rectangle

0

我跟OpenCV的做到了這一點,並有圖像已被旋轉而導致圖像與最初的圖像具有相同的寬度和高度。如果圖像超出初始尺寸,則圖像會被裁剪,如果沒有信息,則會出現黑色像素(旋轉的圖像在該位置沒有像素)。

如果您認爲rotated的像素數多於初始圖像,可以使用size()length()進行驗證。或者你可以玩最初矩形的對角線(圖像大小):計算對角線的投影並使其最大或者你認爲是什麼。但我相信它與OpenCV的情況類似。

我不知道這是否能幫助你,但我希望如此。

0

你的問題並不完全清楚,但在我看來,你對用於參數化橢圓的角度性質有誤解。您所擁有的角度僅用於參數化橢圓方程的形式。它是而不是與極角相同(除特定角度外)。也就是說,如果使用(π/ 4)弧度(45度)的角度評估橢圓上的一個點,然後測量從橢圓中心到該點的線與該軸形成的角度,則不會對該軸進行測量,它將不會是度量45度(橢圓實際上是一個圓的情況除外)。

也就是說是

int pointX = (int) (radiusW + (radiusW * Math.cos(Math.toRadians(angle)))); 
int pointY = (int) (radiusH + (radiusH * Math.sin(Math.toRadians(angle)))); 

僅僅是一個橢圓的參數化和angle不是極角和治療這種角度的旋轉角度也不會給出準確的結果(除了在整(π/ 2)弧度的倍數)

在我看來,你需要polar form of an ellipse relative to its centre爲了讓你的代碼在使用這個角度旋轉的上下文中有意義。

這也可能是我誤解了,雖然你的問題,在這種情況下,這個答案將是一個規模宏大被downvoted,我會刪除它。