在Java中旋转矩形

4
我需要创建以它们的中心为旋转点的矩形(因此它们不需要与坐标系的轴平行)。所以基本上每个矩形可以由中心X中心Y宽度高度角度定义。然后我想要做的是对是否包含某些点在这些矩形中进行计算(因此不涉及绘图)。我猜我不能使用Rectangle2D类,因为这些矩形总是与坐标系的x和y轴平行。获取此功能的唯一方法是编写自己的矩形类还是存在任何现有的(类似于Rectangle2D)我可以使用的东西?

1
我有这样的印象,你正在描述你找到的解决方案。另外说明你想要解决的具体问题可能是个好主意。很有可能,该问题已经存在证明有效的解决方案/算法。 - Bart Kiers
我想模拟智能天线。因此,每个矩形的中心都是一个节点(带有多个智能天线)。然后,矩形就是简化的信号模式。这意味着矩形将被旋转,以指向接收节点的方向。然后,我想计算某些天线是否在信号模式/矩形中,这可能会受到该信号的干扰。因此,我需要一种计算点是否包含在矩形内的方法。 - gaussd
2个回答

5

如果您想测试的所有点都需要旋转,请像Mihai一样使用contains(Point)方法的Rectangle2D。但是,如果您真的想旋转矩形,可以这样做(这是整数版本,但可能也可以使用Rectangle2D)。

public class TestRotate {
    public static void main(String... args) {

        Rectangle r = new Rectangle(50, 50, 100, 100);
        Point check = new Point(100, 151); // clearly outside

        System.out.println("first: " + r.contains(check));

        AffineTransform at = AffineTransform.getRotateInstance(
                Math.PI/4, r.getCenterX(), r.getCenterY());

        Polygon p = new Polygon(); 

        PathIterator i = r.getPathIterator(at);
        while (!i.isDone()) {
            double[] xy = new double[2];
            i.currentSegment(xy);
            p.addPoint((int) xy[0], (int) xy[1]);
            System.out.println(Arrays.toString(xy));

            i.next();
        }

        // should now be inside :)
        System.out.println("second: " + p.contains(check));
    }
}

我们从哪里获取多边形类? - Oliver Dixon

3

您可以使用Rectangle2D来检查包含性,如果您不是通过旋转矩形角度(例如逆时针)来实现,而是通过将需要检查的每个点相对于矩形中心顺时针旋转相同的角度,那么就可以了。类似这样:

double dx = point.x - rectangleCenter.x;
double dy = point.y - rectangleCenter.y;
double newX = rectangleCenter.x - dx*Math.cos(angle) + dy*Math.sin(angle);
double newY = rectangleCenter.x - dx*Math.sin(angle) - dy*Math.cos(angle);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接