【问题标题】:checking if a point is inside a specified Rectangle检查一个点是否在指定的 Rectangle 内
【发布时间】:2011-03-17 20:44:25
【问题描述】:

好的,所以我正在为一个 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 类,这就是我要求Point p 参数的原因。为了测试这个boolean,我在我的主类中创建了一个简单的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 语句没有显示,这意味着我创建的boolean 肯定有问题但我没有看到错误,也许我的头是多云,但有人可以向我指出这里出了什么问题吗?

附:这都是控制台工作,我不是在处理一些 GUI 或图形编程。

【问题讨论】:

标签: java geometry


【解决方案1】:

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);
    }
}

您通常不想重新实现功能或扩展类。

【讨论】:

  • 我可以知道你为什么不想扩展类吗?
  • 这在大多数情况下不适用,因为它不支持浮点值。
【解决方案2】:

我觉得没问题。我会检查你的测试用例是否真的有你认为的数字;我还会检查您的访问器是否都返回了正确的值(我无法告诉您我将 getX() 实现为 {return this.y;} 的次数)。除此之外,这是任何人的猜测。

【讨论】:

  • 谢谢,在我的代码中有一部分我混合了一个点的宽度和高度值,而不是 x 表示宽度,y 表示高度,我有 y 表示宽度,x 表示高度.
  • @mastrgamr 这就是遵循主要规则之一的原因 - 您应该使用显示其用法的名称来命名您的字段和方法,所以,请尝试使用 int width int x
【解决方案3】:

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

这意味着你应该颠倒你的条件

【讨论】:

  • 不走运,也许值得一提的是我不处理图形,这都是控制台工作。
  • 无论方向如何,所涉及的条件都保持不变。
【解决方案4】:

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

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

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

当我将这个公式化为实际的 Java 代码时,我不得不处理这样一种情况: 小数部分有 15 个 9 的面积值被四舍五入到最接近的整数。

参考此代码:

import static java.lang.Math.sqrt;

public class PointInsideRect
{
    private static double square(double n)
    {
        return n*n;
    }
    private static double areaOfTriangle(
                int xa, int ya,
                int xb, int yb,
                int px, int py )
    {
        double side1 = sqrt(square(ya-yb) + square(xa-xb));
        double side2 = sqrt(square(ya-py) + square(xa-px));
        double side3 = sqrt(square(yb-py) + square(xb-px));

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

        return sqrt(semi_perimeter
                    * ( semi_perimeter - side1 )
                    * ( semi_perimeter - side2 )
                    * ( semi_perimeter - side3 ));
    }

    private static double areaOfRect(
                int x1, int y1,
                int x2, int y2,
                int x3, int y3,
                int x4, int y4 )
    {
        double side1 = sqrt(square(y1-y2) + square(x1-x2));
        double side2 = sqrt(square(y2-y3) + square(x2-x3));
        return side1 * side2;
    }

    public boolean check(
                int x1, int y1,
                int x2, int y2,
                int x3, int y3,
                int x4, int y4, 
                int pointX, int pointY)
    {
        double tri1Area = areaOfTriangle(x1,y1, x2,y2, pointX,pointY);
        double tri2Area = areaOfTriangle(x2,y2, x3,y3, pointX,pointY);
        double tri3Area = areaOfTriangle(x3,y3, x4,y4, pointX,pointY);
        double tri4Area = areaOfTriangle(x4,y4, x1,y1, pointX,pointY);

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

        double triAreaSum = tri1Area + tri2Area + tri3Area+ tri4Area;


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


    public static void main(String[] args)
    {
        PointInsideRect inRect = new PointInsideRect();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多