C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Pictureboxに点群データを表示させる


(過去ログ 32 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■15900 / inTopicNo.1)  Pictureboxに点群データを表示させる
  
□投稿者/ Pman (1回)-(2008/03/25(Tue) 10:29:34)

分類:[C#] 

はじめまして、visual studio 2005のvisual C#を始めたばかりのものです。
プログラミング経験としては、VB6を多少かじっています。

早速ですが、

「csvファイルに入っている点群データ(x,yの座標が入ってます。)を呼び出して、
picturebox上に表示したい」と考えています。


しかし、VB6でいう、psetのようなメソッドが見つけられないため、

とりあえずgraphicsクラスの、drawlineメソッドを使っています。
ただ、こちらは、2点指定しないと線を描画してくれないので、

たとえば、点(10,10)を描画したいときには、

drawline(Pens.black,10,10,10.01,10)

などと、極短の線を描画させる、という方法をとっています。。


また、他の方法を探したところ、

Bitmapクラスにsetpixelというメソッドを発見したので、
そちらもつかってみましたが、

こちらは、幅、高さが(600,500)のピクチャーボックスに対して、
点(2000,1700)などを描画する際に、描画した点が、ハミ出してしまい、また、
ピクチャーボックス上の座標のスケール変換の方法もわからなかったので、保留しています。
(VB6では、ピクチャボックス内の座標をユーザ―座標に設定して、scale height,scale width
のような、機能がありましたよね)


C#では、ピクチャ―ボックスに点を描画するといった場合、どのような方法をとることが多いのでしょうか?


どなたか、御知恵をお貸しいただけると嬉しいです。
よろしくお願いいたします。









引用返信 編集キー/
■15904 / inTopicNo.2)  Re[1]: Pictureboxに点群データを表示させる
□投稿者/ 魔界の仮面弁士 (680回)-(2008/03/25(Tue) 11:13:46)
No15900 (Pman さん) に返信
> しかし、VB6でいう、psetのようなメソッドが見つけられないため、
VB6 の場合、DrawWidth プロパティで点の大きさを制御できますが、このプロパティの値を
増やすと、描画結果は円を描くようですから…強いて言えば、DrawEllipse メソッドでしょうか。
座標の指定が悩みどころですけど。

> とりあえずgraphicsクラスの、drawlineメソッドを使っています。
仕方ないとはいえ、10.01 という指定は微妙ですね。

縦横 1 ドットで良いなら、矩形でも円形でも見た目には変わらないので、
 g.FillRectangle(brush, x, y, 1, 1);
は如何でしょうか。
引用返信 編集キー/
■15928 / inTopicNo.3)  Re[2]: Pictureboxに点群データを表示させる
□投稿者/ Pman (2回)-(2008/03/25(Tue) 18:20:52)
No15904 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん、返信ありがとうございます!

早速、FillRectangleで試してみました!
こちらの方が、Drawlineよりもしっくりきますね!

ドットはなるべく小さいように、

g.FillRectangle(brush, x, y, 0.5, 0.5);

としてみました。


10万点、描画したところ、やはり全ての点を描画するまで時間がかかってしまいました。


今後、これらの点群を回転させることも考えているのですが、

座標x,yに回転行列を与えて構造体に格納してから、再描画となると、なかなかキツいでしょうか?

そもそも10万点も描画すること自体無謀な試みなのでしょうか。。

この点(表示させた点群を回転させる)に関しても、何かアドバイスいただけると嬉しいです。


どうぞよろしくお願いいたします。





引用返信 編集キー/
■15929 / inTopicNo.4)  Re[3]: Pictureboxに点群データを表示させる
□投稿者/ PATIO (52回)-(2008/03/25(Tue) 18:37:03)
2008/03/25(Tue) 18:37:52 編集(投稿者)

No15928 (Pman さん) に返信
> 10万点、描画したところ、やはり全ての点を描画するまで時間がかかってしまいました。
>
>
> 今後、これらの点群を回転させることも考えているのですが、
>
> 座標x,yに回転行列を与えて構造体に格納してから、再描画となると、なかなかキツいでしょうか?
>
> そもそも10万点も描画すること自体無謀な試みなのでしょうか。。
>
> この点(表示させた点群を回転させる)に関しても、何かアドバイスいただけると嬉しいです。

直接、画面に対して描画しているのであれば多分遅くなるのは仕方ないかと思います。
C#は殆ど使わないのでC#でのアドバイスはできないのですが、
一般的にはメモリ上で描画して描画が終わったタイミングで画面に転送するような手法で
描画のパフォーマンスを稼ぎます。
オフスクリーン描画といわれている手法です。
C#でこれに相当する事が出来るのであれば、いくらかの高速化は可能かもしれません。

あと回転に関してですが、正立で描画した画像を回転させて画面に転送する方法と
座標計算時に回転演算をした座標を計算して描画する方法があると思います。
多分、座標計算して描画した方が早いのではないかと思いますが、
なにぶん、C#ではやった事が無いので試してみた方が良いと思います。

引用返信 編集キー/
■15959 / inTopicNo.5)  Re[4]: Pictureboxに点群データを表示させる
□投稿者/ 組込系の人 (1回)-(2008/03/26(Wed) 06:17:53)
ピクチャーボックスではないですが、高速に描画するというのであれば
DirectXを簡単にあつかえる↓なんてどうでしょう?

http://homepage2.nifty.com/natupaji/DxLib/index.html

C++用となっていますが、C#からでも使えるように出来ています。
C#で使う場合は簡易マニュアルのみですが、
初期化さえ出来れば、あとはC++とほぼ同じ使い方が出来ます。
引用返信 編集キー/
■15960 / inTopicNo.6)  Re[3]: Pictureboxに点群データを表示させる
□投稿者/ Jitta on the way (63回)-(2008/03/26(Wed) 07:29:06)
No15928 (Pman さん) に返信
> ■No15904 (魔界の仮面弁士 さん) に返信
>
> 魔界の仮面弁士さん、返信ありがとうございます!
>
> 早速、FillRectangleで試してみました!
> こちらの方が、Drawlineよりもしっくりきますね!
>
> ドットはなるべく小さいように、
>
> g.FillRectangle(brush, x, y, 0.5, 0.5);
>
> としてみました。
ちょっとよくわからないのですが、描画単位をなににしていますか?ケータイからなので調べにくいので調べませんが、ピクセル単位に描画させれば、整数指定で大丈夫だと思います。





> 今後、これらの点群を回転させることも考えているのですが、
>
> 座標x,yに回転行列を与えて構造体に格納してから、再描画となると、なかなかキツいでしょうか?

Matrixというクラスがあったと思います。Graphicsを作るときに指定したような?
あ、描画したものを回転か。描画された画像を回転させて他の画像に貼り付けるとか。
引用返信 編集キー/
■16028 / inTopicNo.7)  Re[4]: Pictureboxに点群データを表示させる
□投稿者/ Pman (3回)-(2008/03/27(Thu) 09:16:59)
みなさん、ご意見ありがとうござます!返事が遅くなってしまいすみません。

■No15929 (PATIO さん) に返信

>オフスクリーン描画といわれている手法です。

おそらく、Bitmapクラスのsetpixelを使って描画する方法がそれに当たると思い、
再びトライしてみたところ、裏で描いてる時間は多少かかるものの、
表示は一瞬で出来るようになりました!

ありがとうございます!


>多分、座標計算して描画した方が早いのではないかと思いますが、

描画した画像を回すと、回転後の画像がぼやけてしまったので、座標を計算しなおしてから、描画させてみます!




■No15959 (組込系の人 さん) に返信

>DirectXについて

一番はじめにDirectXを使ってみたのですが、
ループ処理によって常に再描画をする、という仕組みから(ここをちゃんと理解していないのかもしれませんが)、
十万点を再描画させ続けると、全ての点が一度に描画される事がなく、
常にパラパラと、部分部分だけ表示される状態になってしまったので、
「やはり十万点は量が多すぎるのか。。」
とあきらめて、ループ処理ではない、graphicsクラスや、Bitmapクラスを使ってみることにしました。

しかし、今一度、DirectXも学びなおしてみます。
ご意見ありがとうございます。


■No15960 (Jitta on the way さん) に返信

>ちょっとよくわからないのですが、描画単位をなににしていますか?ケータイからなので調べにくいので調べませんが、ピクセル単位に描画させれば、整数指定で大丈夫だと思います。

描画単位を全く指定していません。(指定の仕方を把握できてません。。)
Bitmapクラスを使って描画する時には、ピクセル単位だとは思っているのですが、
Graphicsクラスを使って描画する時には、FillRectangleの第4・5 引数にfloat型が入ったので、
なるべく小さな四角形にするために、0.5という数字をいれました。ちなみに0.1にすると、表示されませんでした。。

>Matrixというクラス

ネット上でサンプルを見ながら、RotateAtメソッドを使ってみました。

ありがとうございます!

------------------------------------------------------------

みなさんに、いろいろなご意見を頂くことができ、本当に勉強になります。ありがとうございます。
一応今現在のソースコードを簡単に載せてみます。
描画までは良いのですが、回転に関して、一度描画した画像を回すと、回転後の画像がブレたような感じになってしまったので、次は、座標を計算しなおしてから、描画させるという方法をとってみようと思っています。


描画部分↓↓

Bitmap bm = new Bitmap(Picturebox1.Width, Picturebox1.Height);
               
float xP, yP;

中略(xP,xYに、座標データ:構造体配列ah[100000]から値を代入)
for (int i = 0; i <= 99999; i++)
            {
                xP = ah[i].dx;
                yP = ah[i].dy;
//裏で描画
                bm.SetPixel((int)xP, (int)yP, Color.White);

        //g.FillRectangle(Brushes.White, xP, yP, (float)0.5, (float)0.5);
        (こちらだと、描画に時間がかかってしまいましたので、今はsetpixelメソッドを。。)  
            }
//ピクチャボックスに表示
Picturebox1.Image = bm;


回転部分↓↓
              
Graphics g = Display1.CreateGraphics();

Matrix mx = new Matrix();

mx.RotateAt(15, new Point(bm.Width / 2, bm.Height));(bm:先ほど作ったBitmapクラスのインスタンス)

g.Transform = mx;

g.DrawImage(bm, new Point(0, 0));


引用返信 編集キー/
■16029 / inTopicNo.8)  Re[5]: Pictureboxに点群データを表示させる
□投稿者/ 渋木宏明(ひどり) (681回)-(2008/03/27(Thu) 10:06:48)
渋木宏明(ひどり) さんの Web サイト
> おそらく、Bitmapクラスのsetpixelを使って描画する方法がそれに当たると思い、
> 再びトライしてみたところ、裏で描いてる時間は多少かかるものの、

Bitmap.SetPixel() が遅いのは有名な話です。

Bitmap.LockBits() を用いてビットマップデータを直接操作すると、高速な書き換えが可能です。

> 表示は一瞬で出来るようになりました!

ウィンドウの重なりが変化した場合などの再表示も高速になったはずです。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -