VB6で、PictureBoxへの描画

解決


山型  2005-09-07 22:27:24  No: 92100  IP: [192.*.*.*]

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グラフを作成してデータが間違っていないことは確認しました。
しかも、この表示方法はかなり時間がかかってしまうので、他に良い方法は無いかと考えています。

アドバイスをお願い致します。

編集 削除
通ってみた  2005-09-07 22:52:24  No: 92101  IP: [192.*.*.*]

arrayとpicarrayは別モノってことでOK?
End If は必要数ある?

など、不明なことが山盛りなコードですが、その辺は大丈夫なの?

編集 削除
魔界の仮面弁士  2005-09-07 23:06:27  No: 92102  IP: [192.*.*.*]

> Picture1.ScaleMode = vbPixels
> Picture1.Scale (0, 0)-(x, y)

まず、この部分に問題がありますよ。

折角指定したScaleModeプロパティの設定を、
Scaleメソッドで上書きしてしまっていますので……。


VB6のヘルプにて、下記の項目を参照してみてください。
座標系の考え方や、スケールの変換方法などが解説されています。

[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
  └[プログラミング ガイド]
    └[Visual Basic を使ってできること]
      └[テキストおよびグラフィックスの操作]
        └[座標系]

編集 削除
山型  2005-09-08 00:00:19  No: 92103  IP: [192.*.*.*]

>arrayとpicarrayは別モノってことでOK?
申し訳ありません。
コピー後の書き換え忘れです。
picarrayはarrayです。

>End If は必要数ある?
ElseIfでつなげているため、最後の一つだけでは足りないのでしょうか?

>> Picture1.ScaleMode = vbPixels
>> Picture1.Scale (0, 0)-(x, y)
>まず、この部分に問題がありますよ。
ありがとうございます。
Picture1.ScaleMode = vbPixels
だけにすることで、大分思ったとおりの画像が表示されました。

編集 削除
山型  2005-09-09 11:59:23  No: 92104  IP: [192.*.*.*]

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?を使ったところ、かなり速度は改善されました。

ありがとうございます。

編集 削除