我试着为此发布一个不同的主题,但人们似乎并不真正理解我想做什么,所以,现在我关闭了那个主题,打开了这个主题,以提供更多细节并重新表述整个问题。
好的。
所以基本上,我有一个应用程序,它画一个椭圆。现在,我有一定数量的点(可以是随机的),我必须在其中旋转图像并绘制。
使用数学,我知道通过使用角度在椭圆上得到一个点,我使用以下方程;
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/2
、height/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)弧度的整数倍)
在我看来,你需要椭圆相对于其中心的极性形式,以便你的代码在使用这个角度进行旋转的情况下有意义。
也有可能我误解了你的问题,在这种情况下,这个答案将被大规模否决,我将删除它