RtInRect

[戻る]
ポチ 2002/12/19(木) 22:41:23
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 2002/12/19(木) 23:07:39
どんなエラーが出ているか書いてくれませんか?
MSDNを調べてみると
  BOOL PtInRect( POINT point ) const;
と書いてありますが、POINTでなくCArrayを渡していませんか?

ポチ 2002/12/19(木) 23:25:04
エラーではPOINTを渡してないといっているのですが
私が書いたようにするにはどうすればいいですか。

επιστημη 2002/12/20(金) 00:21:39
...おっしゃることがわかんない。
あなたが書いたようにするとエラーになります。
コンパイラの言うとおり、POINTを渡していないのですから。

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

ポチ 2002/12/20(金) 00:36:33
私がやりたいことは横150縦150の長方形のなかに
m_pで指定した点があるかないかを探す。ことをしたかった
のです。

RAPT 2002/12/20(金) 01:47:20
こんばんは、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

ポチ 2002/12/20(金) 04:40:41
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文を消すとデバッグエラーがなくなるのですが
原因がわかりません。

ポチ 2002/12/20(金) 04:43:25
>CRect r1(x,y,xhaba-1,yhaba-1);
x=0; y=0; xhaba=150; yhaba=150;

επιστημη 2002/12/20(金) 05:26:26
for (...) の末尾にある ; のせいでこれを抜けたとき
j が範囲外となる。とかいうオチでしょうか?

ポチ 2002/12/20(金) 05:59:35
すいません;は書きミスです。

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

2002/12/20(金) 10:02:16
>すいません;は書きミスです。
本当に投稿する際のミスですか?
本当に for の後に ; があるのではないでしょうか。
その ASSERT の意味は理解していますか?

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

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

RAPT 2002/12/20(金) 10:23:23
こんいちは、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

はお 2002/12/20(金) 11:58:14
pDoc->
ってなんでしょうね

ポチ 2002/12/20(金) 12:12:18
>本当に 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]の範囲内にあるのではないでしょうか。

ポチ 2002/12/20(金) 12:16:17
>m_ten , m_ten2 の宣言を書いてもらえますか?CArray<CPoint, CPoint> m_ten, m_ten2;
でいいのかな?
CArray<CPoint, CPoint>m_ten;
CArray<CPoint, CPoint>mten2;
にしています。

επιστημη 2002/12/20(金) 12:43:24
> for(int j=0;j<pDoc->m_ten.GetSize();++j){
> とあったときには今はm_ten.GetSize();に入ってるのは3ですよね?
> jは0〜2まで繰り返されるということで間違っていないと思うのですが

そのとおり、推測のとおりであれば範囲外エラーが出るはずありません。
しかし現にエラーが発生しているのだからデバッガで調べてみてはいかがですか?

# 推測はいいから実測しましょう

はお 2002/12/20(金) 15:12:39
とりあえず「pDoc」が何者でどのタイミングでデータをセットして
どのタイミングでこの判定を行うのかまったく情報がないので
こんなの作ってみました。

ちなみにダイアログベースでボタンを押されたら「OnButton1」にきます。

void CTttDlg::OnButton1() 
{
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    DataInit();
    int nJudge = Judgment();
    
    CString str; str.Format("%d", nJudge);
    MessageBox(str);
}

void CTttDlg::DataInit()
{
    m_ten.SetSize(0);
    m_ten2.SetSize(0);

    m_ten.Add(CPoint(385,78));//0//
    m_ten.Add(CPoint(388,113));//1//
    m_ten.Add(CPoint(388,154));//2//

    m_ten2.Add(CPoint(385,175));//3//
    m_ten2.Add(CPoint(383,188));//4//
    m_ten2.Add(CPoint(381,203));//5//
}

int CTttDlg::Judgment()
{
    int x=0,y=0,xhaba=150,yhaba=150;

    for(int j=0;j<m_ten.GetSize();++j)
    {
        POINT m_tenp;
        m_tenp.x=m_ten[j].x;
        m_tenp.y=m_ten[j].y;
        POINT m_ten2p;
        m_ten2p.x=m_ten2[j].x;
        m_ten2p.y=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;
}

で、動かしてみましたけど希望する結果が出てきましたよ。

古いスレッドには追加発言できません。