1// Programmino per disegnare uno smiley che perde letteralmente gli occhi
2//  t e' il tempo trascorso dall'inizio
3//  a e' il parametro di attrito nell'urto
4//  g e' l'accelerazione gravitazionale
5//  v0 e' la velocita' all'urto numero 0
6
7include "g"
8
9time = t
10rate = 5.0*t // velocita' di cambiamento (bocca e capelli)
11
12a = 0.8
13g = 10.0
14v0 = 9.5
15
16Vers = Point
17Real@Vers[angle=$*0.01745329251994329576, $$=(Cos[angle], Sin[angle])]
18
19//-------------------------------------------------------------------------------
20// Calcoli per trovare l'altezza degli occhi
21t0 = 2.0*v0/g
22t = t + t0/2.0
23n  = Int[Log[(a - 1.0)*t/t0 + 1.0] / Log[a]]
24aN = Exp[n*Log[a]]
25vN = aN * v0
26tN = t0 * (aN - 1.0) / (a - 1.0)
27delta_t = t - tN
28h = -delta_t * (vN - 0.5*g*delta_t) + v0*v0/(2.0*g)
29
30sx = 5.0 - 0.0*(1.0-Exp[-rate])
31sy = 0.5 + 1.0*(1.0-Exp[-rate])
32q = (1.0-Exp[-rate])*3.0
33w = (1.0-Exp[-rate])*0.05
34
35//-------------------------------------------------------------------------------
36// Descrizione fisica dello smiley:
37r = 10                   // Raggio della faccia
38s = 0.4                  // Spessore delle linee di contorno
39ro = 2.5                 // Raggio degli occhi
40rp = 0.4*ro              // Raggio della pupilla
41od = Point[(3.5, -2.0)]  // Posizione dell'occhio destro
42gr = 1                   // Raggio guancie
43gd = Point[(6.0, 2.0)]   // Posizione della guancia destra
44
45//-------------------------------------------------------------------------------
46os = Point[(-od.x, od.y)] // Posizione dell'occhio sinistro
47gs = Point[(-gd.x, gd.y)] // Posizione della guancia sinistra
48// pd e ps sono le posizioni della pupilla destra e sinistra rispett.
49
50pd = od + (0, h*ro)
51ps = os + (0, h*ro)
52
53cf_in  = Color[.r = .g = 1.0, .b=Min[0.2*time, 0.8]] // Colore faccia
54cf_out = Color[.r = .g = 0.8, .b = cf_in.b]
55
56smile = Window[]
57
58\ smile[
59  \ .Circle[Style[.Fill[";"], .Border[color.black, s]]
60            Gradient[.Circle[(0, 0), 0; r], cf_in, 0.8, cf_in, cf_out]
61            (0, 0), r;                   // face
62            p := (0, 4.5), dp = (0, sy)
63            Gradient[.Line[p-dp, p+4*dp], color.red, color.black]
64            sx, sy, (0, 4.5); // mouth
65            color.white, os, ro; od;     // eyes
66            color.black, rp, rp, pd; ps] // Pupille
67
68  // Capelli
69  n = 3
70  spacing = 30.0 // spaziatura in gradi fra i capelli
71  angle = -90.0 - spacing
72  dangle = spacing/n
73  i = -n
74  color.black
75  \ .Line[s, v: = Vers[angle], v*r, v*(r+q); For[angle += dangle, ++i <= n]]
76]
77
78main = Window["rgb24", (220, 250), .Res[(0.28, 0.28)]]
79\ main.Put[smile, (110, 110), .Scale[(10, -10)]]
80main.Save["losing_eyes.png"]
81
82