2014-02-07 7 views
0

Мне интересно, может ли кто-нибудь из вас взглянуть на мой код метода и помочь мне разобраться, что делает его неисправным? Это простая задача по определению того, что или два прямоугольника перекрывают/перехватывают/касаются друг друга. Я искал на форуме и изучал тест/теорему разделительной оси. Оно работает. частично. Но проблема возникает, когда у меня есть два прямоугольника, которые не имеют одинаковых размеров. Heres код:Устранение неполадок метода

public boolean contains(MyRectangle2D x, MyRectangle2D y){ 

    if(Math.abs(xAxisDistance(x, y)) - Math.abs(centerToPerimeterXDistance(x)) - Math.abs(centerToPerimeterYDistance(y)) > 0) 
     return false; 
    if(Math.abs(yAxisDistance(x, y)) - Math.abs(centerToPerimeterXDistance(x)) - Math.abs(centerToPerimeterYDistance(y)) > 0) 
     return false; 
    else 
     return true; 
} 

public double xAxisDistance(MyRectangle2D x, MyRectangle2D y){ 
    return x.getXCenter() - y.getXCenter(); 
} 
public double yAxisDistance(MyRectangle2D x, MyRectangle2D y){ 
    return x.getYCenter() - y.getYCenter(); 
} 
public double centerToPerimeterXDistance(MyRectangle2D x){ 
    return x.getWidth()/2; 

} 

public double centerToPerimeterYDistance(MyRectangle2D x){ 
    return x.getHeight()/2; 
} 

Короче говоря: у меня есть два if-предложения. один проверяет ось x, а другой проверяет ось y. И если расстояния между кругами меньше нуля, они перекрываются. Он отлично работает, когда круги имеют одинаковые размеры, но если один круг имеет большую высоту для eksample. он «перекрывается», когда его далеко.

Любой вход, который может подтолкнуть меня в правильном направлении для устранения этого, будет израсходован!

Heres what the program looks like

+1

Я не мог воспроизвести вашу проблему. Вероятно, ваша ошибка в другой части кода. (Может быть, неправильный геттер или сеттер в 'MyRectangle2D'?) – Kayz

+0

Да, это может быть и так. плохо смотреть в это! – Surangie

ответ

0

В ошибка была в моем методе contains-method.

Я должен был вычесть centerToPerimeterXDistance обоих прямоугольников. Но вместо этого у меня было centerToPerimeter_Y_Distance. Просто изменил его на X. и он работал как шарм: D

0

Интересно, идет ли речь о «кругах» во втором абзаце. И, по общему признанию, я не совсем понял, что вы на самом деле на самом деле сейчас там делаете.

Однако suggestsion: Для испытаний пересечения, некоторые небольшие вспомогательные методы могут быть полезны ...:

private static float getMinX(MyRectangle2D r) 
{ 
    return r.getXCenter() - r.getWidth()/2; 
} 
private static float getMinY(MyRectangle2D r) 
{ 
    return r.getYCenter() - r.getHeight()/2; 
} 
private static float getMaxX(MyRectangle2D r) 
{ 
    return r.getXCenter() + r.getWidth()/2; 
} 
private static float getMaxY(MyRectangle2D r) 
{ 
    return r.getYCenter() + r.getHeight()/2; 
} 

С этим, тесты пересечения становятся довольно просто:

private static boolean intersect(MyRectangle r0, MyRectangle r1) 
{ 
    if (getMaxX(r0) < getMinX(r1)) return false; 
    if (getMaxY(r0) < getMinY(r1)) return false; 
    if (getMinX(r0) > getMaxX(r1)) return false; 
    if (getMinX(r0) > getMaxY(r1)) return false; 
    return true; 
} 
+0

Предполагается, что это прямоугольники во втором абзаце, извините: P – Surangie

Смежные вопросы