2012-02-19 37 views
-1

讓我們假設我們有以下的二維數組:給出一個二維數組,發現地區它

2 1 2 2 1 1 
2 2 1 2 1 1 
2 1 3 2 1 1 
2 2 2 1 3 3 
2 2 1 1 3 3 
2 2 1 1 3 3 

現在,我想找到在上面連續的區域。如果兩個位置之間存在路徑,並且它們的值相同,則它們屬於連續區域。而且,路徑中的所有節點也應具有相同的值。例如,我們可以將上述分爲以下5個區域:

A B A A D D 
A A B A D D 
A B C A D D 
A A A D E E 
A A D D E E 
A A D D E E 

您被允許進入所有8個方向。我正在尋找Java中的實現。有人可以幫助我這個。該接口是一樣的東西

VectorFeature returnComp(int matrix[][]) 

其中VectorFeature可以如下

class VectorFeature{ 
    string region 
    int numberForRegion 
    int numOfElements 

} 

我知道如何實現這個想法,但我希望在JAVA快速/無缺陷執行!

+0

這應該有助於 http://stackoverflow.com/questions/1257117/does-anyone-have-a-working-non-recursive-floodfill-algorithm-written-in-c – innochenti 2012-02-19 16:56:58

+0

@innochenti:我要找對於Java中的某些東西,而不是C – Programmer 2012-02-19 16:58:03

+0

@innochenti:此外,floodfill只允許在4個方向上進行。對我來說8 – Programmer 2012-02-19 17:00:09

回答

0

這是做什麼。

冷杉把你的2D陣列成(大部分)8度曲線圖與下面的規則:

的E(i,j)的如果color_i = color_j對於所有的i,對於所有的j在8neighbours.i

代表這些邊緣作爲一個鄰接矩陣A

然後採取以下逐元素或產品

C = I或OR A^2或A^3 OR ...一個-1K-

其中C是在i,j有1的or乘積,如果在任何0-k步驟中有從i到j的路徑。

現在,終於採取明智的元件和產品

R = C和C_transpose

行i的R具有與j當且僅當一列i和j屬於同一個組件。然後你有你的地區,因爲這將代表的路徑是你最初在你的二維數組中表示的路徑。區域之間不會出現邊界。但是這個矩陣乘積需要一段時間才能計算,所以我們需要一個替代方案:我們可以選擇一個可調參數alpha,我們可以選擇一個可調參數alpha使該系列收斂,我們可以通過

R」 =逆找到的近似至R(I - α* A)

這將具有非零元素作爲R的相同的模式,但是更容易計算。 (注意,在R中你將有1和0,在R'中你將有0和非0(浮點數),所以你可以讀出所有相同的區域)

你可以用Java來做到這一點。但爲什麼不使用matlab?

這個答案几乎逐字(但不是)從偉大的書:線性代數語言中的圖算法。由J凱普納和J吉爾伯特。