在Java中的某个点旋转和绘制图像

时间:2014-01-06 14:26:18

标签: java image math graphics rotation

我试图为此发布一个不同的主题,但人们似乎并不真正理解我想要做的事情,所以,现在我已经关闭了那个并开启了这个以提供更多细节并将问题重新改写为一个整体。

确定。

基本上,我有一个绘制椭圆的应用程序。现在,我有一定数量的点(可以是随机的),我必须旋转图像并绘制。

使用数学我知道要使用角度在椭圆上得到一个点我使用下面的等式;

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将原始pointX和pointY乘以旋转矩阵,但每当我尝试找出解决方案时,它总是完全错误。

任何帮助都会非常感激,因为我花了一天的时间来试图解决这个问题。

谢谢。

3 个答案:

答案 0 :(得分:0)

问题是,如果你只是使用sin和cos来旋转图像的角落,那么你最终会得到那个角落的新旋转位置 - 实际上你想要找到的是新的宽度和高度。

中心为width/2height/2

用它来计算你的新宽度和高度:

Calculate Bounding box coordinates from a rotated rectangle

答案 1 :(得分:0)

我已经使用OpenCV完成了此操作,并且图像已经旋转,但生成的图像具有与初始图像相同的宽度和高度。如果图像超出了初始尺寸,则会裁剪图像,如果没有信息,则会出现黑色像素(旋转的图像在该位置没有像素)。

如果您认为rotated的像素数多于初始图像,则可以使用size()length()进行验证。或者你可以使用初始矩形的对角线(图像大小)进行游戏:计算对角线的投影并最大化或者你想到的。但我确信它与OpenCV案例类似。

我不知道这是否可以帮助你,但我希望如此。

答案 2 :(得分:0)

你的问题并不完全清楚,但在我看来,你误解了用于参数化椭圆的角度的性质。你所拥有的角度仅用于参数化椭圆方程的形式。与极角相同(特定角度除外)。也就是说,如果使用(pi / 4)弧度(45度)的角度评估椭圆上的点,则测量从椭圆中心到点的线与轴的角度,它将测量45度(椭圆实际上是圆的情况除外)。

也就是说

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

只是椭圆的参数化,angle不是极角,将此角度视为旋转角度不会得到准确的结果(除了(pi)的整数倍/ 2)弧度)

在我看来,您需要polar form of an ellipse relative to its centre才能使代码在使用此角度进行旋转时有意义。

我也有可能误解了你的问题,在这种情况下,这个答案将大规模投降,我将删除它。