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