Advertisement
Matthen

Evolve Circles

Nov 19th, 2011
385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.15 KB | None | 0 0
  1. PolygonArea[pts_] :=
  2. Abs[Apply[Plus,
  3. Flatten[pts Map[({1, -1} Reverse[#] &), RotateLeft[pts]]]]/2];
  4. gensize = 100;
  5. npoints = 20;
  6. NextGeneration[gen_] :=
  7. Module[{fitnesses = Map[PolygonArea[#]^2 &, gen]},
  8. Map[Mate, Partition[RandomChoice[fitnesses -> gen, 2 gensize], 2]]
  9. ];
  10. Normalise[poly_] :=
  11. Module[{length =
  12. Total[Map[Norm[#[[1]] - #[[2]]] &,
  13. Transpose[{poly, RotateLeft[poly]}]]], new},
  14. new = 2 Pi poly/length; 2
  15. Map[# - Mean[new] &, new]
  16. ];
  17. Mate[{p1_, p2_}] :=
  18. Normalise[(p1 + p2)/2 +
  19. RandomReal[NormalDistribution[0, 0.12], {npoints, 2}]];
  20. Clear[generation];
  21. RandomPolygon[n_] := Normalise[RandomReal[{-1, 1}, {n, 2}]];
  22. generation[0] = Table[RandomPolygon[npoints], {i, gensize}];
  23. generation[n_] := generation[n] = NextGeneration[generation[n - 1]];
  24. DrawGeneration[n_] :=
  25. Module[{areas = Map[PolygonArea, generation[n]], poly},
  26. poly = generation[n][[First@First@Position[areas, Max[areas]]]];
  27. Graphics[{
  28. EdgeForm[Darker@Red], Thick, FaceForm[RGBColor[0.8, 0.95, 1.0]],
  29. Polygon[poly]}, PlotRange -> 3, ImageSize -> 300]
  30. ];
  31. Manipulate[DrawGeneration[n], {n, 1, 200, 1}]
  32.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement