accept,решения:
1) [самое примитивное] решение увеличить шаг в верх методом подбора
2) когда расстояние до блока <= шагу то при нажатие в сторону блока квадрат прилипает к нужно стороне блока ( так как если изменить шаг то будет так
http://jsfiddle.net/3c4093p4/1/ ), что бы не было проблемы с колизиями на углах с верху или низу, варианты:
1) представить весь canvas как сетку, и тогда шаг квалрата будет равен к примеру одна клеточка, а конечный блок 3 клетки и тогда не будет проблема.
2) проверять если 95% квадрата находятся выше/ниже блока то смещать на не достающее растояние в верх/низ + в нужную сторону
ваша функция фигня