Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的旋转矩形_Java_Rotation_Contains - Fatal编程技术网

Java中的旋转矩形

Java中的旋转矩形,java,rotation,contains,Java,Rotation,Contains,我需要创建围绕其中心旋转的矩形(因此它们不需要与坐标系的轴平行)。因此,基本上每个矩形都可以通过中心-X、中心-Y、宽度、高度和角度来定义。然后我想做的是计算某些点是否包含在这些矩形中(因此不涉及绘图)。我想我不能使用Rectangle2D类,因为这些矩形始终与坐标系的x轴和y轴平行。编写我自己的矩形类是获得此功能的唯一方法,或者我是否可以使用任何现有的东西(类似于Rectangle2D)?您可以使用Rectangle2D检查是否包含,而不是将矩形旋转一个角度,比如逆时针,相对于矩形的中心,将需

我需要创建围绕其中心旋转的矩形(因此它们不需要与坐标系的轴平行)。因此,基本上每个矩形都可以通过中心-X中心-Y宽度高度角度来定义。然后我想做的是计算某些点是否包含在这些矩形中(因此不涉及绘图)。我想我不能使用
Rectangle2D
类,因为这些矩形始终与坐标系的x轴和y轴平行。编写我自己的矩形类是获得此功能的唯一方法,或者我是否可以使用任何现有的东西(类似于
Rectangle2D
)?

您可以使用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);

旋转所有要测试的点,并使用矩形2D的contains(Point)方法,就像Mihai所做的一样

但是如果你真的想旋转矩形,你可以这样做(这是整数版本,但是你也可以使用矩形2D:)


我觉得你在描述你找到的解决某个问题的方法。还可以解释您试图解决的特定问题。很有可能,已经存在针对该问题的经验证的解决方案/算法。我想模拟智能天线。所以每个矩形的中心是一个节点(有几个智能天线)。矩形则是简化的信号模式。这意味着矩形将被旋转,以便它们指向接收器节点的方向。然后我想计算某些天线是否在信号模式/矩形中,可能会受到该信号的干扰。因此,我需要一个计算点是否包含在矩形中的方法。我们从哪里获得多边形类?
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));
    }
}