Это действительно походит на академический вопрос.
решение, которое приходит на ум, включает r* деревья. Это делит Вашу общую площадь на индивидуально размерный и возможно перекрывающиеся поля. После выполнения этого можно тогда определить, представляет ли каждое поле 'кластер' или не для Вас путем вычисления среднего расстояния.
, Если тот подход становится трудным реализовать Вас, могут быть более обеспеченным разделением Вашего datagrid в подразделения равного размера и определение, если кластер происходит в каждом; необходимо будет очень помнить граничные условия с этим подходом все же. Я предложил бы, чтобы после начального подразделения Вы прошли и повторно объединили области с точками данных в определенном пороге определенного края.
А как насчет простого использования ломаной линии?
Вот xaml:
<Window
x:Class="CursorLine.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
>
<Canvas x:Name="canvas" Background="#00FFFFFF" MouseMove="Canvas_MouseMove">
<Polyline x:Name="polyline" Stroke="DarkGreen" StrokeThickness="3"/>
</Canvas>
</Window>
Вот код:
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
polyline.Points.Add(e.GetPosition(canvas));
}
Используйте GeometryGroup. Это может иметь несколько дочерних геометрий: в вашем случае вы должны добавить EllipseGeometry для каждой точки перемещения мыши с центром в местоположении мыши. Примерно так:
private GeometryGroup _allMousePoints = new GeometryGroup();
void OnMouseMove(...)
{
_allMousePoints.Children.Add(
new EllipseGeometry {
Center = mouseLocation,
RadiusX = 3,
Radius Y = 3
});
}
Теперь вы можете использовать _allMousePoints как геометрию объекта GeometryDrawing или данные пути.