30x30の画像をつくる

解決


ますお  2003-11-27 12:03:57  No: 80582  IP: [192.*.*.*]

いつも参考にさせていただいております。
質問なのですが、
30マスx30マスの画像をつくりたいと思い、
以下のようなプログラムを作りました。
開発環境は、windows2000とVB6.0です。
************************************************
Private Sub Command1_Click()
            
GR = 56.7    '1グリッドの幅
            
For x = 744 To 744 + (31 * GR) Step GR
Picture1.Line (x, 744)-(x, (744 + 30 * GR))
Next x
For y = 744 To 744 + (31 * GR) Step GR
Picture1.Line (744, y)-((744 + 30 * GR), y)
Next y

End Sub
************************************************

このプログラムだと、32番目にも線が引かれてしまいます。
ただ「744」の値を「743」に変更すると、
きれいに30x30のマス目ができます。
「743」と「744」で、なぜ出力結果が違ってきてしまうのかが
わかりません。

よろしくお願いいたします。

編集 削除
k.k  2003-11-27 16:06:43  No: 80583  IP: [192.*.*.*]

744はいっぱいあるよね。どこを743にかえるの
ぜんぶかえたところでけっかはいっしょ

編集 削除
k.k  2003-11-27 16:10:31  No: 80584  IP: [192.*.*.*]

たぶん、Toの後ろのことを言っているのだと思うけど、
ステップ実行してみりゃわかる。

編集 削除
ますお  2003-11-27 16:44:11  No: 80585  IP: [192.*.*.*]

すべての「744」と「743」を変更します。

ちなみに、vb2.0で実行したところ、「744」と「743」で
同じ出力結果(32番目の線がひかれる)がでました。
30x30のマス目をつくるということよりも、
「744」と「743」で違う結果がでるということがわかりません。

編集 削除
nanashi  2003-11-27 18:00:44  No: 80586  IP: [192.*.*.*]

# For文に小数点を使うのは良くないと思います。
# (違う結果がでるというのもコレが原因だと思います)
# それと使う変数は必ずDim宣言した方が良いです。
# しないと全てVariant型として扱われます。
# モジュールの頭にOption Explicitをつけてください。


で、ますおさんがやろうとしていることは

Private Sub Command1_Click()
    Dim GR#, dStart#, dEnd#, x#, y As Double
    Dim lCnt As Long
    
    GR = 56.7                   '1グリッドの幅
    dStart = 743                '開始位置
    dEnd = dStart + (30 * GR)   '終了位置
    
    For lCnt = 0 To 30
        x = dStart + lCnt * GR
        Picture1.Line (x, dStart)-(x, dEnd)
        
        y = dStart + lCnt * GR
        Picture1.Line (dStart, y)-(dEnd, y)
    Next
End Sub

編集 削除
uchi  2003-11-27 18:09:07  No: 80587  IP: [192.*.*.*]

浮動小数点の変数(xとy)をFor〜Nextの条件に使用している為、
誤差が発生しています。この為、ループ回数が自分の思ったと
おりの回数で回っていません。
試しに、以下のコードを実行して見てください。


Private Sub Command3_Click()
       
 Dim I As Double
 Dim GR As Double
 Dim X As Double


    GR = 56.7      '1グリッドの幅

    Debug.Print "--- 743の場合 ---"
    I = 0#
    For X = 743# To 743# + (30# * GR) Step GR
        Debug.Print "X(" & Format(I, "00") + ") " _
          & CStr(X = 743# + (I * GR))
        I = I + 1
    Next X

    Debug.Print "--- 744の場合 ---" + vbCrLf
    I = 0#
    For X = 744# To 744# + (30# * GR) Step GR
        Debug.Print "X(" & Format(I, "00") + ") " _
          & CStr(X = 744# + (I * GR))
        I = I + 1
    Next X

End Sub


実行結果で、"False"と出ているところは条件が不一致のため
一回分ループが回らないということになります。

対策としては、ループの変数は整数型の変数にして、ループの
中で表示する座標を計算するようにすると良いです。

編集 削除
ますお  2003-11-27 18:31:30  No: 80588  IP: [192.*.*.*]

nanashi様
uchi様
ご返答、ありがとうございます。

「743」と「744」での出力結果の違いの原因がわかり助かりました。
変数の宣言に気をつけなくてはいけないのですね。気がつきませんでした。
教えていただいたサンプルプログラムを元に勉強していきたいと
思います。
本当にありがとうございました。

編集 削除