Download presentation

Presentation is loading. Please wait.

1
F# and Path Reduction Kit Eason - @kitlovesfsharp – www.kiteason.com – kit.eason@gmail.com

2
Norway – way too complicated!

3
Way, way too complicated!

4
Ramer–Douglas–Peucker

5
A record type type Point = {Long: double; Lat : double}

6
Distance from line let private findPerpendicularDistance p p1 p2 = if (p1.Long = p2.Long) then abs(p.Long - p1.Long) else let slope = (p2.Lat - p1.Lat) / (p2.Long - p1.Long) let intercept = p1.Lat - (slope * p1.Long) abs(slope * p.Long - p.Lat + intercept) / sqrt((pown slope 2) + 1.) let private findPerpendicularDistance p p1 p2 = if (p1.Long = p2.Long) then abs(p.Long - p1.Long) else let slope = (p2.Lat - p1.Lat) / (p2.Long - p1.Long) let intercept = p1.Lat - (slope * p1.Long) abs(slope * p.Long - p.Lat + intercept) / sqrt((pown slope 2) + 1.)

7
Recursive algorithm let rec Reduce epsilon (points : Point[]) = if points.Length < 3 || epsilon = 0. then points else let firstPoint = points.[0] let lastPoint = points.[points.Length - 1] let mutable index = -1 let mutable dist = 0.0 for i in 1..points.Length-1 do let cDist = findPerpendicularDistance points.[i] firstPoint lastPoint if (cDist > dist) then dist <- cDist index <- i if (dist > epsilon) then let l1 = points.[0..index] let l2 = points.[index..] let r1 = Reduce epsilon l1 let r2 = Reduce epsilon l2 Array.append (r1.[0..r1.Length-2]) r2 else [|firstPoint; lastPoint|] let rec Reduce epsilon (points : Point[]) = if points.Length < 3 || epsilon = 0. then points else let firstPoint = points.[0] let lastPoint = points.[points.Length - 1] let mutable index = -1 let mutable dist = 0.0 for i in 1..points.Length-1 do let cDist = findPerpendicularDistance points.[i] firstPoint lastPoint if (cDist > dist) then dist <- cDist index <- i if (dist > epsilon) then let l1 = points.[0..index] let l2 = points.[index..] let r1 = Reduce epsilon l1 let r2 = Reduce epsilon l2 Array.append (r1.[0..r1.Length-2]) r2 else [|firstPoint; lastPoint|]

8
let rec Reduce epsilon (points : Point[]) = if points.Length < 3 || epsilon = 0. then points else let firstPoint = points.[0] let lastPoint = points.[points.Length - 1] let mutable index = -1 let mutable dist = 0.0 for i in 1..points.Length-1 do let cDist = findPerpendicularDistance points.[i] firstPoint lastPoint if (cDist > dist) then dist <- cDist index <- i if (dist > epsilon) then let l1 = points.[0..index] let l2 = points.[index..] let r1 = Reduce epsilon l1 let r2 = Reduce epsilon l2 Array.append (r1.[0..r1.Length-2]) r2 else [|firstPoint; lastPoint|] let rec Reduce epsilon (points : Point[]) = if points.Length < 3 || epsilon = 0. then points else let firstPoint = points.[0] let lastPoint = points.[points.Length - 1] let mutable index = -1 let mutable dist = 0.0 for i in 1..points.Length-1 do let cDist = findPerpendicularDistance points.[i] firstPoint lastPoint if (cDist > dist) then dist <- cDist index <- i if (dist > epsilon) then let l1 = points.[0..index] let l2 = points.[index..] let r1 = Reduce epsilon l1 let r2 = Reduce epsilon l2 Array.append (r1.[0..r1.Length-2]) r2 else [|firstPoint; lastPoint|]

9
The data nan 8.299972 54.778750 8.300778 54.778278 8.300806 54.775778 8.302417 54.775000 8.302444 54.772472 8.300778 54.771611 8.300750 54.767444 nan 8.277417 54.764111 8.277417 54.775750 8.279083 54.776611 8.279111 54.797444 nan 8.299972 54.778750 8.300778 54.778278 8.300806 54.775778 8.302417 54.775000 8.302444 54.772472 8.300778 54.771611 8.300750 54.767444 nan 8.277417 54.764111 8.277417 54.775750 8.279083 54.776611 8.279111 54.797444

10
Reading the data let private ReadData fileName = fileName |> File.ReadAllLines |> Array.breakOn (fun line -> line = "nan nan") |> Array.Parallel.map ToPoints |> FilterCount 100 let private ReadData fileName = fileName |> File.ReadAllLines |> Array.breakOn (fun line -> line = "nan nan") |> Array.Parallel.map ToPoints |> FilterCount 100

11
Breaking into arrays let breakOn (f : 'a -> bool) (a : array ) = [| let result = ResizeArray() for x in a do if f x then yield result |> Array.ofSeq result.Clear() else result.Add(x) yield result |> Array.ofSeq |] let breakOn (f : 'a -> bool) (a : array ) = [| let result = ResizeArray() for x in a do if f x then yield result |> Array.ofSeq result.Clear() else result.Add(x) yield result |> Array.ofSeq |]

12
Converting to points let private ToPoints (lines : array ) = lines |> Array.Parallel.map (fun line -> line.Split [|'\t'|]) |> Array.Parallel.map (fun items -> items |> Array.map Double.Parse) |> Array.choose (fun doubles -> match doubles with | [|long; lat|] -> Some {Long=long; Lat=lat} | _ -> None) let private ToPoints (lines : array ) = lines |> Array.Parallel.map (fun line -> line.Split [|'\t'|]) |> Array.Parallel.map (fun items -> items |> Array.map Double.Parse) |> Array.choose (fun doubles -> match doubles with | [|long; lat|] -> Some {Long=long; Lat=lat} | _ -> None)

13
Eliminating tiny islands (and lakes!) let private FilterCount minCount groups = groups |> Array.filter (fun g -> Array.length g > minCount) let private FilterCount minCount groups = groups |> Array.filter (fun g -> Array.length g > minCount)

14
Calling the RDP algorithm let Simplify e polyLines = polyLines |> Array.Parallel.map (fun p -> p |> Reduce.Reduce e) let Simplify e polyLines = polyLines |> Array.Parallel.map (fun p -> p |> Reduce.Reduce e)

15
ε = 0

16
ε = 0.001

17
ε = 0.01

18
ε = 0.1

19
ε = 1

20
Out-takes

21
Resources www.github.com/misterspeedy/coastline www.github.com/misterspeedy/coastline www.fsharp.org www.fsharp.org www.fsharpforfunandprofit.com www.fsharpforfunandprofit.com Chris Smith’s “Animal Guide” www.github.com/misterspeedy/coastline www.github.com/misterspeedy/coastline www.fsharp.org www.fsharp.org www.fsharpforfunandprofit.com www.fsharpforfunandprofit.com Chris Smith’s “Animal Guide”

Similar presentations

OK

DIFFERENT FORMS. Standard Form: ax + by = c Where a is Positive Not a fraction.

DIFFERENT FORMS. Standard Form: ax + by = c Where a is Positive Not a fraction.

© 2017 SlidePlayer.com Inc.

All rights reserved.

Ads by Google

Ppt on review of related literature about study Ppt on product advertising slogan Ppt on obesity diet camp Ppt on diode characteristics circuit Ppt on hard gelatin capsule ingredients Lung anatomy and physiology ppt on cells Ppt on the poem the road not taken by robert frost Ppt on toyota production system Ppt on chromosomes and genes and alleles Ppt on covalent bonding animation