文字がかさならないようにするためには – 固定ページ 3 – プログラミング – Home

文字がかさならないようにするためには
 
通知
すべてクリア

[解決済] 文字がかさならないようにするためには

固定ページ 3 / 4

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

>>for(int i=0;i<100;i++){
> > for(int q=0;q<100;q++){
> > if(pDoc->mp[i]!=pDoc->mp[q]){
>  >  BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
>   > if(Intersect==1){
>    > p=1;
>     >size = pDC->GetTextExtent(pDoc->mt[i]);
> >pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->mp[i].top+size.cy,pDoc->mp 
>  >[i].right,pDoc->mp[i].bottom+size.cy);
>     >break;
>    >}
>    >else p=0;
> >}
>  >}

>mp[i]の中にmp[i]以外のすべてのmpをみていきもし重なっていたならmp[i]の値を上より  
>に変えてp=1にする。もしなかったらp=0にする。
とはなっていませんよ。あなたの今回のコードでは Doc ->mp[i] と Doc ->mp[q] とを
比べているので i 番目の矩形と q 番目の矩形とが等しいかどうかだけに着目しているの
です。等しくない場合に重なりがあるか検査しています。

何故

for (int i =0; i <100-1; i++) {
for (int q =i +1; q <100; q++) {
// i 番目の矩形と q 番目の矩形とが重なる場合は q 番目の矩形を変更して
// 重なりがない様にするが、i 番目以前の矩形と重ならない事を保証するには
// どうするのがいいだろうか?
// 今までに出てきた矩形の下端(したば)の最大値を記録するなり、i 番目までの
// 矩形を囲む最小の矩形を記録するなり、して確実に重なる事のない領域を割り出す
// 仕組みを考える事が必要だろう;
}
}

と言うループになさらないんですか?
こういうループにしていれば i と q とが同じ値になる事がないので簡単になるでしょう?
再度お尋ねしますが
重なるものがあったら内側の検索ループを中断するのは何故ですか?
何故 q 番目のではなくて i 番目の方が操作の対象なんでしょうか?


返信引用
wen
 wen
(@wen)
ゲスト
結合: 22年前
投稿: 28
Topic starter  

考えていることは点に対して文字は左よりに貼られますよね。そこに貼れなければ文字分上にい
って検索をかけ貼れなければそこから文字分左へ行き検索をかけはれなかったら下に行き検索を
かけ貼れなければその文字ははれないので文字を削除したいのです。全部ではれる場所は点にた
いして4つと決めております。

>比べているので i 番目の矩形と q 番目の矩形とが等しいかどうかだけに着目しているの
>です。等しくない場合に重なりがあるか検査しています。

mp[i]自身を検索にかけてしまうと結果重なってるとなってしまうので
mp[i]=mp[q]以外としました。
そのときに
BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);

重なってるかどうかを判定しています。

>for (int i =0; i <100-1; i++) {
> for (int q =i +1; q <100; q++) {
これは
for (int i =0; i <100-1; i++) {
for (int q =i +1; q < i; q++) {
と変更しました。

>重なるものがあったら内側の検索ループを中断するのは何故ですか?

break; のことですよね?貼れないのがわかったら次のループに移るように
したかったからです。

>何故 q 番目のではなくて i 番目の方が操作の対象なんでしょうか?

q番目のほうはすでに貼り終えたほうなので次に貼るほうを変更しました。


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

>考えていることは点に対して文字は左よりに貼られますよね。
よねっていわれても困っちゃう私でした。何の事やら良く判らないのですよ

>そこに貼れなければ文字分上にいって検索をかけ貼れなければそこから文字分左へ行き
>検索をかけはれなかったら下に行き検索をかけ貼れなければその文字ははれないので
>文字を削除したいのです。
+--------------+ +-------------+
| (A) | | (B) |
+--------------+ +-------------+
+-----------------+ +-------------+
| (A') | | (B') |
+-----------------+ +-------------+

(A) が良い位置でない場合、(A') を試してみて、それも駄目なら(B') を試してみると
そこも駄目なら (B) を試すと言う事ですか?

それならそういう検査を函数にしてしまいましょう。
int CheckNewPos(const CArray& mp, int i, int q) というような函数になるんでしょうか
検査結果を見て新しい配置を作るか、削除するかすればいいでしょう
0 なら (A') , 1 なら (B'), 2 なら (B), -1 なら削除というように返す値を決めれば
済む事ですね


返信引用
wen
 wen
(@wen)
ゲスト
結合: 22年前
投稿: 28
Topic starter  

③--------------②--------------+
| (3)  | (2) |
④--------------①--------------+
| (4)  | (1) |
+----------------+--------------+

①が基準点mp[i]として普通は(1)に貼るのですがここで(1)にmp[q]が
あるとするならmp[i]の値を②へと変えてというふうに④までやって
(4)にも貼れなければmpの中から削除する。
です


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

>①が基準点mp[i]として普通は(1)に貼るのですがここで(1)にmp[q]が
>あるとするならmp[i]の値を②へと変えてというふうに④までやって
>(4)にも貼れなければmpの中から削除する。

私なら、mp[i] ではなく、mp[q] の方を変更の対象に選びます。その方が後々(あとあと)
楽になると思うからですが、あなたがご自分の判断でどちらをお選びになるかまで云々
(うんぬん)するような差し出がましい事はしたくありません

検査を函数化するという考えはお気に召しませんでしたか?


返信引用
wen
 wen
(@wen)
ゲスト
結合: 22年前
投稿: 28
Topic starter  

int CheckNewPos(const CArray& mp, int i, int q) というような函数になるんでしょうか

ちょっとよくわからないんですがどうゆう関数なんでしょうか?

>私なら、mp[i] ではなく、mp[q] の方を変更の対象に選びます。その方が後々(あとあと)
>楽になると思うからですが、あなたがご自分の判断でどちらをお選びになるかまで云々

mp[q]を変えるとすべての値が変わることになりませんか? あとあと楽になるのはどうしてで
しょうか


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

>ちょっとよくわからないんですがどうゆう関数なんでしょうか?

あなたのなさりたいとを私なりに解釈して函数化したものですが、i 番目の矩形と
q 番目の矩形とを対象にする検査です。i 番目の矩形と q 番目の矩形とが重なっていたら
この検査函数を呼び出して、(1) の矩形に対して(2) の矩形が適しているのか
(3) の矩形が適しているのか(4) の矩形が適しているのか、適切な矩形が見つからないのか
検査して結果を返す函数です(繰り返しになりましたが再度説明しました)
当然、i 番目か q 番目かまでの矩形と新しい矩形の候補とを比べて判定しなければならない
ので、矩形の集合である Doc ->mp もこの函数に渡さなければならないでしょう

>あとあと楽になるのはどうしてでしょうか
お判りにならないのなら別に気になさらないで下さい。あなたの考えを変えてしまおうという
意図は私にはないのです。私ならそうするという事でしかないのですから


返信引用
wen
 wen
(@wen)
ゲスト
結合: 22年前
投稿: 28
Topic starter  

> > if(pDoc->mp[i]!=pDoc->mp[q]){
>  >  BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
>   > if(Intersect==1){
>    > p=1;
>     >size = pDC->GetTextExtent(pDoc->mt[i]);
> >pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->mp[i].top+size.cy,pDoc->mp 
>  >[i].right,pDoc->mp[i].bottom+size.cy);
>     >break;
>    >}
>    >else p=0;

のかわりにint CheckNewPos(const CArray& mp, int i, int q) をつかうってことですよ
ね?
どうゆう風に使ったらいいのか調べてるのですがちょっとわからなく困っています


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

戻り値が 1 なら (1)、2 なら (2)、3 なら (3)、4 なら (4)、-1 なら削除
と言う風にでも決めておけばよろしいかと思います
2003/02/11(火) 00:14:51 の回答の焼き直しですけれど、お役に立ちますか?


返信引用
wen
 wen
(@wen)
ゲスト
結合: 22年前
投稿: 28
Topic starter  

CArray のデータはけせるのでしょうか
たとえば
CArray<CRect,CRect>p;として 100個のデータがはいってるとして
p[10]番目のデータを消すといったことはできるのでしょうか?


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

MSDNの「CArray クラスメンバ」のとこの下の方に何かありますよ。


返信引用
wen
 wen
(@wen)
ゲスト
結合: 22年前
投稿: 28
Topic starter  

CArray::RemoveAt ですね ありがとうございます


返信引用
wen
 wen
(@wen)
ゲスト
結合: 22年前
投稿: 28
Topic starter  

CSize size;
size = pDC->GetTextExtent(aaa);

これをCArrayでCArray<CSize,CSize>size;としてやりたいのですが
どうすればできますか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

どうすれば...? なにがわからないのですか?


返信引用
wen
 wen
(@wen)
ゲスト
結合: 22年前
投稿: 28
Topic starter  

>CSize size;
>size = pDC->GetTextExtent(aaa);
>
>これをCArrayでCArray<CSize,CSize>size;としてやりたいのですが
>どうすればできますか?

すいませんできました

プログラムを実行させたんですが文字を表示はできたんですがスクロールバーを
動かすと

Debug Assertion failed
program:場所
file:afxtempl.h
Line:262

For informaition on haw your program can
cause an assetion failure,see the visualC++
decumentation on asserts

とエラーが出るのですがどういったエラーなんでしょうか?


返信引用
固定ページ 3 / 4

返信する

投稿者名

投稿者メールアドレス

タイトル *

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