Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

カーソルのトラッキングについて 解決済み

数学 タグの編集...

投稿者 イヨ   (社会人)   投稿日時 2020/9/24 09:19:15
こんにちは
お世話になっております。

カーソルのトラッキングについて
x600 y400 のフォームがありましてxを60ずつ yを40ずつ
クリックした値に対し近しい座標までもっていき取得したいです。

例えば x:248 y 85 ですと
x:248は60の4倍が近しいのでx:240に移動
y:85は40の2倍が近しいのでy:80に移動

いろいろやってみましたが指定の数値で対応ができなくて。。(百の位を四捨五入するとか)
なにかいい方法がありませんでしょうか

宜しくお願いします。

投稿者 るきお   (社会人)   投稿日時 2020/9/25 08:18:28
>いろいろやってみましたが指定の数値で対応ができなくて。。(百の位を四捨五入するとか)
>なにかいい方法がありませんでしょうか
近い倍数を算出するプログラムについて聞きたいということであっていますか?

置き換えると次のような問題を解くプログラムを作ればよいのですね。

問 248 にもっと近い 60 の倍数を求めよ。

248 ÷ 60 = 4.13333… なので、答えは 60 × 4 = 240 か 60 × 5 = 300 のどちらかです。
240 と 300 のどちらが 248 に近いかは引き算するとわかります。
248 - 240 = 8
300 - 248 = 52
なので、 8 対 52 で 240 の方が 248 に近いです。
以上の通りで、答えは 248 です。


これをVBのプログラムとして計算する RoundMultiple 関数を作ってみました。呼び出し例もつけて紹介します。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    '248に一番近い60の倍数を算出します。newXは240になります。 
    Dim newX As Integer = RoundMultiple(248, 60)

    '85に一番近い40の倍数を算出します。newYは80になります。 
    Dim newY As Integer = RoundMultiple(85, 40)

    MsgBox(newX & "," & newY & " の位置にマウスカーソルを移動します。")
    
End Sub

''' <summary> 
''' value に一番近い factor の倍数を算出します。 
''' </summary> 
''' <param name="value"></param> 
''' <param name="factor"></param> 
''' <returns></returns> 
Private Function RoundMultiple(value As Integer, factor As IntegerAs Integer

    '例 248 ÷ 60 = 4.13… 
    Dim rate As Double = value / factor

    '例 4.13 を切り捨てて 4 にして、factor(=60) の4倍を求めます。結果は 240 です。 
    Dim value以下で最も大きい倍数 As Integer = CInt(Math.Floor(rate) * factor)

    '例 4.13 を切り挙げて 5 にして、factor(=60) の5倍を求めます。結果は 300 です。 
    Dim value以上で最も小さい倍数 As Integer = CInt(Math.Ceiling(rate) * factor)

    '求める結果はこのどちらかのはずです。 
    'valueと近いほうがどちらから比べて、答えを出します。 

    Dim 差1 As Integer = value - value以下で最も大きい倍数
    Dim 差2 As Integer = value以上で最も小さい倍数 - value

    If 差1 < 差2 Then
        Return value以下で最も大きい倍数
    Else
        Return value以上で最も小さい倍数
    End If

End Function


投稿者 イヨ   (社会人)   投稿日時 2020/9/28 08:47:11
るきお様
お世話になっております。

やりたかったことができました!
RoundMultiple関数って初めて聞きました
とっても勉強になりました。mom
ありがとうございました

投稿者 るきお   (社会人)   投稿日時 2020/9/28 20:16:43
解決してよかったです。

>RoundMultiple関数って初めて聞きました
私が作った関数なので無理もありません。

Private Function RoundMultiple のところで名前を定義しています。
たとえば、ここを Private Function xxxxx に修正すると、関数名は xxxxx になります。