简体   繁体   中英

How to calculate distance between two values from two different 2d array

I have two bool[5,5] arrays which look like this:

1st:

1 1 1 1 1
0 1 0 0 0
0 0 1 1 0
0 0 0 0 0
0 1 0 1 0

2nd:

0 0 0 0 1
0 1 1 1 0
0 0 0 0 0
0 0 1 1 0
1 0 0 0 0

What I have to do is simple calculating distance between 1 from 1st array and 1 from the 2nd one. I had multiple tries to solve this problem, but I can't solve this.

The result should looks like this:

4+3+2+1+0
0+0+0+0+0
0+0+0+0+0
0+0+0+0+0
0+1+0+3+0

Let me name arrays: first[,] and second[,]

There are fiew conditions:

  1. if (first[i,j] == true && second[i,j] == true) distance[i,j] = 0
  2. if (first[i,j] == false) distance[i,j] = 0
  3. if (first[i,j] == true) then I have to calculate distance between closest 1 from second[,] eg. There are 1 in first[1,4] and first[3,4] and there is 1 in second[0,4] (there was mistake), so it means that distance[3,4] = 3 - 0 (because of second array's dimensions).

This is main method to calculate:

` static public int findPicture()
    {
        int[,] m = new int[testBitmap.GetLength(0), 
        testBitmap.GetLength(1)];

        foreach (var picture in pictures)
        {
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if (testBitmap[i,j] == true)
                    {
                        do
                        {
                            i = i + 1;
                        } while (picture.Value[i,j] != true);

                        m[i,j] += 1;
                    }
                }
            }

            var total = 0;

            for (int a = 0; a < 5; a++)
            {
                for (int b = 0; b < 5; b++)
                {
                    total += m[a, b];
                }
            }

            return total;
        }



        return -1;
    }`

It was my closest version to solve.

I would be very greatful if you could give some advices to solve this trivial problem.

I'd do something like this:

static int[,] BuildDistanceArray(bool[,] array1, bool[,] array2)
{
    if (array1.GetLength(0) != array2.GetLength(0) || array1.GetLength(1) != array2.GetLength(1))
        throw new Exception("Array sizes must match.");

    int[,] distance = new int[array1.GetLength(0), array1.GetLength(1)];

    for (int i = 0; i < array1.GetLength(0); ++i)
    {
        for (int j = 0; j < array1.GetLength(1); ++j)
        {
            distance[i, j] = array1[i, j] ? GetDistance(array2, i, j) : 0;
        }
    }

    return distance;
}

static int GetDistance(bool[,] array, int row, int column)
{
    int maxColumn = array.GetLength(1);
    int distance = 0;

    bool again;
    do
    {
        again = false;

        if (column - distance >= 0)
        {
            if (array[row, column - distance])
                return distance;
            again = true;
        }
        if (column + distance < maxColumn)
        {
            if (array[row, column + distance])
                return distance;
            again = true;
        }

        distance++;
    } while (again);

    return 0;
}

It gives the results you're looking for and it works for any size array.

This function calculates distance between 2 rows converted to int32. It's written in java, so some minor transformation will be required.

int distance(int x, int y) {
    int count = Integer.bitCount(x);
    int totalDist = 0;
    for (int offset = 0; offset < 5 && x != 0; offset++) {

        x = x ^ (x & (y << offset) & 0b11111);
        x = x ^ (x & (y >>> offset));

        int nextCount = Integer.bitCount(x);
        totalDist += (count - nextCount) * offset;
        count = nextCount;
    }
    return totalDist;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM