在Java中旋转矩形

时间:2010-11-10 14:42:17

标签: java rotation contains

我需要创建围绕其中心旋转的矩形(因此它们不需要与坐标系的轴平行)。所以basicelly每个矩形可以由 center-X center-Y width height 角度即可。我想要做的是对这些矩形中是否包含某些点进行计算(因此不涉及绘图)。我想我不能使用Rectangle2D类,因为这些矩形将始终与坐标系的x和y轴平行。是通过编写我自己的矩形类来获得此功能的唯一方法,还是我可以使用的任何现有的东西(类似于Rectangle2D)?

2 个答案:

答案 0 :(得分:5)

旋转你要测试的所有点,并使用Rectangle2D的contains(Point)方法作为Mihai。

但是如果你真的想要旋转矩形你就可以这样做(这是整数版本,但你可以用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));
    }
}

答案 1 :(得分: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);
相关问题