using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Circles
{
class Program
{
/// <summary>
/// Структура круга
/// </summary>
struct t_circle {
public int x, y, d;
public t_circle(int x, int y, int d)
{
this.x = x;
this.y = y;
this.d = d;
}
}
static List<t_circle> l_circles = new List<t_circle>();
/// <summary>
/// Рекурсивно добавляет структуры кругов в массив, пока n>0
/// </summary>
static void add_circle( int x, int y, int dia, int n)
{
if (n>0)
{
//Console.WriteLine($"{x}, {y}, {dia}, {n}");
t_circle t = new t_circle(x, y, dia);
l_circles.Add(t);
add_circle(x - dia / 2, y, dia / 2, n - 1);
add_circle(x + dia / 2, y, dia / 2, n - 1);
add_circle(x, y - dia / 2, dia / 2, n - 1);
add_circle(x, y + dia / 2, dia / 2, n - 1);
}
}
static void Main(string[] args)
{
Console.Write("Enter depth of circles [1..6] : ");
string val = Console.ReadLine();
try
{
int n = Convert.ToInt32(val);
if (n<1 || n>6)
{
Console.WriteLine("invalid input!");
} else
{
int dia = Convert.ToInt32(20 * Math.Pow(2, n));
int w = dia * 2;
add_circle(w/2, w/2, dia, n);
Bitmap bmp = new Bitmap(w, w);
using (Graphics graph = Graphics.FromImage(bmp))
{
Rectangle ImageSize = new Rectangle(0, 0, w, w);
graph.FillRectangle(Brushes.White, ImageSize);
Pen pen = new Pen(Color.Black, 1);
foreach (var t in l_circles)
graph.DrawEllipse(pen, t.x - t.d / 2, t.y - t.d / 2, t.d, t.d);
}
string filePath = AppDomain.CurrentDomain.BaseDirectory + $"out_{n}.bmp";
bmp.Save(filePath);
Console.WriteLine($"Image saved to \"{filePath}\"");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw;
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkRyYXdpbmc7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBDaXJjbGVzCnsKICAgIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vINCh0YLRgNGD0LrRgtGD0YDQsCDQutGA0YPQs9CwCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBzdHJ1Y3QgdF9jaXJjbGUgeyAKICAgICAgICAgICAgcHVibGljIGludCB4LCB5LCBkOwogICAgICAgICAgICBwdWJsaWMgdF9jaXJjbGUoaW50IHgsIGludCB5LCBpbnQgZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy54ID0geDsKICAgICAgICAgICAgICAgIHRoaXMueSA9IHk7CiAgICAgICAgICAgICAgICB0aGlzLmQgPSBkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBMaXN0PHRfY2lyY2xlPiBsX2NpcmNsZXMgPSBuZXcgTGlzdDx0X2NpcmNsZT4oKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyDQoNC10LrRg9GA0YHQuNCy0L3QviDQtNC+0LHQsNCy0LvRj9C10YIg0YHRgtGA0YPQutGC0YPRgNGLINC60YDRg9Cz0L7QsiDQsiDQvNCw0YHRgdC40LIsINC/0L7QutCwIG4+MAogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgc3RhdGljIHZvaWQgYWRkX2NpcmNsZSggaW50IHgsIGludCB5LCBpbnQgZGlhLCBpbnQgbikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChuPjApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoJCJ7eH0sIHt5fSwge2RpYX0sIHtufSIpOwogICAgICAgICAgICAgICAgdF9jaXJjbGUgdCA9IG5ldyB0X2NpcmNsZSh4LCB5LCBkaWEpOwogICAgICAgICAgICAgICAgbF9jaXJjbGVzLkFkZCh0KTsKCiAgICAgICAgICAgICAgICBhZGRfY2lyY2xlKHggLSBkaWEgLyAyLCB5LCBkaWEgLyAyLCBuIC0gMSk7CiAgICAgICAgICAgICAgICBhZGRfY2lyY2xlKHggKyBkaWEgLyAyLCB5LCBkaWEgLyAyLCBuIC0gMSk7CiAgICAgICAgICAgICAgICBhZGRfY2lyY2xlKHgsIHkgLSBkaWEgLyAyLCBkaWEgLyAyLCBuIC0gMSk7CiAgICAgICAgICAgICAgICBhZGRfY2lyY2xlKHgsIHkgKyBkaWEgLyAyLCBkaWEgLyAyLCBuIC0gMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIkVudGVyIGRlcHRoIG9mIGNpcmNsZXMgWzEuLjZdIDogIik7CiAgICAgICAgICAgIHN0cmluZyB2YWwgPSBDb25zb2xlLlJlYWRMaW5lKCk7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgbiA9IENvbnZlcnQuVG9JbnQzMih2YWwpOwoKICAgICAgICAgICAgICAgIGlmIChuPDEgfHwgbj42KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJpbnZhbGlkIGlucHV0ISIpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW50IGRpYSA9IENvbnZlcnQuVG9JbnQzMigyMCAqIE1hdGguUG93KDIsIG4pKTsKICAgICAgICAgICAgICAgICAgICBpbnQgdyA9IGRpYSAqIDI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgYWRkX2NpcmNsZSh3LzIsIHcvMiwgZGlhLCBuKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm1wID0gbmV3IEJpdG1hcCh3LCB3KTsKICAgICAgICAgICAgICAgICAgICB1c2luZyAoR3JhcGhpY3MgZ3JhcGggPSBHcmFwaGljcy5Gcm9tSW1hZ2UoYm1wKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBJbWFnZVNpemUgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIHcsIHcpOwogICAgICAgICAgICAgICAgICAgICAgICBncmFwaC5GaWxsUmVjdGFuZ2xlKEJydXNoZXMuV2hpdGUsIEltYWdlU2l6ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBQZW4gcGVuID0gbmV3IFBlbihDb2xvci5CbGFjaywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIGxfY2lyY2xlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLkRyYXdFbGxpcHNlKHBlbiwgdC54IC0gdC5kIC8gMiwgdC55IC0gdC5kIC8gMiwgdC5kLCB0LmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmlsZVBhdGggPSBBcHBEb21haW4uQ3VycmVudERvbWFpbi5CYXNlRGlyZWN0b3J5ICsgJCJvdXRfe259LmJtcCI7CiAgICAgICAgICAgICAgICAgICAgYm1wLlNhdmUoZmlsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiSW1hZ2Ugc2F2ZWQgdG8gXCJ7ZmlsZVBhdGh9XCIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUuTWVzc2FnZSk7CiAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICB9Cn0K