给定100个二维随机坐标点,针对X坐标对坐标进行聚类,聚类阈值最小值为1,聚类阈值最大值为5,如果X坐标间的距离处于阈值范围内,则按密度情况对X坐标进行聚类,聚类情况用不同颜色标记出来,并把些点用不同的聚类颜色显示在窗体上,请给出以上的C#代码和详细注释
时间: 2024-03-26 10:35:32 浏览: 47
最大最小聚类代码
5星 · 资源好评率100%
首先,我们需要定义一个二维坐标点的类:
```
public class Point2D
{
public double X { get; set; }
public double Y { get; set; }
}
```
接下来,我们定义一个聚类器的类,用于对坐标进行聚类:
```
public class Clustering
{
private double _minDistance;
private double _maxDistance;
public Clustering(double minDistance, double maxDistance)
{
_minDistance = minDistance;
_maxDistance = maxDistance;
}
public List<List<Point2D>> Cluster(List<Point2D> points)
{
List<List<Point2D>> clusters = new List<List<Point2D>>();
foreach (Point2D point in points)
{
bool added = false;
foreach (List<Point2D> cluster in clusters)
{
if (cluster.Any(p => Math.Abs(p.X - point.X) <= _maxDistance))
{
cluster.Add(point);
added = true;
break;
}
}
if (!added)
{
List<Point2D> newCluster = new List<Point2D>();
newCluster.Add(point);
clusters.Add(newCluster);
}
}
return clusters;
}
}
```
在聚类器的构造函数中,我们传入了最小和最大聚类距离。在 `Cluster` 方法中,我们遍历每个点,并检查它是否可以被添加到已有的聚类中。如果一个点的 X 坐标和某个聚类中的任一点的 X 坐标之差小于等于最大距离,则可以将该点添加到该聚类中。否则,我们将该点添加到一个新聚类中。
最后,我们可以在窗体上绘制聚类后的点:
```
private void DrawClusters(List<List<Point2D>> clusters)
{
Graphics g = pictureBox1.CreateGraphics();
Random random = new Random();
foreach (List<Point2D> cluster in clusters)
{
Color color = Color.FromArgb(random.Next(256), random.Next(256), random.Next(256));
Brush brush = new SolidBrush(color);
foreach (Point2D point in cluster)
{
int x = (int)point.X;
int y = (int)point.Y;
g.FillEllipse(brush, x, y, 5, 5);
}
}
}
```
在 `DrawClusters` 方法中,我们遍历每个聚类,并为每个聚类生成一个随机颜色。然后,我们遍历聚类中的每个点,并将其绘制为一个半径为 2.5 像素的圆。注意,我们使用了 `pictureBox1` 控件来绘制图形。
最后,我们可以在主函数中使用聚类器进行聚类,并调用 `DrawClusters` 方法来在窗体上显示聚类后的点:
```
List<Point2D> points = new List<Point2D>();
// 假设我们已经有了100个二维坐标点
Clustering clustering = new Clustering(1, 5);
List<List<Point2D>> clusters = clustering.Cluster(points);
DrawClusters(clusters);
```
阅读全文