using System; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using Cairo; using Gtk; public class Example { static void Main () { Application.Init (); Gtk.Window w = new Gtk.Window ("Плитки Труше"); w.Resize (480, 480); DrawingArea a = new CairoGraphic (); Box box = new HBox (true, 0); box.Add (a); w.Add (box); w.DeleteEvent += close_window; w.ShowAll (); Application.Run (); } static void close_window (object obj, DeleteEventArgs args) { Application.Quit (); } } public class CairoGraphic : DrawingArea { protected override bool OnExposeEvent (Gdk.EventExpose args) { using (Context g = Gdk.CairoHelper.Create (args.Window)) { int nx = 6, // кількість плиток по горизонталі ny = 6, // кількість плиток по вертикалі a = 80, // сторона плитки r = 20; // радіус заокруглення int[] x = new int[8], // координати кінців відрізків 1 y = new int[8]; // з такою нумерацією точок: 5 // 0 4 6 2 // 7 if (r*4>a) r=a/4; // 3 var rand = new Random(); // створення породжувача випадкових чисел for (int j = 0; j < nx; j++) for (int k = 0; k < ny; k++) { // координати кінців відрізків і дуг x[0] = j*a; y[0] = k*a+a/2; x[4] = j*a+a/2-r; y[4] = k*a+a/2; x[2] = (j+1)*a; y[2] = k*a+a/2; x[6] = j*a+a/2+r; y[6] = k*a+a/2; y[1] = k*a; x[1] = j*a+a/2; y[5] = k*a+a/2-r; x[5] = j*a+a/2; y[3] = (k+1)*a; x[3] = j*a+a/2; y[7] = k*a+a/2+r; x[7] = j*a+a/2; if (rand.Next(2)==0) { g.MoveTo (x[0], y[0]); g.LineTo (x[4], y[4]); g.Arc (x[4], y[7], r,-Math.PI/2, 0); g.LineTo (x[3], y[3]); g.MoveTo (x[1], y[1]); g.LineTo (x[5], y[5]); g.ArcNegative (x[6], y[5], r, Math.PI, Math.PI/2); g.LineTo (x[2], y[2]); } else { g.MoveTo (x[0], y[0]); g.LineTo (x[4], y[4]); g.ArcNegative (x[4], y[5], r, Math.PI/2, 0); g.LineTo (x[1], y[1]); g.MoveTo (x[3], y[3]); g.LineTo (x[7], y[7]); g.Arc (x[6], y[7], r, -Math.PI, -Math.PI/2); g.LineTo (x[2], y[2]); } } g.SetSourceColor(new Color (0, 1, 0, 1)); g.LineWidth = 8; g.Stroke(); } return true; } }