2次元配列内の格子状データの開始・終了位置を求めるには?

解決


2tom  2011-03-26 23:59:26  No: 72516  IP: 192.*.*.*

VCで質問する内容ではないかもしれませんが…

現在、data[100][100]の配列内に格子状にデータが
格納されていて、その開始位置と終了位置を求める方法
が判らずに困っています。
例:10x10で下記の場合

0001001000
0001001000
1111111111
0000100000
0000100000
0000100000
1111111111
0000000000
0000000000
0000000000

上記の「0」のデータの開始位置と終了位置を求めたいのです。
1個目:開始[0][0]  終了[1][2]
2個目:開始[0][4]  終了[1][5]
3個目:開始[0][7]  終了[1][9]
4個目:開始[3][0]  終了[5][3]

といった感じです。

宜しく御願いします。

編集 削除
眞鋳  2011-03-27 01:43:01  No: 72517  IP: 192.*.*.*

>1個目:開始[0][0]  終了[1][2]
>2個目:開始[0][4]  終了[1][5]
>3個目:開始[0][7]  終了[1][9]
>4個目:開始[3][0]  終了[5][3]終了が不明なんです、話から考えると

もしかして
1個目:開始[0][0]  終了[0][2]
2個目:開始[0][4]  終了[0][5]
3個目:開始[0][7]  終了[1][2]
4個目:開始[1][4]  終了[1][7]

ではありませんか?(行にまたがった場合は継続しているとして)
ループ2個の変数とフラグ一個でいけませか

それとも、私が勘違いしていたら忘れてください。

編集 削除
眞鋳  2011-03-27 01:46:34  No: 72518  IP: 192.*.*.*

圧縮操作でよく使われるかと思われます、がんばれ!
老兵は若い子に教えないといけないきがする。

でも、質問もしてますw

編集 削除
tetrapod  2011-03-27 07:18:45  No: 72519  IP: 192.*.*.*

まず考えるべきはプログラムではなくて開始終了の仕様。
0011
0110
0100
な場合に開始終了とは何であってほしいのか。
本人に整理のできていない案件を外部の人間が解くことは難しい。

編集 削除
ryo  2011-03-27 10:47:32  No: 72520  IP: 192.*.*.*

確認したいが
この配列データは「画像」のような意味を持つデータであり
「0」で塗られた領域の「左上」と「右下」がほしいということでしょうか?

もし、そうだとして、少しだけ話すすめます。

これは塗られた領域が長方形であるという条件がある場合だけで
もし、tetrapodさんの指摘するような形状であった場合は
「左上」「右下」はどこなのか?
また、「最上」「最下」「最左」「最右」の意味する場所が違っていいのか?
なんて問題がでてきます

他にも
011
100 
のように、斜めに接触する場合に「つながった領域とするか否か?」
なんて条件もありますが・・・

Blob(ブロブ/ブロッブ)処理で検索すると色々でてきますね
ただ、画像処理用のライブラリを使ったものばかりで・・・
自分もこの手のものをつかってやってます。
これらの詳細はわからないけど、
まず、領域ごとにラベル貼り(領域ごとに固有の番号で塗る)し、
領域をしっかりわけてから処理してるようです。

ラベル貼りについては、画像処理の「塗りつぶし処理」なんかが
参考になると思います。
これは検索するとゴリゴリでてきますよ

編集 削除
2tom  2011-03-27 23:30:48  No: 72521  IP: 192.*.*.*

皆様、ありがとうございます。
やりたいことは、ryo様の仰るとおり、
「0」で塗りつぶされた"長方形"の領域の左上と右下が欲しいのです。
条件は「1」は必ず直線になります。
よって、tetrapod様の様な
0011
0110
0100
や、ryo様の様な
011
100
の形は絶対になりません。
画像処理は全く知識がありません
ので、糸口でも教えて頂きたいと思っています。
以上、宜しくお願いします。

編集 削除
ryo  2011-03-28 00:04:15  No: 72522  IP: 192.*.*.*

条件が長方形で固定してるなら

(例)
000100
000100
111111
000000

最初の「0」を「2」にする  
200100
000100
111111
000000

0が連続するところを同じ「2」で埋める
222100
000100
111111
000000

1を超え次に0がきたら今度は3で同様のことする  
222133
000100
111111
000000

2行目(以降)は、「0」の上を調べて同じ値でうめる
222133
222133
111111
000000

3行目は「1」しかないのでそのまま飛ばす

4行目は0の上が「1」なので、新たな番号4を割り振り、また繰り返す
222133
222133
111111
444444

これを最後まで繰り返す。

この作業のさい、
「nを最初にいれた場所」と「nを最後に入れた場所」が
nの領域の左上と右下になる

編集 削除
2tom  2011-03-28 23:12:45  No: 72523  IP: 192.*.*.*

ありがとうございました。
無事に解決できましたm(_ _)m

編集 削除