Вот есть код для C++ Builder 12, который создает и рисует окружности и так же проводит их триангуляцию. Сделай так, чтобы все создаваемые треугольники всегда были равнобедренными: Unit1.h -  //---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Graphics.hpp>
#include <ExtCtrls.hpp>
#include <System.SysUtils.hpp>
#include <System.Classes.hpp>
#include <Vcl.Graphics.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
	TButton *Button1;
	TPaintBox *PaintBox1;
	TButton *Button2;
	TButton *Button3; // Кнопка для заполнения окружности
	TEdit *Edit1;
	void __fastcall Button1Click(TObject *Sender);
	void __fastcall Button2Click(TObject *Sender);
	void __fastcall Button3Click(TObject *Sender); // Изменен обработчик для заполнения

private:

	TPoint LastCircleCenter; // Центральная точка последней окружности
	int LastCircleRadius; // Радиус последней окружности

	void DrawTriangulation();

public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};


struct TPoint_2D
{
	double x, y;
	int number;
};

struct TPoint2D
{
	TPoint_2D Vertex;
};
std::vector<TPoint2D> Points;
class CalculationNormal
{
	public:
	double dx, dy, length, direction;
	void Calculation (double x1, double x2, double y1, double y2, double &normal_x, double &normal_y);
};
std::vector<std::vector<TPoint2D>> Layers;
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif     Unit1.cpp - //---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include <cstdlib> // Для std::rand() и std::srand()
#include <ctime>   // Для std::time()
#include <cmath>   // Для использования cos и sin
#include <vector>  // Для использования std::vector
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

void CalculationNormal::Calculation(double x1, double x2, double y1, double y2, double &normal_x, double &normal_y)
{
	dx = x2 - x1;
	dy = y2 - y1;
	length = sqrt(dx * dx + dy * dy);
	normal_x = -dy / length;
	normal_y = dx / length;
	direction = (x1 + x2) / 2 * normal_x + (y1 + y2) / 2 * normal_y;
	if (direction < 0)
	{
		normal_x = -normal_x;
		normal_y = -normal_y;
	}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
		: TForm(Owner)
{
		std::srand(static_cast<unsigned int>(std::time(0))); // Призыв генератора случайных чисел
		LastCircleRadius = 0; // Изначально радиус не задан
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
		// Получаем размеры PaintBox1
		int width = PaintBox1->Width;
		int height = PaintBox1->Height;

		// Генерируем случайные параметры для окружности
		LastCircleRadius = std::rand() % 100 + 50; // Радиус от 50 до 150
		int x = std::rand() % (width - LastCircleRadius * 2) + LastCircleRadius; // Позиция X
		int y = std::rand() % (height - LastCircleRadius * 2) + LastCircleRadius; // Позиция Y

		// Рисование окружности
		TCanvas *canvas = PaintBox1->Canvas;
		canvas->Brush->Color = clBlue; // Цвет заливки
		canvas->Ellipse(x - LastCircleRadius, y - LastCircleRadius, x + LastCircleRadius, y + LastCircleRadius); // Рисуем окружность

		// Сохраняем координаты окружности для дальнейшего использования
		LastCircleCenter = TPoint(x, y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
		PaintBox1->Invalidate(); // Это заставит PaintBox перерисоваться
		PaintBox1->Update();     // Обновление PaintBox немедленно
}
//---------------------------------------------------------------------------
void TForm1::DrawTriangulation()
{
    // Настройки для триангуляции
    int number_layers = 5; // Количество слоев
    int number_points_per_layer = 10; // Количество точек на каждом слое

    Points.clear();
    Layers.clear();

    // Создание слоев
    for (int i = 0; i < number_layers; i++)
    {
        double radius_layer = LastCircleRadius * (i + 1) / number_layers; // Радиус для текущего слоя
        std::vector<TPoint2D> Points_layer;

        // Вычисление точек на слое
        for (int j = 0; j < number_points_per_layer; j++)
        {
            double angle = 2 * M_PI * j / number_points_per_layer;
            TPoint2D Point;
            Point.Vertex.x = radius_layer * cos(angle);
            Point.Vertex.y = radius_layer * sin(angle);
            Points_layer.push_back(Point);
        }

        Layers.push_back(Points_layer);
    }

    // Рисование треугольников
    TCanvas *canvas = PaintBox1->Canvas;
    canvas->Pen->Color = clBlack;
    canvas->Pen->Width = 2;

    // Перебор слоев
    for (int i = 0; i < number_layers - 1; i++) // от первого слоя до предпоследнего
    {
        auto& PrevLayer = Layers[i];
        auto& CurrLayer = Layers[i + 1];
        int prev_points = PrevLayer.size();
        int curr_points = CurrLayer.size();

        for (int j = 0; j < curr_points; j++)
        {
            // Определение текущей и следующей точек текущего слоя
            int next_j = (j + 1) % curr_points;

            // Рисуем треугольник с одной вершиной в центре и двумя вершинами из текущего слоя
            canvas->MoveTo(LastCircleCenter.x, LastCircleCenter.y); // Центр окружности
            canvas->LineTo(LastCircleCenter.x + CurrLayer[j].Vertex.x, LastCircleCenter.y + CurrLayer[j].Vertex.y); // Текущая точка
            canvas->LineTo(LastCircleCenter.x + CurrLayer[next_j].Vertex.x, LastCircleCenter.y + CurrLayer[next_j].Vertex.y); // Следующая точка
            canvas->LineTo(LastCircleCenter.x, LastCircleCenter.y); // Замыкание к центру

            // Рисуем другой треугольник с одной вершиной в текущем слое, соединяя с предыдущим слоем
            canvas->MoveTo(LastCircleCenter.x + PrevLayer[j].Vertex.x, LastCircleCenter.y + PrevLayer[j].Vertex.y); // Текущая точка с предыдущего слоя
            canvas->LineTo(LastCircleCenter.x + CurrLayer[j].Vertex.x, LastCircleCenter.y + CurrLayer[j].Vertex.y); // Текущая точка
            canvas->LineTo(LastCircleCenter.x + CurrLayer[next_j].Vertex.x, LastCircleCenter.y + CurrLayer[next_j].Vertex.y); // Следующая точка
            canvas->LineTo(LastCircleCenter.x + PrevLayer[j].Vertex.x, LastCircleCenter.y + PrevLayer[j].Vertex.y); // Замыкание с предыдущим слоем
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    // Проверяем, была ли нарисована окружность
    if (LastCircleRadius <= 0)
    {
        ShowMessage("Сначала нарисуйте окружность!");
        return;
    }

    DrawTriangulation(); // Вызываем функцию триангуляции
}
//---------------------------------------------------------------------------