Идея состоит в том, чтобы убедиться, что положение любого объекта ограничено определенным набором номеров; то есть конечная позиция должна быть округлена и находиться в пределах этого набора.
Набор состоит из всех факторов для произвольного числа, j
; j
контролирует силу «привязки» и определяет, какие числа появляются в наборе. Новая позиция, опять же, должна состоять только из чисел, которые появляются в наборе.
Например, скажем, исходная позиция объекта (5, 0)
, и мы хотим переместить его в (16, 23)
. Давайте продолжим и сделаем снимок 5 : это означает, что положение объекта может состоять только из факторов 5 . Исходная позиция уже попадает в этот набор, а новая позиция - нет.
Чтобы смоделировать «привязку», новая позиция должна упасть либо на (15,20)
, либо на (20, 25)
. Нахождение ближайшего множителя 16 и 23 , даст вам правильную точку. В большинстве случаев необходимо округлить результат.
* ** 1023 тысяча двадцать-дв * Пример
//Get original point of object relative to container element
var original_point = e.GetPosition(sender);
//Calculate new x and y position based on mouse
//var new_x = ...
//var new_y = ...
//New position must be multiple of 8
var snap = 8;
//Get nearest factor of result position
new_x = original_point.X.NearestFactor(snap);
new_y = original_point.Y.NearestFactor(snap);
public static double NearestFactor(this double Value, double Factor)
{
return Math.Round((Value / Factor), MidpointRounding.AwayFromZero) * Factor;
}
Само собой разумеется, что этот алгоритм можно использовать и при изменении размера объекта, чтобы обеспечить как привязку позиции, так и размера объекта.