坐标X或Y(也可把坐标X、Y看作数组)根据给定的一堆坐标(随机),进行分组的算法。
坐标数据:
坐标:X=163,Y=83
坐标:X=164,Y=83
坐标:X=197,Y=83
坐标:X=198,Y=83
坐标:X=163,Y=84
坐标:X=164,Y=84
坐标:X=197,Y=84
坐标:X=198,Y=84
坐标:X=163,Y=85
坐标:X=164,Y=85
坐标:X=199,Y=85
坐标:X=199,Y=85
…… 要把以上坐标分组成如下:
Point[] Group1 = {{163,83},{164,83},{163,84},{164,84},{163,85},{164,85}}
Point[] Group2 = {{197,83},{198,83},{197,84},{198,84},{197,85},{198,85}}
…… 分组规则:只要X或Y其中一个能从数据中找到连续的就分为一组。如下图每个几何图形分为一组。
坐标数据:
坐标:X=163,Y=83
坐标:X=164,Y=83
坐标:X=197,Y=83
坐标:X=198,Y=83
坐标:X=163,Y=84
坐标:X=164,Y=84
坐标:X=197,Y=84
坐标:X=198,Y=84
坐标:X=163,Y=85
坐标:X=164,Y=85
坐标:X=199,Y=85
坐标:X=199,Y=85
…… 要把以上坐标分组成如下:
Point[] Group1 = {{163,83},{164,83},{163,84},{164,84},{163,85},{164,85}}
Point[] Group2 = {{197,83},{198,83},{197,84},{198,84},{197,85},{198,85}}
…… 分组规则:只要X或Y其中一个能从数据中找到连续的就分为一组。如下图每个几何图形分为一组。
//迭代四个方向
map[x][y]
if(map[i][j]==1)
{
map[i][j]=0;
check(map[i+1][j+0]);//检查右边是否使用,并看看是否含有数据,有的话需要归类到group中
check(map[i-1][j+0]);//检查左边是否使用,并看看是否含有数据
check(map[i+0][j+1]);//检查下边是否使用,并看看是否含有数据
check(map[i+0][j-1]);//检查上边是否使用,并看看是否含有数据
}
欢迎继续探讨!!
数据:
由于直接把数据发上来怕影响大家浏览版面,所以提供数据的txt文本下载链接。20080405185859.txt
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Paint(object sender, PaintEventArgs e)
{
int gridSize = 20;
for (int i = 0; i * gridSize < ClientSize.Width; i++)
{
e.Graphics.DrawString(i.ToString("00"), Font, Brushes.Black,
i * gridSize - 5, 0);
e.Graphics.DrawLine(Pens.Gray, i * gridSize, gridSize,
i * gridSize, ClientSize.Height);
}
for (int i = 0; i * gridSize < ClientSize.Height; i++)
{
e.Graphics.DrawString(i.ToString("00"), Font, Brushes.Black, 0,
i * gridSize - 5);
e.Graphics.DrawLine(Pens.Gray, gridSize, i * gridSize,
ClientSize.Width, i * gridSize);
} for (int i = 0; i < points.Length; i++)
e.Graphics.DrawEllipse(Pens.Red,
(points[i].X + 1) * gridSize - 3, (points[i].Y + 1) * gridSize - 3,
6, 6); for (int i = 0; i < groups.Count; i++)
{
int minX = int.MaxValue, minY = int.MaxValue,
maxX = int.MinValue, maxY = int.MinValue;
for (int j = 0; j < groups[i].Count; j++)
{
Point p = groups[i][j];
minX = p.X < minX ? p.X : minX;
minY = p.Y < minY ? p.Y : minY;
maxX = p.X > maxX ? p.X : maxX;
maxY = p.Y > maxY ? p.Y : maxY;
}
Rectangle r = Rectangle.FromLTRB(
(minX + 1) * gridSize - 5, (minY + 1) * gridSize - 5,
(maxX + 1) * gridSize + 5, (maxY + 1) * gridSize + 5);
e.Graphics.DrawRectangle(Pens.Blue, r);
e.Graphics.DrawString(i.ToString(), Font, Brushes.Black, r);
}
} private const int pointCount = 100;
private Point[] points = new Point[pointCount];
private bool[] scans; // 是否计算过
private List<List<Point>> groups = new List<List<Point>>(); private void search(int index, List<Point> group)
{
if (scans[index]) return;
scans[index] = true; // 标记已被扫描
Point point = points[index];
group.Add(point);
for (int i = 0; i < points.Length; i++)
{
if (scans[i]) continue;
if ((point.X == points[i].X && Math.Abs(point.Y - points[i].Y) == 1) ||
(point.Y == points[i].Y && Math.Abs(point.X - points[i].X) == 1))
{
search(i, group);
}
}
} private void Calc()
{
scans = new bool[pointCount];
groups.Clear();
for (int i = 0; i < points.Length; i++)
{
if (scans[i]) continue; //计算过
List<Point> group = new List<Point>();
groups.Add(group);
search(i, group);
}
Console.WriteLine(groups.Count);
} private void button1_Click(object sender, EventArgs e)
{
Random random = new Random();
for (int i = 0; i < points.Length; i++)
{
points[i].X = random.Next(20);
points[i].Y = random.Next(20);
}
Calc();
Invalidate();
}
}