重なり合ったリージョンの一番外側を知りたい – プログラミング – Home

重なり合ったリージョンの一番外側を知り...
 
通知
すべてクリア

[解決済] 重なり合ったリージョンの一番外側を知りたい


あお
 あお
(@あお)
ゲスト
結合: 21年前
投稿: 45
Topic starter  

いつもお世話になっております。

複数の重なってできたリージョンの一番外側の部分だけ
取得したいのですが、どのようにしたらいいのかわかりません。

for (i = 0; i < tmpindex; i ++){ // tmpindexリージョンの数
CombineRgn(all, all, tmpRgn[i], RGN_XOR); // tmpRgn[i]各リージョンを保存
}
としてみたのですがこれでは例えば3つ四角が重なったリージョンの場合
一番外側と一番内側がリージョンとして残ってしまいます。
-----------------------
|1 -------------- | 1と3が選択された状態
| |2 -------- | |
| | |3 | | |
| | | | | |
| | -------- | |
| -------------- |
-----------------------
1のみ(2と3のリージョンを省いた状態の中が抜けた口がた)のリージョンを
取得したいのですがどうすればいいのでしょうか。

アドバイスをよろしくお願いします。

開発環境 Win2000 VS6SP5 MFCではありません


引用未解決
トピックタグ
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

リージョン1のうち、リージョン2にもリージョン3にも含まれない部分、
つまり1と2をRGN_DIFFした結果と3とをRGN_DIFFするといいのでは。


返信引用
あお
 あお
(@あお)
ゲスト
結合: 21年前
投稿: 45
Topic starter  

n様 返信ありがとうございます。

上記したようなリージョンの場合うまくいきました。
ありがとうございます。

ですが、例えばリージョン1と2は重なっていなくて
3が1と2と重なっている場合
-----------------
|2 -------- | 上の四角形1と下の四角形2、
| |3 | |上下をまたぐ四角形3のようなとき
| | | |
-----------------
|1 |(3) | |
| | | |
| -------- |
-----------------
CombineRgn(all, all, tmpRgn[i], RGN_DIFF);
を実行すると1のみ(1から3を引いた|_|の形)のリージョンが
取得されます。1と2を取得する(口形)のリージョンを取得したいと
思っています。
やはりどうすればいいかわかりません。

アドバイスをお願いいたします。


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

よくわからなくなってきましたが、
もしこういう位置関係であれば、どのような結果だとよいのですか?
それともこういう位置関係はナシだ、とかありますか?

+-------+
|1 +---+---+
| |2 | |
| +-+---+-+ |
| | | | | |
| | +---+-+-+
| |3 | |
| +-----+-+
+-------+


返信引用
おっちゃん
 おっちゃん
(@おっちゃん)
ゲスト
結合: 21年前
投稿: 11
 

全部をANDじゃないの?


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

「全てのリージョンをORした結果」から「個別にANDした結果を全てORした結果」を
引く、とか。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>もしこういう位置関係であれば、どのような結果だとよいのですか?
>それともこういう位置関係はナシだ、とかありますか?

一番外側のリージョンと一番内側のリージョンとの定義によると思います
(どのような結果を望むかはあなたがお決めになることでしょう)


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

推測…こうか?
これなら n さんのだが…
+-------+
| +---+---+
| | | |
| +-+ +-+ |
| | 空き | |
| | +-+-+
| | | |
| +-----+-+
+-------+

もっと厄介なお題を考えてみた
長方形が箱型に組まれ、真ん中に島(斜線部分がリージョン)。
n さんの式では島が残る。果たしてこれは是か非か…
+---+-------+---+
|///|///////|///|
+---+-------+---+
|///| +---+ |///|
|///| |///| |///|
|///| +---+ |///|
+---+-------+---+
|///|///////|///|
+---+-------+---+


返信引用
あお
 あお
(@あお)
ゲスト
結合: 21年前
投稿: 45
Topic starter  

n様、おっちゃん様、島様返信ありがとうございます。

全部をANDだと3が選択されてしまいますよね?
これの逆がほしいことになります。

+-------+
|1 +---+---+
| |2 |4 |
| +-+---+-+ |
| | | |5| |
| | +---+-+-+
| |3 |6|
| +-----+-+
+-------+
の場合
1と4と6がリージョンとしてほしい部分です。
+-------+
|111+---+---+
|111| |111|
|1+-+ +-+1|
|1| | |1|
|1| +-+-+
|1| |1|
|1+-----+-+
+-------+ 1がある部分

「全てのリージョンをORした結果」から「個別にANDした結果を全てORした結果」ひく
を実行してみます。


返信引用
あお
 あお
(@あお)
ゲスト
結合: 21年前
投稿: 45
Topic starter  

シャノン様 時間差でした。
返信ありがとうございます。

+---+-------+---+
|///|///////|///|
+---+-------+---+
|///| +---+ |///|
|///| |///| |///|
|///| +---+ |///|
+---+-------+---+
|///|///////|///|
+---+-------+---+
一応これは考慮に入れていません。
+---+-------+---+
|///|///////|///|
+---+-------+---+
|///| |///|
|///| |///|
|///| |///|
+---+-------+---+
|///|///////|///|
+---+-------+---+

+---+
|///|
+---+ は別物扱いにしていますので。


返信引用
あお
 あお
(@あお)
ゲスト
結合: 21年前
投稿: 45
Topic starter  

n様
「全てのリージョンをORした結果」から「個別にANDした結果を全てORした結果」を
引く
で望み通りの結果を得ることができました。
ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました