Есть код для C++ Builder, который строит окружности, а потом делит заполняет окружности треугольниками. Нужно добавить в код, чтобы для абсолютно каждого треугольника считались три длины его сторон и находилась большая из них. Потом находилась координата середины большей стороны, к которой бы из вершины, противолежащей большей стороне, проводилась точка к ее середине. Вот код: В 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;
TLabel *Label1;
TEdit *Edit2;
TLabel *Label2;
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 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> Layers;
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif В Unit1.cpp - //---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include // Для std::rand() и std::srand()
#include // Для std::time()
#include // Для использования cos и sin
#include // Для использования 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(std::time(0))); // Призыв генератора случайных чисел
LastCircleRadius = 0; // Изначально радиус не задан
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Получаем размеры PaintBox1
int width = PaintBox1->Width;
int height = PaintBox1->Height;


            // Генерируем случайные параметры для окружности
            LastCircleRadius = std::rand() % 200 + 50; // Радиус от 50 до 200
            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 = StrToInt(Edit2->Text); // Количество слоев
int number_points_per_layer = StrToInt(Edit1->Text); // Вершины касания границ


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(); // Вызываем функцию триангуляции
}
//---------------------------------------------------------------------------