oftenpaper.net

Cyclotron 4000

When I was young my parents bought me a Spirograph set at the flea market. I wasted lots and lots of paper with it. A modern tree-friendly rendition:

  1. 
    
    
    
    
    Manipulate[
     Module[{
       (* non-integer values of \[Zeta] give progressively more entwined paths, 
       but require smaller cycle widths to keep the plot from looking scrambled *)
       \[Psi] = Round[Abs[FractionalPart[\[Zeta]]]*1., .25] /. {
          0. -> y,
          .5 -> y/2,
          .25 | .75 -> y/4}},
    
      ParametricPlot[
    
       (1. + spirality*(Log[\[Theta] + 1.] - 1.))*
        {\[Psi] Cos[\[Theta]] + x  Cos[64. \[Theta]] + (1 - effect*RandomReal[])*\[Zeta]* (Cos[512. \[Theta]] + Cos[64. \[Zeta] \[Theta]]),
         \[Psi] Sin[\[Theta]] - x Sin[64. \[Theta]] + (1 - effect*RandomReal[])* inflection*\[Zeta]* (Sin[512. \[Theta]] + Sin[64. \[Zeta] \[Theta]])}
    
       , {\[Theta], 0, 2 \[Pi]},
    
       ImageSize -> {470, 410},
       PerformanceGoal -> "Quality",
    
       (* reduced opacity helps bring the shape out and gives an elegant tone *)
       PlotStyle -> {{color, Opacity[.43], AbsoluteThickness[thickness]}},
       PlotRange -> Full,
        PlotPoints -> 270,(* increase for higher-resolution images *)
       Axes -> None]],
    
     OpenerView[{"Style", Column[{
         Control@{{color, Black, "line color"}, ColorSlider},
         Column@{
           (* these controls are smallerized for consistency *)
           Control@{{thickness, 0., "line thickness"}, 0, 20, Appearance -> "Labeled", ImageSize -> Small},
           Control@{{effect, 0., "charcoal effect"}, 0, .25, Appearance -> "Labeled", ImageSize -> Small}}}]}],
    
     Row[{
       Control@{{inflection, 1}, {1 -> " concave ", -1 -> " convex "}, Appearance -> "Vertical"},
    
       Spacer[30],
    
       Column@{
         Control@{{\[Zeta], 2., "angularity"}, -7.5, 7.5, .5, Appearance -> "Labeled", ImageSize -> Small},
         Control@{{x, 8., "tension"}, 0, 12, Appearance -> "Labeled", ImageSize -> Small}},
    
       Column@{
         Control@{{y, 2., "cycle width"}, 0, 2, ImageSize -> Tiny},
         Control[{{spirality, 0.}, 0, 1, ImageSize -> Tiny}]}
    
       }],
    
     Alignment -> Center,
     SynchronousUpdating -> False,
     AppearanceElements -> "ManipulateMenu",
    
     Bookmarks -> {
    
       (* this bookmark assigns random values to the factors.
       I intentionally didn't make this feature rapid-fireable *)
       "Random" :> (
         color = RGBColor[RandomReal[], RandomReal[], RandomReal[]];
         inflection = RandomChoice[{1, -1}];
    
         (* effect, thickness, and spirality have distributions that make
         small values smaller and large values rarer [you mean "power law" -- future version of myself]*)
         effect = .25*RandomReal[]^8;
         thickness = 10*RandomReal[]^8;
         spirality = RandomReal[]^3;
    
         If[spirality < .035, spirality = 0];
    
         x = RandomReal[]*12;
         y = RandomReal[]*2;
    
         Module[{
           (* +/- .5 are generally not interesting when x > 3 *)
           weights = If[x > 3, {.1, .03, .87}, {.1, .07, .83}]},
          \[Zeta] = RandomChoice[{-1, 1}]*RandomChoice[weights ->
              {RandomReal[7.5], (* small chance to fall on non-integral \[Zeta] *)
               RandomChoice[{0, .5, .5}],(* multiple .5 isn't a typo *)
               Round[RandomReal[{1, 7.5}], .5]}]];
         ),
    
       "Rose" :> {thickness = 0, color = Red, effect = 0, inflection = -1, x = 0, y = 1.1343, spirality = 0, \[Zeta] = 3},
       "Glyph" :> {thickness = 0, color = Black, effect = 0.198, inflection = 1, x = 5.2, y = 0., spirality = 0, \[Zeta] = 2},
       "Mass Atomic" :> {thickness = 0, effect = 0, inflection = -1, x = 5.84, y = 0.412, spirality = 0, \[Zeta] = -4.2504},
       "Jello" :> {thickness = 0, color = Red, effect = 0, inflection = -1, x = 12., y = 0.846, spirality = 1., \[Zeta] = -1.},
       "Grim" :> {thickness = 3.35, color = Black, effect = 0.0675, inflection = 1, x = 8., y = 0.296, spirality = 1., \[Zeta] = -1.},
       "Angelwings" :> {color = RGBColor[0.07693598840314336, 0.39046311131456474, 1], effect = 0, inflection = 1, spirality = 1.`, thickness = 0, x = 12, y = 0, \[Zeta] = -5.4946511679431715`},
       "Rollers" :> {color = RGBColor[0.`, 0.`, 0.`], effect = 0.`, inflection = -1, spirality = 0.`, thickness = 0.`, x = 5.5`, y = 0.1`, \[Zeta] = -0.984032039033508`},
       "Lifespark" :> {color = RGBColor[0.1026, .9878, .0201], effect = 0, inflection = 1, spirality = .0995, x = 3.2757, y = .2002, \[Zeta] = -5.5}
       }
     ]
    
    
    
    
    
    

I'm particularly proud of this program because it can produce a wide variety of images from just a few parameters. Though that's not an accident. A lot of fine-tuning and experimentation was involved. For the "Super Mario 64" to this program's "Super Mario," see my Cycowtron 4800 Deluxe.