using System; using Cairo; using Gdk; using Gtk; class Area : DrawingArea { public int k = 0, // Лічильник кроків n = 9, // Кількість розташувань відрізків m = 9, // Кількість відображених відрізків x0 = 110, // Абсциса центра екрану - половина його ширини y0 = 110; // Ордината центра екрану - половина його висоти public double[] c = new double[9]; // Косинуси кутів нахилу public double[] s = new double[9]; // Синуси кутів нахилу public double[] a = new double[9]; // Значення прозорості protected override bool OnDrawn(Context cr) // малювання { cr.LineWidth = 20; cr.LineCap = LineCap.Round; double r1 = Math.Min(x0, y0) * 0.6, r0 = r1 / 3; for (int j = 0; j < n; j++) { cr.SetSourceRGBA(0, 0.5, 0, a[(j + k) % n]); cr.MoveTo(x0 + r0 * c[j], y0 + r0 * s[j]); cr.LineTo(x0 + r1 * c[j], y0 + r1 * s[j]); cr.Stroke(); } return true; } } class OwnWindow : Gtk.Window // клас вікна застосунку { public Area da; public OwnWindow() : base("Очікування") { da = new Area(); for (int j = 0; j < da.n; j++) { da.c[j] = Math.Cos(2 * Math.PI * j / da.n); da.s[j] = Math.Sin(2 * Math.PI * j / da.n); } for (int j = 0; j < da.m; j++) da.a[j] = 1.0 - (1.0 + j % da.m) / da.m; for (int j = da.m; j < da.n; j++) da.a[j] = 0.0; Resize(2*da.x0, 2 * da.y0); DeleteEvent += delegate { Application.Quit(); }; GLib.Timeout.Add(100, new GLib.TimeoutHandler(OnTimer)); // Кожні 100 мс виклик методу OnTimer. Add(da); // додавання області малювання } protected override bool OnDeleteEvent(Event e) { Application.Quit(); return true; } bool OnTimer() { da.k += 1; da.QueueDraw(); return true; } } class Example { static void Main() { Application.Init(); OwnWindow w = new OwnWindow(); w.ShowAll(); Application.Run(); } }