2013-03-21 5 views
1

Я только что начал с программирования Win32 GUI, несколько дней назад. Я пытаюсь сделать простую игру, в которой мне нужно обнаружить столкновение между двумя объектами. Так что я сделал мои символы используя RECT-структуруvisual C++ RECT collision

Для того, чтобы обнаружить, если они сталкиваются я использовал:

// Returns 1 if the point (x, y) lies within the rectangle, 0 otherwise 
int is_point_in_rectangle(RECT r, int x, int y) { 
    if ((r.left <= x && r.right >= x) && 
     (r.bottom <= y && r.top >= y)) 
     return 1; 
    return 0; 
} 

// Returns 1 if the rectangles overlap, 0 otherwise 
int do_rectangles_intersect(RECT a, RECT b) { 
    if (is_point_in_rectangle(a, b.left , b.top ) || 
     is_point_in_rectangle(a, b.right, b.top ) || 
     is_point_in_rectangle(a, b.left , b.bottom) || 
     is_point_in_rectangle(a, b.right, b.bottom)) 
     return 1; 
    if (is_point_in_rectangle(b, a.left , a.top ) || 
     is_point_in_rectangle(b, a.right, a.top ) || 
     is_point_in_rectangle(b, a.left , a.bottom) || 
     is_point_in_rectangle(b, a.right, a.bottom)) 
     return 1; 
    return 0; 
} 

который я нашел на вопрос здесь, и это, кажется, работает в ситуациях, как this. Но есть небольшая проблема с этой ситуацией here

Есть ли способ исправить это? Я делаю это неправильно? Должен ли я попробовать другой подход? Любой совет поможет.

ответ

1

Очевидно проверка, если углы одного прямоугольника внутри другого плохая идея:

Intersecting rectangles

Простой способ сделать чек вместо этого:

if (a.left >= b.right || a.right <= b.left || 
    a.top >= b.bottom || a.bottom <= b.top) { 

    // No intersection 

} else { 

    // Intersection 

} 
+0

Спасибо я в конечном итоге добавив это в конце функции, которую я первоначально использовал, и, похоже, выполняет эту работу. –

+0

Этот код выполняет всю проверку, и он может ** полностью заменить ** эту функцию. Попытайтесь провести некоторое время с бумагой и карандашом, чтобы понять, почему этого достаточно для всех возможных случаев. – 6502

+0

Я просто протестировал его, и он, похоже, не работает в этом случае. Http://puu.sh/2lrXw –

0

Данное решение является недопустимым. У вас может быть два прямоугольника, пересекающихся, не имея ни одной из вершин любого из них, лежащих в другом. Например, ((0,0), (10,10)) и ((5,-5), (7, 15)). Попробуйте проверить, соответствует ли сторона одного из прямоугольников, пересекающих другой прямоугольник.