2016-09-15 8 views
1

Добрый день для всех! Итак, у меня есть такой случай, как this one. Мне нужно написать метод, который говорит, что прямоугольники перекрывают друг друга. Входы следующие: высота, ширина, x-pos и y-pos и прямоугольники параллельны оси x и y. Я использовал решение из questio, которому я дал ссылку, но он работает неправильно. Он говорит, что прямоугольники перекрываются, даже если они этого не делают! Я пропустил что-то важное?Перекрывающиеся прямоугольники

сам код:

public static bool AreIntersected(Rectangle r1, Rectangle r2) 
    { 
    return (!(r1.Left > r2.Left + r2.Width) || !(r1.Left + r1.Width < r2.Left) || !(r1.Top < r2.Top - r2.Height)|| !(r1.Top - r1.Height > r2.Top)); 
    }  

Screen of the error

And here it works just fine

Большое спасибо за вашу помощь!

+0

Это один из ответов, полученных на этот вопрос? Если нет, то почему вы создали свою собственную версию, когда есть простые, простые, высокозатратные решения, которые вы могли бы использовать? – adv12

+0

Существует уже [Rectangle.Intersect] (https://msdn.microsoft.com/en-us/library/y10fyck0 (v = vs.110) .aspx) метод –

+0

Это один из ответов на этот вопрос, и это не сработало. И я не могу использовать уже существующий метод, это часть задачи, чтобы создать свой собственный метод. (так что я, вероятно, должен немного изменить вопрос) –

ответ

1

Ответ на странице вы связаны , Единственное изменение вашего кода было бы заменить rx.Right на rx.Left + rx.Width и rx.Bottom с rx.Top + rx.Height.

return !(r1.Left > r2.Left + r2.Width) && 
     !(r1.Left + r1.Width < r2.Left) && 
     !(r1.Top > r2.Top + r2.Height) && 
     !(r1.Top + r1.Height < r2.Top); 

Затем снова, я предполагаю, что у вас есть свой собственный Rectangle класс, который вы используете. Если вы используете .NET Rectangle struct, этот объект имеет свойства Right и Bottom, поэтому замена кода не требуется.

return !(r1.Left > r2.Right) && 
     !(r1.Right < r2.Left) && 
     !(r1.Top > r2.Bottom) && 
     !(r1.Bottom < r2.Top); 

Конечно, вы также можете так же легко использовать статический метод Rectangle.Intersect.

return !Rectangle.Intersect(r1, r2).IsEmpty; 
+0

Добавление r.Height r.Top вместо вычитания помог! Я просто не понимаю, почему мы должны добавить его? Нам даны координаты верхнего левого угла, и, добавляя высоту, мы двигаемся вверх по оси y, но сторона прямоугольника должна находиться под верхней левой точкой. –

+0

В пространстве экрана компьютера точка (0,0) находится в верхнем левом углу окна, а вверх в направлении Y означает движение вниз по окну. Поэтому, когда у вас есть координата X и Y прямоугольника, это левая и верхняя стороны, поэтому Left + Width Right и Top + Height is Bottom. – Abion47

1

Использование Rectangle.Intersect:

public static bool AreIntersected(Rectangle r1, Rectangle r2) 
{ 
    return !Rectangle.Intersect(r1, r2).IsEmpty; 
} 

Если вы не можете использовать Rectangle.Intersect:

public static bool AreIntersected(Rectangle r1, Rectangle r2) 
{ 
    int x1 = Math.Max(r1.X, r2.X); 
    int x2 = Math.Min(r1.X + r1.Width, r2.X + r2.Width); 
    int y1 = Math.Max(r1.Y, r2.Y); 
    int y2 = Math.Min(r1.Y + r1.Height, r2.Y + r2.Height); 

    return (x2 >= x1 && y2 >= y1); 
} 

Другой подход:

public static bool AreIntersected(Rectangle r1, Rectangle r2) 
{ 
    return(r2.X < r1.X + r1.Width) && 
     (r1.X < (r2.X + r2.Width)) && 
     (r2.Y < r1.Y + r1.Height) && 
     (r1.Y < r2.Y + r2.Height); 
} 
0

Эти два подхода эквивалентны - вы смешали || и & &

public static bool AreIntersected(Rectangle r1, Rectangle r2) 
{ 
    bool test1 = ((r1.Left > r2.Left + r2.Width) || (r1.Left + r1.Width < r2.Left) || (r1.Top < r2.Top - r2.Height)|| (r1.Top - r1.Height > r2.Top)); 
    bool test2 = (!(r1.Left > r2.Left + r2.Width) && !(r1.Left + r1.Width < r2.Left) && !(r1.Top < r2.Top - r2.Height) && !(r1.Top - r1.Height > r2.Top)); 
    return test1; // or test2 as they are logically equivalent 
}   
Смежные вопросы