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

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

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

Re[13]: C# 描画ツールについて


(過去ログ 110 を表示中)

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

■64888 / inTopicNo.1)  C# 描画ツールについて
  
□投稿者/ もとみ (1回)-(2013/01/20(Sun) 21:11:29)

分類:[C#] 

Form画面にPictureBoxを張り付け、PictureBox内で、マウスを動かした時に描画するプログラムを作りました。
しかし、今の状態だと、PictureBoxのMouseMoveイベント内での処理なので、マウスがPictureBoxに入った瞬間から描画が始まってしまっています。

『PictureBox内でマウスが○○秒静止したら描画を始める』
または
『PictureBox内でのマウスの速度が○○以上だったら描画を始める』というような処理にしたいです。

Timerを使えば良いのかなと思いましたが、いまいち分かりません(>_<)
教えていただけたら嬉しいです。


引用返信 編集キー/
■64889 / inTopicNo.2)  Re[1]: C# 描画ツールについて
□投稿者/ Azulean (87回)-(2013/01/20(Sun) 22:47:37)
この場合、描き始めは対策できていると思いますが、描き終わりは PictureBox の外に出る間での線が残りますよね。
それは自分の望んでいた姿でしょうか?

この手のものはマウスボタンを押し始めてから離すまで線を引いている印象です。
MouseMove イベントの e.Buttons を参照するとよいかもしれませんね。
引用返信 編集キー/
■64895 / inTopicNo.3)  Re[2]: C# 描画ツールについて
□投稿者/ もとみ (2回)-(2013/01/21(Mon) 14:11:12)
No64889 (Azulean さん) に返信
> この場合、描き始めは対策できていると思いますが、描き終わりは PictureBox の外に出る間での線が残りますよね。
> それは自分の望んでいた姿でしょうか?

望んでいた形ではないですね…

> この手のものはマウスボタンを押し始めてから離すまで線を引いている印象です。
> MouseMove イベントの e.Buttons を参照するとよいかもしれませんね。

MouseUpとMouseDownを使わない形でやりたいと思ってました。
説明不足ですいません;
引用返信 編集キー/
■64896 / inTopicNo.4)  Re[3]: C# 描画ツールについて
□投稿者/ howling (158回)-(2013/01/21(Mon) 14:21:11)
No64895 (もとみ さん) に返信
> MouseUpとMouseDownを使わない形でやりたいと思ってました。
> 説明不足ですいません;

こんにちわ。
えーと、ですからMouseMoveイベントでやってみたらいかが?とAzuleanさんが書いているかと…。
e.Buttonsで、どのボタンが押されているのか取得できると思います。
また、e.Xとe.Yでマウス位置が取れます。
前回の位置と時間を記憶しておけば、今回と前回の位置の差分=移動量になりますよね。
また、この移動量を今回と前回の時間の差分で割ってやれば、速度が出るはずです。
この速度が「マウスが止まっているとみなされる速度より遅い」場合にも同じく時間を取れば、
ご希望の事ができるのではないか?と思いますが…いかがでしょうか?


引用返信 編集キー/
■64897 / inTopicNo.5)  Re[4]: C# 描画ツールについて
□投稿者/ もとみ (3回)-(2013/01/21(Mon) 14:39:00)
No64896 (howling さん) に返信
> ■No64895 (もとみ さん) に返信
>>MouseUpとMouseDownを使わない形でやりたいと思ってました。
>>説明不足ですいません;
>
> こんにちわ。
> えーと、ですからMouseMoveイベントでやってみたらいかが?とAzuleanさんが書いているかと…。
> e.Buttonsで、どのボタンが押されているのか取得できると思います。
> また、e.Xとe.Yでマウス位置が取れます。
> 前回の位置と時間を記憶しておけば、今回と前回の位置の差分=移動量になりますよね。
> また、この移動量を今回と前回の時間の差分で割ってやれば、速度が出るはずです。
> この速度が「マウスが止まっているとみなされる速度より遅い」場合にも同じく時間を取れば、
> ご希望の事ができるのではないか?と思いますが…いかがでしょうか?


な、なるほど! 「MouseMoveイベントの」ってところを見落としてました;;すいません。
できる気がします!…が、できなかったら、また質問させたいただきます。ありがとうございました!!
引用返信 編集キー/
■64939 / inTopicNo.6)  Re[5]: C# 描画ツールについて
□投稿者/ もとみ (4回)-(2013/01/24(Thu) 09:23:12)
2013/01/24(Thu) 09:26:00 編集(投稿者)
2013/01/24(Thu) 09:25:52 編集(投稿者)

解決しました!!
ありがとうございました。
解決済み
引用返信 編集キー/
■64979 / inTopicNo.7)  Re[6]: C# 描画ツールについて
□投稿者/ tototo (3回)-(2013/01/28(Mon) 14:41:08)
2013/01/28(Mon) 14:45:04 編集(投稿者)


引用返信 編集キー/
■64980 / inTopicNo.8)  Re[7]: C# 描画ツールについて
□投稿者/ もとみ (5回)-(2013/01/28(Mon) 14:55:56)
すいません、新たな問題が出てきました…


座標の取得は出来たのですが、移動距離を
(○秒後に取得した座標ー初めに取得した座標) / ○秒で、x座標y座標それぞれ求めたのですが、なぜかマウスが左側に移動するとx座標が0に近づき、右側に移動すると大きくなります。
y座標も同様に上に移動すると0に近づき、下に移動すると大きくなります。

原因が分からなくて困っています。助言よろしくお願いします。
引用返信 編集キー/
■64982 / inTopicNo.9)  Re[8]: C# 描画ツールについて
□投稿者/ shu (151回)-(2013/01/28(Mon) 15:33:03)
No64980 (もとみ さん) に返信
> すいません、新たな問題が出てきました…
>
>
> 座標の取得は出来たのですが、移動距離を
> (○秒後に取得した座標ー初めに取得した座標) / ○秒で、x座標y座標それぞれ求めたのですが、なぜかマウスが左側に移動するとx座標が0に近づき、右側に移動すると大きくなります。
> y座標も同様に上に移動すると0に近づき、下に移動すると大きくなります。
>
> 原因が分からなくて困っています。助言よろしくお願いします。
それは画面の座標系では普通ですが、どうして困っているのでしょうか?
ちなみに距離をだすなら
(x1,y1)から(x2,y2)に移動したとして
(x1 - x2)^2 + (y1 - y2)^2 の平方根になります。(三平方の定理です)
また最初に取得した座標からの距離だと最初に取得した座標に近い点に戻ってくると速度が落ちてしまいますので
最初に取得した座標を基準とせず例えば10ms経過するごとに座標を記録し前回座標との距離で処理した方が安定すると思います。
引用返信 編集キー/
■64985 / inTopicNo.10)  Re[8]: C# 描画ツールについて
□投稿者/ howling (165回)-(2013/01/28(Mon) 15:40:22)
No64980 (もとみ さん) に返信
うーん、なぜでしょう。
取り方が同じであれば、差分を見る場合には問題ない気がするのですが。

イベントの呼び元は変えたりしてませんよね?
変えてやってしまうと、おかしなことになるかもしれません。
できれば、その部分だけでもソース切り取って載せて頂けるとありがたいです。
中略、とか入れてもらって結構ですので。
引用返信 編集キー/
■65078 / inTopicNo.11)  Re[9]: C# 描画ツールについて
□投稿者/ もとみ (6回)-(2013/02/01(Fri) 15:38:46)
No64982 (shu さん) に返信
> (x1 - x2)^2 + (y1 - y2)^2 の平方根になります。(三平方の定理です)

お返事遅くなってすいません。
これは、Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)); という計算でよろしいのでしょうか?
引用返信 編集キー/
■65079 / inTopicNo.12)  Re[9]: C# 描画ツールについて
□投稿者/ もとみ (7回)-(2013/02/01(Fri) 15:44:11)
No64985 (howling さん) に返信

> うーん、なぜでしょう。
> 取り方が同じであれば、差分を見る場合には問題ない気がするのですが。
>
> イベントの呼び元は変えたりしてませんよね?
> 変えてやってしまうと、おかしなことになるかもしれません。
> できれば、その部分だけでもソース切り取って載せて頂けるとありがたいです。
> 中略、とか入れてもらって結構ですので。

お返事遅れてしまってすいません。

private void picturebox_mousemove(object sender, MouseEventArgs e)
{
int x1 = MousePosition.X;
int y1 = MousePosition.Y;

t = new Timer();
t.Tick += new EventHandler(Event);
t.Interval = 3000;
t.Start();

mousePoint1 = new Point(x1,y1);
label1.Text = mousePoint1.ToString();
}

public void Event(object sender, EventArgs e)
{
      t.Stop();

int x2 = MousePosition.X;
int y2 = MousePosition.Y;

mousePoint2 = new Point(x2, y2);
label2.Text = mousePoint2.ToString();

x = (Math.Abs(x2 - x1)) / t.Interval;
y = (Math.Abs(y2 - y1)) / t.Interval;

mousePoint3 = new Point(x, y);
label3.Text = mousePoint3.ToString();
}

です。
何か、アドバイスよろしくお願いします…TT
引用返信 編集キー/
■65080 / inTopicNo.13)  Re[10]: C# 描画ツールについて
□投稿者/ howling (177回)-(2013/02/01(Fri) 17:01:57)
No65079 (もとみ さん) に返信
自分もやったことなかったので、やってみました。
マウスの動く速度って速いんだなぁ。秒速にしたらでかすぎて、嘘だろ?と思った。

※おそらく、うまくいかないのはMousePositionを使っているから。
 使うなら、今回だとPictureBoxの左上座標を引いてやんないと、PC上の絶対座標になってしまったよーな。
 
・Timerの代わりにStopWatch使いました。こんな時のためにあるようなものだし。
・デザイナ上で、Form1にPictureBox1とlabel1を貼り付け、PictureBox1のMouseMoveイベントのみ処理しています。
・マウスイベントの引数にある、マウス座標を使っています。

    public partial class Form1 : Form
    {
        //前回のマウス座標
        Point PastPoint
        {
            set;
            get;
        }
        //時間計測用
        System.Diagnostics.Stopwatch MyStopWatch
        {
            set;
            get;
        }
        public Form1()
        {
            InitializeComponent();
            PastPoint = new Point();
            MyStopWatch = new System.Diagnostics.Stopwatch();
        }
        
        private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
        {           
            //計測が速すぎてマウス座標変化が無いので、次回まで待つ
            if ((PastPoint.X != e.X) || (PastPoint.Y != e.Y))
            {
                if (MyStopWatch.IsRunning == true)
                {
                    MyStopWatch.Stop();
                }

                float fDistX = Math.Abs((float)(e.X - PastPoint.X)); //X成分の距離
                float fDistY = Math.Abs((float)(e.Y - PastPoint.Y)); //Y成分の距離
                //3平方の定理より、実際の距離
                float fDistXY = (float)Math.Sqrt((double)((fDistX * fDistX) + (fDistY * fDistY)));
                
                //速度を出すために、時間で割る(ゼロディバイドのみ回避)
                float fMouseSpeed = (fDistXY == 0.0f) ? 0.0f : (fDistXY / (float)(MyStopWatch.ElapsedMilliseconds));
                //↑ミリ秒単位での速度

                if (Double.IsInfinity(fMouseSpeed) == true)
                {
                    fMouseSpeed = 0.0f;
                }

                label1.Text = fMouseSpeed.ToString();

                PastPoint = new Point(e.X, e.Y);
                
                MyStopWatch.Restart();
            }
        }
    }

引用返信 編集キー/
■65081 / inTopicNo.14)  Re[10]: C# 描画ツールについて
□投稿者/ howling (178回)-(2013/02/01(Fri) 17:05:56)
あ、忘れてた。
これだと、マウス座標が動く前から動いた後のミリ秒での速度になっていますが、
shuさんのおっしゃる通り、ある一定時間を計測しても良いと思いますし、
ミリ秒単位ではなく、もう少し大きい単位で出してやってもいいかもしれません。
普通に動かしていると、1行かないくらいの値ですから…。

ソースにミスとかあったら教えてください。
とりあえず動作確認済みです。
引用返信 編集キー/
■65089 / inTopicNo.15)  Re[10]: C# 描画ツールについて
□投稿者/ shu (166回)-(2013/02/04(Mon) 00:10:03)
No65079 (もとみ さん) に返信

VB.NET版ですがこんな感じでどうでしょう?
いろんな変数の後始末とかしていないので参考程度にしてください。

Public Class Form1
Private gp As Graphics
Private pt1 As Point
Private stopflg As Boolean = True
Private drawflg As Boolean = False
Private starttime As Date

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
gp = PictureBox1.CreateGraphics()
End Sub

Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
If stopflg Then
pt1 = e.Location
stopflg = False
starttime = Date.Now()
Else
Dim nowtime = Date.Now()
If nowtime.Subtract(starttime).TotalMilliseconds < 10 Then Exit Sub
Dim pt2 = e.Location
Dim dest = Math.Sqrt((pt2.X - pt1.X) ^ 2 + (pt2.Y - pt1.Y) ^ 2)
If drawflg Then
gp.DrawLine(Pens.Black, pt1, pt2)
End If
pt1 = pt2
If dest > 5 Then
Timer1.Stop()
Else
Timer1.Interval = 2000
Timer1.Start()
End If
End If
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Timer1.Stop()
drawflg = Not drawflg
If drawflg Then
PictureBox1.Cursor = Cursors.Cross
Else
PictureBox1.Cursor = Cursors.Default
End If
End Sub
End Class
引用返信 編集キー/
■65090 / inTopicNo.16)  Re[11]: C# 描画ツールについて
□投稿者/ shu (167回)-(2013/02/04(Mon) 00:12:31)
No65079 (もとみ さん) に返信

前コメ、インデント付け忘れ、編集キー忘れなので再度載せます。
 
Public Class Form1
    Private gp As Graphics
    Private pt1 As Point
    Private stopflg As Boolean = True
    Private drawflg As Boolean = False
    Private starttime As Date

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        gp = PictureBox1.CreateGraphics()
    End Sub

    Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
        If stopflg Then
            pt1 = e.Location
            stopflg = False
            starttime = Date.Now()
        Else
            Dim nowtime = Date.Now()
            If nowtime.Subtract(starttime).TotalMilliseconds < 10 Then Exit Sub
            Dim pt2 = e.Location
            Dim dest = Math.Sqrt((pt2.X - pt1.X) ^ 2 + (pt2.Y - pt1.Y) ^ 2)
            If drawflg Then
                gp.DrawLine(Pens.Black, pt1, pt2)
            End If
            pt1 = pt2
            If dest > 5 Then
                Timer1.Stop()
            Else
                Timer1.Interval = 2000
                Timer1.Start()
            End If
        End If
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Timer1.Stop()
        drawflg = Not drawflg
        If drawflg Then
            PictureBox1.Cursor = Cursors.Cross
        Else
            PictureBox1.Cursor = Cursors.Default
        End If
    End Sub
End Class

引用返信 編集キー/
■65103 / inTopicNo.17)  Re[11]: C# 描画ツールについて
□投稿者/ もとみ (8回)-(2013/02/05(Tue) 09:23:18)
No65081 (howling さん) に返信

動作しました-!!
本当にありがとうございますTT
引用返信 編集キー/
■65104 / inTopicNo.18)  Re[12]: C# 描画ツールについて
□投稿者/ もとみ (9回)-(2013/02/05(Tue) 09:25:00)
No65090 (shu さん) に返信

なんとなく読めるものですね!
参考にちょっと作ってみます^^
ありがとうございます!!
引用返信 編集キー/
■65106 / inTopicNo.19)  Re[12]: C# 描画ツールについて
□投稿者/ howling (179回)-(2013/02/05(Tue) 10:31:18)
No65103 (もとみ さん) に返信
いえいえ。解決済みで良いのかな?
実際やりたいこととズレてたらすんません。
自分なりにいじってみてくだせぇ。
引用返信 編集キー/
■65134 / inTopicNo.20)  Re[13]: C# 描画ツールについて
 
□投稿者/ もとみ (10回)-(2013/02/07(Thu) 12:04:53)
No65106 (howling さん) に返信

解決ですね笑
いろいろいじってみます^^

本当にありがとうございました!!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -