protected void GetRelatedGridLineProperties() { double distBetweenPointAndStart, distBetweenPointAndEnd; Dictionary <GridLine, double> lengths = new Dictionary <GridLine, double>(); Dictionary <GridLine, bool> startLabels = new Dictionary <GridLine, bool>(); var gridLines = _fatherGrid.GetObjects(); while (gridLines.MoveNext()) { /* Поиск расстояния между выбранной точкой и концами оси */ GridLine gl = gridLines.Current as GridLine; distBetweenPointAndStart = Distance.PointToPoint(_pickedPoint, gl.StartLabel.CenterPoint); distBetweenPointAndEnd = Distance.PointToPoint(_pickedPoint, gl.EndLabel.CenterPoint); /* Заполнение словаря: Ось-Минимальное расстояние до выбранной точки */ lengths.Add(gl, Math.Min(distBetweenPointAndEnd, distBetweenPointAndStart)); /* Определение близки ли мы к началу оси */ if (distBetweenPointAndEnd < distBetweenPointAndStart) { _isStartLabel = false; } else { _isStartLabel = true; } startLabels.Add(gl, _isStartLabel); } /* * Поиск ближайшей оси через сортировку словаря * Для малого количества объектов - норм */ var minKeyValue = lengths.OrderBy(kvp => kvp.Value).First(); _relatedGridLine = minKeyValue.Key; /* Близость к началу оси на ближайшей оси */ _isStartLabel = startLabels[_relatedGridLine]; /* Размеры рамки */ if (_isStartLabel) { _frameHeight = _relatedGridLine.StartLabel.FrameHeight; _frameWidth = _relatedGridLine.StartLabel.FrameWidth; } else { _frameHeight = _relatedGridLine.EndLabel.FrameHeight; _frameWidth = _relatedGridLine.EndLabel.FrameWidth; } }