#Bash with Bc and ImageMagick
#!/bin/bash
size="${1:-10}"
width=$(( size*25 ))
height=$(( size*size+size*10 ))
cos=( $( bc -l <<< "for (i=0;i<3.14*2;i+=.05) c(i)*100" ) )
sin=( $( bc -l <<< "for (i=0;i<3.14*2;i+=.05) s(i)*100" ) )
cos=( "${cos[@]%.*}" )
sin=( "${sin[@]%.*}" )
cos=( "${cos[@]/%-/0}" )
sin=( "${sin[@]/%-/0}" )
snow=()
needle=()
decor=()
for ((i=2;i<size+2;i++)); do
for ((j=3;j<=31;j++)); do
(( x=width/2+i*10+cos[62-j]*i*10/100 ))
(( y=i*i+sin[j]*i*5/100 ))
for ((e=0;e<i;e++)); do
needle+=(
-draw "line $x,$y $(( x+RANDOM%i-i/2 )),$(( y+RANDOM%i-i/2 ))"
-draw "line $(( width-x )),$y $(( width-x+RANDOM%i-i/2 )),$(( y+RANDOM%i-i/2 ))"
)
done
(( RANDOM%2 )) && (( x=width-x ))
snow+=(
-draw "circle $x,$(( y-i/2 )) $(( x+i/3 )),$(( y-i/2+i/3 ))"
)
(( RANDOM%10 )) || decor+=(
-fill "rgb($(( RANDOM%5*20+50 )),$(( RANDOM%5*20+50 )),$(( RANDOM%5*20+50 )))"
-draw "circle $x,$(( y+i )) $(( x+i/2 )),$(( y+i+i/2 ))"
)
done
done
flake=()
for ((i=0;i<width*height/100;i++)); do
flake+=(
-draw "point $(( RANDOM%width )),$(( RANDOM%height ))"
)
done
convert \
-size "${width}x$height" \
xc:skyblue \
-stroke white \
-fill white \
"${snow[@]}" \
-blur 5x5 \
"${flake[@]}" \
-stroke brown \
-fill brown \
-draw "polygon $(( width/2 )),0 $(( width/2-size )),$height, $(( width/2+size )),$height" \
-stroke green \
-fill none \
"${needle[@]}" \
-stroke none \
-fill red \
"${decor[@]}" \
x:
Sample run:
bash-4.1$ ./xmas.sh 5
Sample output:
Sample run:
bash-4.1$ ./xmas.sh 15
Sample output: