проверка, находится ли точка внутри заданного прямоугольника
ok, поэтому я делаю назначение для класса 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". Чтобы проверить это логическое значение, я создал простой оператор " 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 ответов
Мне кажется, все в порядке. Я бы проверил, что ваш тестовый случай действительно имеет номера, которые вы думаете, что он делает; я бы также проверил, что все ваши аксессоры возвращают правильные значения (я не могу сказать вам, сколько раз я реализовал getX() как {return this.год.)}; Кроме того, что это-чье-либо предположение.
AWT прямоугольник уже имеет 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);
}
}
вы обычно не хотите переопределять функции или расширять классы.
обычно при работе с компьютерной графикой верхняя левая точка (0,0) и нижний правый угол (ширина, высота).
Это означает, что вы должны изменить свое условия
хотя это наивный метод, я попробовал следующую концепцию:
если точка (px,py) находится внутри данного прямоугольника, сумма площадей треугольников, образованных соединением двух точек прямоугольника и данной точки (скажем, против часовой стрелки или по часовой стрелке), будет равна сумме прямоугольника.
У меня есть изображение для того же самого, но из-за низкой репутации (поскольку я новичок), не могу опубликовать его.
когда я формулировал это в фактический Java-код, мне пришлось справиться с ситуацией, когда значение области с десятичной частью, имеющей 15 9s, было округлено до ближайшего целого числа.
передать этот код:
открытый класс 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));
}
}