VB6で計算結果の描画を行いたいと思っています。
計算結果はarray(x,y)のそれぞれの要素に値が入っており、この値に相当する色を使って
→x
↓ (1,1) (2,1)
y (2,1) (2,2)
の形で表示させたいと思っています。(x,yは数値入力で得る)
そこで、FormにPictureBoxを配置して
Picture1.ScaleMode = vbPixels
Picture1.Scale (0, 0)-(x, y)
Picture1.DrawWidth = 1
For n = 1 To y
For i = 1 To x
If array(i, n) <= 0# Then
'黒
red = 0
green = 0
blue = 0
ElseIf picarray(i, n) <= 1# Then
red = 256
green = 0
blue = 0
ElseIf picarray(i, n) > 2# Then
red = 0
green = 0
blue = 256
End If
Picture1.PSet (i, n), RGB(red, green, blue)
Next
Next
としてみたのですが、意図した通りに表示されませんでした。
gnuplotを使って無理矢理3Dグラフを作成してデータが間違っていないことは確認しました。
しかも、この表示方法はかなり時間がかかってしまうので、他に良い方法は無いかと考えています。
アドバイスをお願い致します。
arrayとpicarrayは別モノってことでOK?
End If は必要数ある?
など、不明なことが山盛りなコードですが、その辺は大丈夫なの?
> Picture1.ScaleMode = vbPixels
> Picture1.Scale (0, 0)-(x, y)
まず、この部分に問題がありますよ。
折角指定したScaleModeプロパティの設定を、
Scaleメソッドで上書きしてしまっていますので……。
VB6のヘルプにて、下記の項目を参照してみてください。
座標系の考え方や、スケールの変換方法などが解説されています。
[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
└[プログラミング ガイド]
└[Visual Basic を使ってできること]
└[テキストおよびグラフィックスの操作]
└[座標系]
>arrayとpicarrayは別モノってことでOK?
申し訳ありません。
コピー後の書き換え忘れです。
picarrayはarrayです。
>End If は必要数ある?
ElseIfでつなげているため、最後の一つだけでは足りないのでしょうか?
>> Picture1.ScaleMode = vbPixels
>> Picture1.Scale (0, 0)-(x, y)
>まず、この部分に問題がありますよ。
ありがとうございます。
Picture1.ScaleMode = vbPixels
だけにすることで、大分思ったとおりの画像が表示されました。
For n = 1 To y
For i = 1 To x
Next
Next
の方向性が間違っていないことが解りました。
ありがとうございます。
Picture1.Psetの動作が遅かったため
Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, _
ByVal y As Long, ByVal lngColor As Long) As Long
というAPI?を使ったところ、かなり速度は改善されました。
ありがとうございます。