检查一个点是否在指定的Rectangle内

时间:2011-03-17 20:44:26

标签: java geometry

好的,所以我正在为Java类做一个赋值,并且赋值的一部分是找出一个点是否在矩形的维度内。所以我创建了这段代码:

    public boolean contains(Point p){
        return (this.getLocation().getX() < p.getX() && this.getLocation().getY() < p.getY() &&
                this.getLocation().getX() + this.getWidth() > p.getX()  &&
                this.getLocation().getY() + this.getHeight() > p.getY());
    }

我也创建了一个点类,这就是我要求“Point p”参数的原因。为了测试这个布尔值,我在Main类中创建了一个简单的“if”语句:

//check if one rectangle's point is inside another
                if (rectangle.contains(rectangle2.getLocation()))
                    System.out.println("the point is in the rectangle");

该点的位置是(6,7)。矩形1的点,宽度和高度分别为(4,5),9和3。我知道这一点是在第一个矩形内部,但是println语句没有显示,这意味着我创建的布尔值必定存在问题,但我没有看到错误,也许我的头是阴天但是可以有人指出我这里有什么问题?

P.S。这是所有的控制台工作,我没有处理一些GUI或图形编程。

4 个答案:

答案 0 :(得分:9)

AWT Rectangle已经有contains方法。 (link

如果您了解命名空间如何冲突,那么任务就好了。例如,如果你很懒(这是程序员最钦佩的品质之一),那么你可以写:

public static class Rectangle {
    java.awt.Rectangle _r;

    public Rectangle(int x, int y) {
        this._r = new java.awt.Rectangle(x, y);
    }
    public boolean contains(Point p) {
        return this._r.contains(p);
    }
}

您通常不希望重新实现功能,也不希望扩展类。

答案 1 :(得分:4)

对我来说没问题。我会检查你的测试用例实际上是否有你认为的数字;我还会检查你的访问者是否都返回正确的值(我不能告诉你我将getX()实现为{return this.y;})的次数。除此之外,这是任何人的猜测。

答案 2 :(得分:1)

通常在处理计算机图形时,左上角为(0,0),右下角为(宽度,高度)。

这意味着你应该改变你的条件

答案 3 :(得分:0)

虽然它是一种天真的方法,但我尝试了以下概念:

如果Point(px,py)在给定矩形内,则通过连接2个矩形点和给定点(例如逆时针或顺时针方向)形成的三角形区域的总和将等于矩形。

我有相同的照片,但由于声誉低(因为我是新手),无法发布。

当我将其编写为实际的Java代码时,我不得不处理这样的情况 具有15个9的小数部分的区域值被舍入到其最接近的整数。

参考此代码:

public class pointInsideRect {

public static double areaOfTriangle(int xa,int ya, int xb, int yb, int px, int py)
{
    double side1 = Math.sqrt(Math.pow(Math.abs(ya-yb),2) + Math.pow(Math.abs(xa-xb),2));
    double side2 = Math.sqrt(Math.pow(Math.abs(ya-py),2) + Math.pow(Math.abs(xa-px),2));
    double side3 = Math.sqrt(Math.pow(Math.abs(yb-py),2) + Math.pow(Math.abs(xb-px),2));

    double semi_perimeter = (side1+side2+side3)/2;

    double area = Math.sqrt(semi_perimeter*(semi_perimeter-side1)*(semi_perimeter-side2)*(semi_perimeter-side3));

    return area;
}


public static double areaOfRect(int x1, int y1,
         int x2, int y2,
         int x3, int y3,
         int x4, int y4)
{

    double side1 = Math.sqrt(Math.pow(Math.abs(y1-y2),2) + Math.pow(Math.abs(x1-x2),2));
    double side2 = Math.sqrt(Math.pow(Math.abs(y2-y3),2) + Math.pow(Math.abs(x2-x3),2));

    double area = side1*side2;

    return area;

}



public boolean check(int x1, int y1,
                     int x2, int y2,
                     int x3, int y3,
                     int x4, int y4, 
                     int pointX, int pointY)
{   

    double trinagle1Area = areaOfTriangle(x1, y1, x2, y2, pointX, pointY);
    double trinagle2Area = areaOfTriangle(x2, y2, x3, y3, pointX, pointY);
    double trinagle3Area = areaOfTriangle(x3, y3, x4, y4, pointX, pointY);
    double trinagle4Area = areaOfTriangle(x4, y4, x1, y1, pointX, pointY);



    double rectArea = areaOfRect(x1, y1, x2, y2, x3, y3, x4, y4);

    double triangleAreaSum = (trinagle1Area+trinagle2Area+trinagle3Area+trinagle4Area);


    if(triangleAreaSum%(Math.pow(10, 14))>=0.999999999999999)
    {
        triangleAreaSum = Math.ceil(triangleAreaSum);
        System.out.println(triangleAreaSum);
    }

    if(triangleAreaSum==rectArea)
        return true;
    else
        return false;
}


public static void main(String[] args)
{
    pointInsideRect obj = new pointInsideRect();


    System.out.println(obj.check(1, 1, 1, 3, 3, 3, 3, 1, 2, 2));




}


}