RtInRect – プログラミング – Home

通知
すべてクリア

RtInRect

固定ページ 1 / 2

ポチ
 ポチ
(@ポチ)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

RtInRectをつかいたいのですが

CArray(CPoint,CPoint) m_p;
pDoc->m_p.Add(100,100);

CRect r1(0,0,150,150);
if(r1.PtInRect(m_p)){
MessageBox(当たり);
}

などやりたいのですが上手くいきません。


引用解決済
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

どんなエラーが出ているか書いてくれませんか?
MSDNを調べてみると
  BOOL PtInRect( POINT point ) const;
と書いてありますが、POINTでなくCArrayを渡していませんか?


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

エラーではPOINTを渡してないといっているのですが
私が書いたようにするにはどうすればいいですか。


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

...おっしゃることがわかんない。
あなたが書いたようにするとエラーになります。
コンパイラの言うとおり、POINTを渡していないのですから。

あなたは何がしたいのですか? どんな結果を期待しているのですか?


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

私がやりたいことは横150縦150の長方形のなかに
m_pで指定した点があるかないかを探す。ことをしたかった
のです。


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

こんばんは、RAPTです。

CArray(POINT, POINT) m_p;
がよく分からないのですが。

POINT m_p;
m_p.x = 100;
m_p.y = 100;
CRect r1(0, 0, 150, 150);
if (r1.PtInRect(m_p)) {
// ...
}

では動作すると思います。

# ってゆーか、150x150 だったら、
# CRect r1(0, 0, 149, 149); じゃないとまずいよーな。
# これはちょっと自信がないので、識者、よろしくです。

## 何日か前にも似たよーな質問がどこかであったよーな…

Windows98/VC++6.0pro/SDK-may2002/ATL3.0/WTL7.0


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

pDoc->m_ten.Add(CPoint(385,78));//0//
pDoc->m_ten.Add(CPoint(388,113));//1//
pDoc->m_ten.Add(CPoint(388,154));//2//
pDoc->m_ten2.Add(CPoint(385,175));//3//
pDoc->m_ten2.Add(CPoint(383,188));//4//
pDoc->m_ten2.Add(CPoint(381,203));//5//
とあったときに、
for(int j=0;j<pDoc->m_ten.GetSize();++j);{
POINT m_tenp;
m_tenp.x=pDoc->m_ten[j].x;
m_tenp.y=pDoc->m_ten[j].y;
POINT m_ten2p;
m_ten2p.x=pDoc->m_ten2[j].x;
m_ten2p.y=pDoc->m_ten2[j].y;
CRect r1(x,y,xhaba-1,yhaba-1);
if(r1.PtInRect(m_tenp)||r1.PtInRect(m_ten2p)){
return(1);
}
return(0);
}

としたところデバッグエラーで
Debug Assertion Failed
program:
File afxtempl.h
Line:262
と出たんですがこのfor文を消すとデバッグエラーがなくなるのですが
原因がわかりません。


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

>CRect r1(x,y,xhaba-1,yhaba-1);
x=0; y=0; xhaba=150; yhaba=150;


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

for (...) の末尾にある ; のせいでこれを抜けたとき
j が範囲外となる。とかいうオチでしょうか?


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

すいません;は書きミスです。


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

デバッグを実行すると
AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::ElementAt(int nIndex)
{ ASSERT(nIndex >= 0 && nIndex < m_nSize);
return m_pData[nIndex]; }
のところで矢印がいきました。


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

>すいません;は書きミスです。
本当に投稿する際のミスですか?
本当に for の後に ; があるのではないでしょうか。
その ASSERT の意味は理解していますか?

あと return 0 のある場所がおかしいですよね。

あ。それから PtInRect は右辺上の点と底辺上の点は範囲外と見なすので幅と高さから -1 は
しませんよ。


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

こんいちは、RAPTです。

> CArray(POINT, POINT) m_p;
は、CArray<POINT, POINT> m_p; だったのかな?

ハンガリアン記法なのに、メンバ変数でないのがプリフィクス m_ をつけているのが結構謎。
それから、for文は1回しか実行されない。

m_ten , m_ten2 の宣言を書いてもらえますか?
CArray<CPoint, CPoint> m_ten, m_ten2;
でいいのかな?

> デバッグを実行すると
> AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::ElementAt(int nIndex)
> { ASSERT(nIndex >= 0 && nIndex < m_nSize);
> return m_pData[nIndex]; }
> のところで矢印がいきました。
これは、
m_tenp.x=pDoc->m_ten[j].x;
とあったら、m_ten[j] の、j が、m_ten の範囲外を指している、ということです。
# この場合、CArrayの、operator[] は、内部で ElementAt() を呼び出しているから。

再度、デバッガで、j の取りうる範囲と、m_ten の配列が保持するデータとを
見比べてみてはいかがでしょうか。

たさん>
> PtInRect は右辺上の点と底辺上の点は範囲外と見なすので幅と高さから -1 は
> しません
フォローありがとうございます。

Windows98/VC++6.0pro/SDK-may2002/ATL3.0/WTL7.0


返信引用
はお
 はお
(@はお)
ゲスト
結合: 22年前
投稿: 21
 

pDoc->
ってなんでしょうね


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

>本当に for の後に ; があるのではないでしょうか。
確認しましたが;はありませんでした。
>return 0の位置
 確かにおかしいです。
>CArray<POINT, POINT> m_p; だったのかな?
はい。そのとおりです。
for(int j=0;j<pDoc->m_ten.GetSize();++j){
とあったときには今はm_ten.GetSize();に入ってるのは3ですよね?
jは0~2まで繰り返されるということで間違っていないと思うのですが
m_tenp.x=pDoc->m_ten[j].x;
はm_ten[j]の範囲内にあるのではないでしょうか。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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