Для визуализации возьмите цифровую клавиатуру клавиатуры. Если ключ '5' представляет Ваш прямоугольник, то все ключи 1-9 представляют 9 квадрантов пространства, разделенного на строки, которые составляют Ваш прямоугольник (с 5 являющийся внутренней частью.)
1), Если центр круга находится в квадранте 5 (т.е. в прямоугольнике) тогда, две формы пересекаются.
С этим из пути, существует два возможных случая: a) Круг пересекается с двумя или больше соседними краями прямоугольника. b) Круг пересекается с одним краем прямоугольника.
первый случай прост. Если круг пересекается с двумя соседними краями прямоугольника, он должен содержать угол, соединяющий те два края. (Что, или его центр находится в квадранте 5, который мы уже покрыли. Также обратите внимание, что случай, где круг пересекается с только двумя противопоставление края прямоугольника, покрыт также.)
2), Если какой-либо из углов A, B, C, D прямоугольника лежит в кругу, то две формы пересекаются.
второй случай более хитер. Мы должны сделать примечание, которого это может только произойти, когда центр круга находится в одном из квадрантов 2, 4, 6 или 8. (На самом деле, если центр будет на каком-либо из квадрантов 1, 3, 7, 8, соответствующий угол будет самой близкой точкой к нему.)
Теперь у нас есть случай, что центр круга находится в одном из 'граничных' квадрантов, и это только пересекается с соответствующим краем. Затем точка на краю, который является самым близким к центру круга, должна лечь в кругу.
3) Для каждого AB строки, до н.э, CD, DA, создает перпендикулярные строки p (AB, P), p (до н.э, P), p (CD, P), p (DA, P) через центр круга P. Для каждой перпендикулярной строки, если пересечение с исходным краем находится в кругу, то две формы пересекаются.
существует ярлык для этого последнего шага. Если центр круга будет в квадранте 8, и граничный AB является главным краем, точка пересечения будет иметь y-координату A и B, и x-координату центра P.
можно создать четыре пересечения строки и проверить, лежат ли они на своих соответствующих краях или узнают, в котором находится квадрант P, и проверьте соответствующее пересечение. Оба должны упростить до того же булевого уравнения. Опасайтесь этого, шаг 2 выше не исключил P, находящийся в одном из 'угловых' квадрантов; это просто искало пересечение.
Редактирование: Как оказалось, я пропустил очевидный факт, что № 2 является подслучаем № 3 выше. В конце концов, углы также являются точками на краях. См. ответ @ShreevatsaR ниже для большого объяснения. И в это время, забудьте № 2 выше, если Вы не хотите быструю, но избыточную проверку.
По умолчанию проверки выполняются как для создания, так и для обновления. Так что это должно быть просто:
validates_presence_of :password
Клавиша: on просто позволяет вам выбрать один из них.
Only write:
validates_presence_of :password
No need...
on => :create