private void Connect(int min_dist, int char_width, int[] labels, int label_width, int label_height)
{
int char_count = _char_list.Count;
int mw = _bbx.Width + 2; int mh = _bbx.Height + 2;// 1 pixel border
List<int[,]> charimg_list = new List<int[,]>();
List<int[,]> dist_charimg_list = new List<int[,]>();
DistanceTransformation dist = new DistanceTransformation();
for (int i = 0; i < char_count; i++)
{
int[,] charimg = new int[mh, mw];
for (int xx = 1; xx < mw - 1; xx++)
for (int yy = 1; yy < mh - 1; yy++)
if (labels[(yy - 1 + _bbx.Y) * label_width + (xx - 1 + _bbx.X)] == _char_list[i].pixel_id)
charimg[yy, xx] = 1; // 1 is fg
else
charimg[yy, xx] = 0;
charimg_list.Add(charimg);
dist_charimg_list.Add(dist.ApplyFGisZero(charimg));
}
for (int i = 0; i < char_count; i++)
for (int j = i + 1; j < char_count; j++)
{
int min = mw * mh;
for (int yy = 1; yy < mh - 1; yy++)
{
int[,] charimg = charimg_list[i];
for (int xx = 1; xx < mw - 1; xx++)
{
int[,] dist_charimg = dist_charimg_list[j];
if (charimg[yy, xx] == 1 && min > dist_charimg[yy, xx])
min = dist_charimg[yy, xx];
}
}
if (min <= min_dist)
{
if ((!_char_list[j].sizefilter_included && !_char_list[i].sizefilter_included) || //S S
(_char_list[j].sizefilter_included && _char_list[i].sizefilter_included))
{
_char_list[i].neighbors.Add(j);
_char_list[i].neighbor_count++;
_char_list[j].neighbors.Add(i);
_char_list[j].neighbor_count++;
}
else
{
if (!_char_list[i].sizefilter_included) // S B
{
_char_list[i].neighbors.Add(j);
_char_list[i].neighbor_count++;
}
else
{
_char_list[j].neighbors.Add(i);
_char_list[j].neighbor_count++;
}
}
}
}
}