いつもお世話になっております。
複数の重なってできたリージョンの一番外側の部分だけ
取得したいのですが、どのようにしたらいいのかわかりません。
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ではありません
リージョン1のうち、リージョン2にもリージョン3にも含まれない部分、
つまり1と2をRGN_DIFFした結果と3とをRGN_DIFFするといいのでは。
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を取得する(口形)のリージョンを取得したいと
思っています。
やはりどうすればいいかわかりません。
アドバイスをお願いいたします。
よくわからなくなってきましたが、
もしこういう位置関係であれば、どのような結果だとよいのですか?
それともこういう位置関係はナシだ、とかありますか?
+-------+
|1 +---+---+
| |2 | |
| +-+---+-+ |
| | | | | |
| | +---+-+-+
| |3 | |
| +-----+-+
+-------+
全部をANDじゃないの?
「全てのリージョンをORした結果」から「個別にANDした結果を全てORした結果」を
引く、とか。
>もしこういう位置関係であれば、どのような結果だとよいのですか?
>それともこういう位置関係はナシだ、とかありますか?
一番外側のリージョンと一番内側のリージョンとの定義によると思います
(どのような結果を望むかはあなたがお決めになることでしょう)
推測…こうか?
これなら n さんのだが…
+-------+
| +---+---+
| | | |
| +-+ +-+ |
| | 空き | |
| | +-+-+
| | | |
| +-----+-+
+-------+
もっと厄介なお題を考えてみた
長方形が箱型に組まれ、真ん中に島(斜線部分がリージョン)。
n さんの式では島が残る。果たしてこれは是か非か…
+---+-------+---+
|///|///////|///|
+---+-------+---+
|///| +---+ |///|
|///| |///| |///|
|///| +---+ |///|
+---+-------+---+
|///|///////|///|
+---+-------+---+
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した結果」ひく
を実行してみます。
シャノン様 時間差でした。
返信ありがとうございます。
+---+-------+---+
|///|///////|///|
+---+-------+---+
|///| +---+ |///|
|///| |///| |///|
|///| +---+ |///|
+---+-------+---+
|///|///////|///|
+---+-------+---+
一応これは考慮に入れていません。
+---+-------+---+
|///|///////|///|
+---+-------+---+
|///| |///|
|///| |///|
|///| |///|
+---+-------+---+
|///|///////|///|
+---+-------+---+
と
+---+
|///|
+---+ は別物扱いにしていますので。
n様
「全てのリージョンをORした結果」から「個別にANDした結果を全てORした結果」を
引く
で望み通りの結果を得ることができました。
ありがとうございます。