using System; using Cairo; using Gdk; using Gtk; class Area : DrawingArea { private static int n = 3; // кількість кругів споwчатку public int xmax = 500, // розміри поля по горизонталі ymax = 250; // розміри поля по вертикалі double[] r = new double[n]; // радіуси рухомих кругів double[] x = new double[n]; // поточні абсциси центрів кругів double[] y = new double[n]; // поточні ординати центрів кругів double[] vx = new double[n]; // проєкції швидкостей вісь абсцис double[] vy = new double[n]; // проєкції швидкостей вісь ординат public Area () { Random rand = new Random(); for (int j=0; j xmax) { vx[j] = -vx[j]; x[j]=2*(xmax - r[j]) - x[j];} if (y[j] + r[j] > ymax) { vy[j] = -vy[j]; y[j]=2*(ymax - r[j]) - y[j];} if (x[j] < r[j]) { vx[j] = -vx[j]; x[j] = 2*r[j] - x[j];} if (y[j] < r[j]) { vy[j] = -vy[j]; y[j] = 2*r[j] - y[j];} } } } class OwnWindow : Gtk.Window { public Area a; public OwnWindow() : base("Взаємодія об'єктів") { a = new Area(); Resize(a.xmax, a.ymax); DeleteEvent += delegate { Application.Quit(); }; GLib.Timeout.Add(20, new GLib.TimeoutHandler(OnTimer)); // Кожні 20 мс виклик методу OnTimer. Add(a); ShowAll(); } protected override bool OnDeleteEvent(Event e) { Application.Quit(); return true; } bool OnTimer() { a.Move(); a.QueueDraw(); return true; } } class Example { static void Main() { Application.Init(); OwnWindow w = new OwnWindow(); Application.Run(); } }