Повернуть прямоугольник в Java - PullRequest
4 голосов
/ 10 ноября 2010

Мне нужно создать прямоугольники, которые вращаются вокруг своего центра (чтобы они не были параллельны осям системы координат).Таким образом, каждый прямоугольник может быть определен как center-X , center-Y , ширина , высота и угол .Затем я хочу выполнить расчеты относительно того, содержатся ли определенные точки в этих прямоугольниках или нет (поэтому рисование не будет задействовано).Думаю, я не могу использовать класс Rectangle2D, потому что эти прямоугольники всегда будут параллельны осям x и y системы координат.Это единственный способ получить эту функциональность, написав свой собственный класс прямоугольника, или я могу использовать что-нибудь существующее (подобное Rectangle2D)?

Ответы [ 2 ]

5 голосов
/ 10 ноября 2010

Поверните все точки, которые вы хотите проверить и использовать, содержит метод (Point) Rectangle2D, как это делал Михай.

Но если вы действительно хотите повернуть прямоугольники, вы можете сделать это следующим образом (это целочисленная версия, но, вероятно, вы можете сделать это с помощью Rectangle2D aswell :)).

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));
    }
}
3 голосов
/ 10 ноября 2010

Вы можете использовать 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);
...