private void MagnetBot(object source, BaseShape other) { if (other == null) { return; } //determine relationship for pivot and its new head. if (other.IsTail()) { //other is a single //calculate the position of pivot. _pivot.X = other.X; var delta = Math.Abs(other.InnerLowerY + 8.8 - _pivot.Y); _pivot.Y = other.InnerLowerY + 8.8; //calculate the next shape head by pivot. _pivot.DoAllWithoutHead(i => { i.X = other.X; i.Y -= delta; }); } else { // when drag pivot in middle of two shape //calculate the position of pivot. _pivot.X = other.X; var delta = Math.Abs(other.InnerLowerY + 8.8 - _pivot.Y); _pivot.Y = other.InnerLowerY + 8.8; double totalHeight = 0; _pivot.DoAllWithoutHead(i => { i.X = other.X; i.Y -= delta; totalHeight += i.Height + 8.8; }); other.Next.Y += totalHeight; //calculate the next shape head by pivot. var next = other.Next; next.Prev = _pivot.GetTail(); _pivot.GetTail().Next = next; } other.Next = _pivot; _pivot.Prev = other; _pivot.StrokeColor = Transparent; other.StrokeColor = Transparent; _previousState.Clear(); }