在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 rotated = ato.filter(image, null);

然而,我似乎再也找不到图像的中心点了。

如果角度是0,那么图像是原始方向,那么我只需要这样做;

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

然而,我不知道如何找到中心点,并在旋转图像的基础上绘制它。

我知道它涉及到使用cos和sin将原始点X和点Y乘以旋转矩阵,但每次我试图找出一个解决方案时,它总是画得完全错误。

任何帮助都将不胜感激,因为我花了一天的大部分时间试图解决这个问题。

谢谢。

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

中心为width/2height/2

使用这个来计算你的新宽度和高度:

从旋转矩形计算边界框坐标

我已经用OpenCV完成了这项工作,在那里图像已经旋转,但结果图像的宽度和高度与初始尺寸相同。如果图像超出初始尺寸,就会被裁剪,如果没有信息,就会有黑色像素(旋转后的图像在那个位置没有像素)。

如果您认为rotated的像素比初始图像多,可以使用size()length()进行验证。或者你可以使用初始矩形的对角线(图像大小):计算对角线的投影,然后得到最大值或你认为的值。但我确信这与OpenCV的情况类似。

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

您的问题并不完全清楚,但在我看来,您对用于参数化椭圆的角度的性质有误解。角度只是用来参数化椭圆方程的形式。它与极角不同(特定角度除外)。也就是说,如果你使用(π/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)弧度的整数倍)

在我看来,你需要椭圆相对于其中心的极性形式,以便你的代码在使用这个角度进行旋转的情况下有意义。

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

相关内容

  • 没有找到相关文章

最新更新