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

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

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

固定ページ 2 / 4

sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

「起点となる座標が、任意のCRectに含まれるか?」を調べればよいのですか?
起点座標は任意のCRectに含まれていなくても、終点座標が含まれていたら??

CRect::IntersectRect()は、2つの四角形を調べ、重なりがあるかどうかを返します。
これから表示しようとするテキストが占める四角形と、
既に表示済みのテキストの四角形に重なりがあるか調べれば・・・


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

CRect::IntersectRect()をつかいたいのですが
書き方がいまいちわかりません
教えていただけないでしょうか。


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

文字列Aを表示する矩形をRa、文字列Bを表示する矩形をRb、
両者の重なりを表す矩形をRiとして、

CRect Ra( 0, 0, 400, 300 );// 例
CRect Rb( 200, 150, 600, 450 );// 例
CRect Ri;
BOOL bIntersect = Ri.IntersectRect( &Ra, &Rb );

こうすると

bIntersect==TRUE
Ri==CRect( 200, 150, 400, 300 )

となります。


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

重なってるなら1を返し重なってなければ0を返すんですよね
これで判定できたのですが文字を張るか張らないかをif文か
swich文で書こうと思っているのですがどちらのほうが処理
が重いですか?


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

何件のデータ(文字列)を処理しようとしているのかわかりませんが、
処理の重さを気にしなければならないほど大量なのですか?

まずはif分でもswitch分でもよいので、
思い通りの動きをするプログラムを組み立てることが先決のように思うのですが。
その上で、動作スピードに問題が出るようなら、その時改めて質問すればよろしいかと。
小さな問題をひとつずつ段階的にクリアして成果を出していかないと、続かないですよん。
(差し出がましいようで申し訳ないです。)


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

CArray<CRect,CRect>mp;

pDoc->mp.Add(CRect(100,100,140,120));
を作ったとして今mp[0]に値がはいってますよね
それを後から書き換えることは可能なんでしょうか?


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

CArrayとCRectをMSDNで調べるのが吉ぢゃ。


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

> CArray<CRect,CRect>mp;

こう定義した時、

> 今mp[0]に値がはいってますよね

ってことは、mp[0]は何型かはわかってますよね?
ってことは・・・?


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

CRect Ri;
int p;
CSize size;
for(int i=0;i<100;i++){
  for(int q=0;q<100;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;
  }

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

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

  else if(p==0){
     pDC->TextOut(pDoc->mp[i].left,pDoc->mp[i].top,pDoc->mt[i]);
  }
  else if(p==3){
   p=0;
  }
}

一応書いてみたのですがBOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp
[q]);のところで同じものを参照してしまうのですがこれを改善できる方法はないでしょうか?

これより短くプログラムを書くことができるとおもうのですが
ほかの人の提案をお聞かせください おねがいします。


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

CArray<CRect,CRect>mp;
CArray<CString,CString>mt;

を書きわすれてました。


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

すいませんウソ教えました。

ウソ:bIntersect==TRUE
OK:bIntersect!=FALSE

というのは、ヘルプに「非0を返す」とあるわけでTRUEを返すとは限らないのでした。
(やってみたら一応1が返ってきてましたが)


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

上のプログラムを動かすとmp[0]がfor文を通るときpの値が-86・・・となります。
なぜでしょうか?


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

なぜ、というか、
まだ初期化されてないから適当な値が入ってるんじゃないかと。

デバッグビルドでは 0xCCCCCCCC になるんでしたっけ。


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

>これより短くプログラムを書くことができるとおもうのですが
>ほかの人の提案をお聞かせください おねがいします。

あなたが示されたコードからは何がしたいのかが良く判りませんでした。出来ましたら
何処で何が起きているのか、または何がしたいのかについてソースにコメントが付いて
いたら、判断材料になったかもしれないのでコメント付きのソースをアップしていただけ
ませんか?

>for(int i=0;i<100;i++){
>  for(int q=0;q<100;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;
>  }
の部分ですが、これですと、i 番目の矩形に重なる矩形が一つでも見つかったら、内側の
制御変数が q のループは打ち切る事になっていますが(判定も if (Intersect !=0) の
方が n さんのお話では相応(ふさわ)しいようですが)、これはあなたのお望みの動作
なんでしょうか?
更に、このままですと q と i とが等しい場合について何も考慮されていませんがその場合
は除外する必要はないのですか?
それから、何故 q 番目のではなくて i 番目の方が操作の対象なんでしょうか?


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

返事おくれてすみません
やりたいことを書きました
よろしくおねがいします
CRect Ri;
int p;
CSize size;
>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にする。

  >if(p==1){
    >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=2;
    >size = pDC->GetTextExtent(pDoc->mt[i]);
    >pDoc->mp[i]=CRect(pDoc->mp[i].left-size.cx,pDoc->m[i].top,pDoc-
                  >mp[i].right-size.cx,pDoc->mp[i].bottom);
    >break;
       >}
  >else p=0;
    >}
>}
  >}

  先ほど場所で貼れなかったのでpには1がはいって先ほどと同じ作業をしmp[i]の中にmp[i]
  以外のすべてのmpをみていきもし重なっていたならmp[i]の値を左よりに変えてp=2にす 
  る。もしなかったらp=0にする。

  >else if(p==2){
    >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=3;
   >  size = pDC->GetTextExtent(pDoc->mt[i]);
    > pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->m[i].top+size.cy,pDoc-
                    >mp[i].right,pDoc->mp[i].bottom+size.cy);
     >break;
  > }
  >else p=0;
    >}
>}
  >}
先ほど場所で貼れなかったのでpには2がはいって先ほどと同じ作業をしmp[i]の中にmp[i]  
以外のすべてのmpをみていきもし重なっていたならmp[i]の値を下よりに変えてp=3にす   
る。もしなかったらp=0にする。

else if(p==3){
for(int q=0;q<i;q++){
if(pDoc->mp[i]!=pDoc->mp[q]){
BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
if(Intersect==1){
p=4;
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;
}
}
}
先ほど場所で貼れなかったのでpには3がはいって先ほどと同じ作業をしmp[i]の中にmp[i] 
  以外のすべてのmpをみていきもし重なっていたならmp[i]の値を消す(消し方がわからな 
  い)p=4にする。もしなかったらp=0にする。

  >else if(p==0){
   >  pDC->TextOut(pDoc->mp[i].left,pDoc->mp[i].top,pDoc->mt[i]);
  >}
  p=0は他のmpが重なっていないところなのでそこに貼る。
  >else if(p==4){
   >p=0;
  >}
  次のforの前にpを初期化。
>}


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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