Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open System
- let beeTotal = 1000
- let magicA = 150
- let magicB = 100
- let areaGen = beeTotal / (magicA + magicB)
- let iterTotal = 1000
- let areaShrink = 0.2
- let rng = System.Random()
- let shuffleR xs = xs |> List.sortBy (fun _ -> rng.Next())
- type Func = float * float -> float
- type Area = struct
- val x1: float
- val x2: float
- val y1: float
- val y2: float
- new(X1, Y1, X2, Y2) = {x1 = X1; x2 = X2; y1 = Y1; y2 = Y2;}
- member this.RandP () =
- let x = this.x1 + (this.x2 - this.x1) * rng.NextDouble()
- let y = this.y1 + (this.y2 - this.y1) * rng.NextDouble()
- (x, y)
- member this.Radius =
- let x1 = this.x1
- let x2 = this.x2
- let y1 = this.y1
- let y2 = this.y2
- sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) / 2.
- end
- let areaBound (a: Area) (p: float * float) =
- let xmin = min a.x1 a.x2
- let xmax = max a.x1 a.x2
- let ymin = min a.y1 a.y2
- let ymax = max a.y1 a.y2
- let (x, y) = p
- min (max x xmin) xmax, min (max y ymin) ymax
- let pArea r p =
- let x, y = p
- Area(x - r, y - r, x + r, y + r)
- let initState (f: Func) (a: Area) =
- a, areaShrink * a.Radius,
- [for i = 1 to beeTotal do
- let coords = a.RandP()
- (f coords, coords)
- ] |> List.sort |> List.rev
- let iterate (f: Func) (state: Area * float * (float * (float * float)) list) =
- let a, r, li = state
- let top = List.take magicA li
- let bottom = List.skip magicA li |> shuffleR |> List.take magicB
- let points =
- (top @ bottom)
- |> List.map ((fun (_, p) -> pArea r p)
- >> (fun (a: Area) -> [for i = 1 to areaGen do a.RandP()]))
- |> List.reduce (@)
- |> List.map ((areaBound a)
- >> ((fun p -> f p, p)))
- |> List.sort |> List.rev
- a, areaShrink * r, points
- let f (x, y) = (x - 150.) * (x - 150.) - (y - 200.) * (y - 200.)
- let area = Area(0., 0., 1000., 1000.)
- let rec repeat f n x =
- if n = 0 then x else f(repeat f (n - 1) x)
- [<EntryPoint>]
- let main argv =
- let _, _, li =
- initState f area |>
- repeat (iterate f) iterTotal
- printfn "%A" li.[0]
- 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement