如何使用Java检查两个矩形几何之间的空间关系

时间:2016-08-06 03:19:27

标签: java geometry

所以我有这个程序需要测试两个矩形并检查:

  1. 如果测试矩形在参考矩形
  2. 如果测试矩形与参考矩形重叠
  3. 如果测试矩形仅与参考矩形共享边框
  4. 如果测试矩形和参考矩形是不同的
  5. 参考和测试矩形的中心坐标(x,y)及其宽度和高度都是定义的。

    我相信我的第一张支票编码正确,但我无法弄清楚重叠,共享边界和完全不同的最后三项检查的数学。

    以下是我目前为止进行的四项检查的代码:

        //returns true if the specified rectangle is inside this rectangle
        public boolean contains(MyRectangle2D r){
               if(this.x > r.x + r.width && x + width < r.x && y > r.y +r.height                    && y + height < r.y){
            return true;
        }
        else{
            return false;
        }
        }
    
        //returns true if the specified rectangle overlaps with this rectangle 
        public boolean overlaps(MyRectangle2D r) {
        if (this.x < r.x + r.width && x + width > r.x && y < r.y + r.height && y + height > r.y){
            return true;
        }
        else{
            return false;
        }
        }
    
        //returns true if only the boundaries touch
        public boolean abut(MyRectangle2D r) {
           if(this.x = r.x + r.width && x + width = r.x || y = r.y +r.height && y + height = r.y){
            return true;
        }
        else{
            return false;
        }
    }
    
         //returns true if the rectangles are not touching at all 
         public boolean distinct(MyRectangle2D r) {
    
         }
    

1 个答案:

答案 0 :(得分:0)

您可以使用Java Topolygy Suite(JTS):

  • 首先,您可以使用org.locationtech.jts.util.GeometricShapeFactoryAPI)创建包含参数的矩形:
  • 然后您可以使用withinAPI
  • 定义的空间关系(overlapsorg.locationtech.jts.geom.Geometry,...)

简单代码:

// method to create your rectangles like before (Polygon objects)
public static Polygon createPolygon(Coordinate center, double width, double height){
    GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
    shapeFactory.setNumPoints(4);
    shapeFactory.setCentre(center);
    shapeFactory.setWidth(width);
    shapeFactory.setHeight(height);
    return shapeFactory.createRectangle();
}

public static void main(String[] args) {

    // create your rectagles
    Polygon rectangleA = createPolygon(new Coordinate(0, 0), 5, 10);
    Polygon rectangleB = createPolygon(new Coordinate(2, 0), 5, 10);

    // ### check your constraints
    // 1. rectangle is within the reference rectangle
    boolean bWithinA = rectangleB.within(rectangleA); // false

    // 2. rectangle is overlapping the reference rectangle
    boolean bOverlappingA = rectangleB.overlaps(rectangleA); // true

    // 3. rectangle is only sharing a border with the reference rectangle
    boolean bSharesBorderA = rectangleB.touches(rectangleA); // false

    // 4. rectangle and reference rectangle are distinct
    boolean bDistinctsA = rectangleB.disjoint(rectangleA); // false 
}