-
Notifications
You must be signed in to change notification settings - Fork 146
/
MouseFollow.fsx
38 lines (32 loc) · 1.31 KB
/
MouseFollow.fsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// ----------------------------------------------------------------------------
// F# async extensions (StockSlidingWindow.fsx)
// (c) Tomas Petricek, 2011, Available under Apache 2.0 license.
// ----------------------------------------------------------------------------
// This example demonstrates how to implement a simple mouse following
// algorithm using asynchronous sequences and Observable.window
#r @"..\build\FSharpx.Core.dll"
open FSharp.Control
open System.Drawing
open System.Windows.Forms
let form = new Form(Visible=true, TopMost=true)
// Asynchronous sequence that returns cursor position at the 50 FPS rate
let updates =
asyncSeq {
while true do
yield form.PointToClient(Cursor.Position)
do! Async.Sleep(20) }
|> AsyncSeq.toObservable
// Turn the updates into floating point numbers and calculate average
// over sliding window containing the last 20 values
updates
|> Observable.map (fun me -> float32 me.X, float32 me.Y)
|> Observable.windowed 20
|> Observable.map (fun win ->
let x = Array.averageBy fst win
let y = Array.averageBy snd win
x, y)
// Draw an ellispe at the calculated location
|> Observable.add (fun (x, y) ->
use gr = form.CreateGraphics()
gr.Clear(Color.White)
gr.FillEllipse(Brushes.DarkOliveGreen, x - 10.0f, y - 10.0f, 20.0f, 20.0f) )