Another code sample from Wolfram Community. I noticed that a discussion about programming a lighted Christmas Tree from a simple equation t*Snt[t] became very popular on Reddit. It is connected to a project a programmer developed. I thought how fast we can make it with Wolfram language? Here is the result with slight flickering 😉 Note a very special care needs to be paid to the dimming of the lights at a larger distances, and pretty shadowing.
- Function s(t, f) is rescaling sampling rate of driving parameter t of parametric curve so points are distributed uniformly. f is basically phase shift.
- Parameter PD is just average distance between points
This .GIF file has 100 frames. Enjoy! And in the spirit of holidays don’t forget to read: “Happy Holidays”, the Wolfram Language Way
PD = .5; s[t_, f_] := t^.6 - f; dt[cl_, ps_, sg_, hf_, dp_, f_] := {PointSize[ps], Hue[cl, 1, .6 + sg .4 Sin[hf s[t, f]]], Point[{-sg s[t, f] Sin[s[t, f]], -sg s[t, f] Cos[s[t, f]], dp + s[t, f]}]}; frames = ParallelTable[ Graphics3D[Table[{dt[1, .01, -1, 1, 0, f], dt[.45, .01, 1, 1, 0, f], dt[1, .005, -1, 4, .2, f], dt[.45, .005, 1, 4, .2, f]}, {t, 0, 200, PD}], ViewPoint -> Left, BoxRatios -> {1, 1, 1.3}, ViewVertical -> {0, 0, -1}, ViewCenter -> {{0.5, 0.5, 0.5}, {0.5, 0.55}}, Boxed -> False, PlotRange -> {{-20, 20}, {-20, 20}, {0, 20}}, Background -> Black], {f, 0, 1, .01}]; Export["tree.gif", frames]
And from Silvia Hao comes improved version:
PD = .5; s[t_, f_] := t^.6 - f dt[cl_, ps_, sg_, hf_, dp_, f_, flag_] := Module[{sv, basePt}, {PointSize[ps], sv = s[t, f]; Hue[cl (1 + Sin[.02 t])/2, 1, .3 + sg .3 Sin[hf sv]], basePt = {-sg s[t, f] Sin[sv], -sg s[t, f] Cos[sv], dp + sv}; Point[basePt], If[flag, {Hue[cl (1 + Sin[.1 t])/2, 1, .6 + sg .4 Sin[hf sv]], PointSize[RandomReal[.01]], Point[basePt + 1/2 RotationTransform[20 sv, {-Cos[sv], Sin[sv], 0}][{Sin[sv], Cos[sv], 0}]]}, {}] }] frames = ParallelTable[ Graphics3D[Table[{ dt[1, .01, -1, 1, 0, f, True], dt[.45, .01, 1, 1, 0, f, True], dt[1, .005, -1, 4, .2, f, False], dt[.45, .005, 1, 4, .2, f, False]}, {t, 0, 200, PD}], ViewPoint -> Left, BoxRatios -> {1, 1, 1.3}, ViewVertical -> {0, 0, -1}, ViewCenter -> {{0.5, 0.5, 0.5}, {0.5, 0.55}}, Boxed -> False, PlotRange -> {{-20, 20}, {-20, 20}, {0, 20}}, Background -> Black], {f, 0, 1, .01}]; Export["tree.gif", frames]
Leave a Reply