проверка, находится ли точка внутри указанного прямоугольника - PullRequest
7 голосов
/ 17 марта 2011

хорошо, поэтому я делаю назначение для класса 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());
    }

Я также создал класс точек, поэтому попросил параметр «Точка р». Чтобы проверить это логическое значение, я создал простой оператор if в своем классе Main:

//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. Это все работа консоли, я не имею дело с графическим интерфейсом или графическим программированием.

Ответы [ 4 ]

9 голосов
/ 18 марта 2011

AWT Rectangle уже имеет метод contains.( ссылка )

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

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

Как правило, вы не хотите переопределять функции или расширять классы.

4 голосов
/ 17 марта 2011

Это выглядит нормально для меня.Я бы проверил, что в вашем тестовом примере действительно есть числа, которые, как вы думаете, есть;Я также проверил бы, что все ваши методы доступа возвращают правильные значения (я не могу сказать вам, сколько раз я реализовывал getX () как {return this.y;}).Кроме этого это чья-то догадка.

1 голос
/ 17 марта 2011

Обычно при работе с компьютерной графикой верхняя левая точка (0,0), а нижний правый угол (ширина, высота).

Это означает, что вы должны отменить свои условия

0 голосов
/ 03 января 2014

Хотя это наивный метод, я попробовал следующую концепцию:

Если точка (px, py) находится внутри данного прямоугольника, сумма площадей треугольников, образованных соединением двух точек прямоугольника и данной точки (скажем, против часовой стрелки или по часовой стрелке), будет равна прямоугольник.

У меня есть фотография для того же самого, но из-за низкой репутации (поскольку я новичок), я не могу опубликовать ее.

Когда я формулировал это в реальный код Java, мне приходилось справляться с ситуацией, когда значение области с десятичной частью, имеющей 15 9 с, было округлено до ближайшего целого числа.

См. Этот код:

открытый класс 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));




}


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...