#include <iostream>
#include <Windows.h>
#include <cmath>
#include <clocale>
using namespace std;
class Figure
{
protected:
HWND hWnd;
HDC hDC;
COLORREF Color;
int CenterX;
int CenterY;
public:
Figure(HWND window, int x, int y)
{
hWnd = window;
hDC = GetDC(hWnd);
Color = RGB(255, 0, 0);
CenterX = x;
CenterY = y;
}
virtual ~Figure()
{
if (hDC != nullptr)
ReleaseDC(hWnd, hDC);
}
virtual void Show() = 0;
};
class TouchingCircles : public Figure
{
private:
int Radius;
public:
TouchingCircles(HWND window, int x, int y, int r)
: Figure(window, x, y)
{
Radius = r;
}
void Show() override
{
if (hDC == nullptr)
return;
HPEN hPen = CreatePen(PS_SOLID, 2, Color);
HGDIOBJ oldPen = SelectObject(hDC, hPen);
HGDIOBJ oldBrush = SelectObject(
hDC, GetStockObject(NULL_BRUSH)
);
// Первая окружность
Ellipse(
hDC,
CenterX - Radius,
CenterY - Radius,
CenterX + Radius,
CenterY + Radius
);
// Вторая окружность
Ellipse(
hDC,
CenterX + Radius,
CenterY - Radius,
CenterX + 3 * Radius,
CenterY + Radius
);
SelectObject(hDC, oldBrush);
SelectObject(hDC, oldPen);
DeleteObject(hPen);
}
};
int main()
{
setlocale(LC_ALL, "");
int x, y, radius;
cout << "Соприкасающиеся окружности\n";
cout << "Введите X центра первой окружности: ";
cin >> x;
cout << "Введите Y центра окружностей: ";
cin >> y;
cout << "Введите радиус: ";
cin >> radius;
if (!cin || radius <= 0)
{
cout << "Ошибка: радиус должен быть положительным.\n";
return 1;
}
// Получаем окно консоли
HWND hWnd = GetConsoleWindow();
if (hWnd == nullptr)
{
cout << "Не удалось получить окно консоли.\n";
return 1;
}
// Создаём объект фигуры
Figure* figure = new TouchingCircles(
hWnd, x, y, radius
);
// Рисуем окружности
figure->Show();
cout << "\nОкружности нарисованы.\n";
cout << "Нажмите Enter для завершения...";
cin.ignore(10000, '\n');
cin.get();
delete figure;
return 0;
}