Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.17 KB | None | 0 0
  1. open System
  2.  
  3. let beeTotal = 1000
  4. let magicA = 150
  5. let magicB = 100
  6. let areaGen = beeTotal / (magicA + magicB)
  7.  
  8. let iterTotal = 1000
  9. let areaShrink = 0.2
  10.  
  11. let rng = System.Random()
  12.  
  13. let shuffleR xs = xs |> List.sortBy (fun _ -> rng.Next())
  14.  
  15. type Func = float * float -> float
  16.  
  17. type Area = struct
  18.     val x1: float
  19.     val x2: float
  20.     val y1: float
  21.     val y2: float
  22.     new(X1, Y1, X2, Y2) = {x1 = X1; x2 = X2; y1 = Y1; y2 = Y2;}
  23.     member this.RandP () =
  24.         let x = this.x1 + (this.x2 - this.x1) * rng.NextDouble()
  25.         let y = this.y1 + (this.y2 - this.y1) * rng.NextDouble()
  26.         (x, y)
  27.     member this.Radius =
  28.         let x1 = this.x1
  29.         let x2 = this.x2
  30.         let y1 = this.y1
  31.         let y2 = this.y2
  32.         sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) / 2.
  33. end
  34.  
  35. let areaBound (a: Area) (p: float * float) =
  36.     let xmin = min a.x1 a.x2
  37.     let xmax = max a.x1 a.x2
  38.     let ymin = min a.y1 a.y2
  39.     let ymax = max a.y1 a.y2
  40.     let (x, y) = p
  41.     min (max x xmin) xmax, min (max y ymin) ymax
  42.  
  43. let pArea r p =
  44.     let x, y = p
  45.     Area(x - r, y - r, x + r, y + r)
  46.  
  47. let initState (f: Func) (a: Area) =
  48.     a, areaShrink * a.Radius,
  49.     [for i = 1 to beeTotal do
  50.         let coords = a.RandP()
  51.         (f coords, coords)
  52.     ] |> List.sort |> List.rev
  53.  
  54. let iterate (f: Func) (state: Area * float * (float * (float * float)) list) =
  55.     let a, r, li = state
  56.     let top = List.take magicA li
  57.     let bottom = List.skip magicA li |> shuffleR |> List.take magicB
  58.     let points =
  59.         (top @ bottom)
  60.         |> List.map ((fun (_, p) -> pArea r p)
  61.             >> (fun (a: Area) -> [for i = 1 to areaGen do a.RandP()]))
  62.         |> List.reduce (@)
  63.         |> List.map ((areaBound a)
  64.             >> ((fun p -> f p, p)))
  65.         |> List.sort |> List.rev
  66.     a, areaShrink * r, points
  67.  
  68. let f (x, y) = (x - 150.) * (x - 150.) - (y - 200.) * (y - 200.)
  69. let area = Area(0., 0., 1000., 1000.)
  70.  
  71. let rec repeat f n x =
  72.     if n = 0 then x else f(repeat f (n - 1) x)
  73.  
  74. [<EntryPoint>]
  75. let main argv =
  76.     let _, _, li =
  77.         initState f area |>
  78.         repeat (iterate f) iterTotal
  79.     printfn "%A" li.[0]
  80.     0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement