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
Integer
)
As
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 になります。