Набросал пример отрисовки текста по дуге:
procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
const
S: String = 'Пример отрисовки текста по заданной траектории (дуга)';
var
i: Integer;
A, Ao, R, TextLen: Single;
Rect: TRectF;
M1, M2: TMatrix; // uses System.Math.Vectors
begin
// if Canvas.BeginScene then
begin
Randomize;
R := 400;
Ao := DegToRad(150); // uses System.Math
A := (Pi - Ao) / 2;
Canvas.Font.Size := 32;
Canvas.Stroke.Kind := TBrushKind.Solid;
Canvas.StrokeThickness := 3;
Canvas.Fill.Color := TAlphaColors.Palegreen xor $80000000;
Canvas.FillEllipse(TRectF.Create(0, 0, 2 * R, 2 * R), 1);
TextLen := Canvas.TextWidth(S);
if TextLen > R * Ao then
Caption := 'АХТУНГ!'; // длина текста больше выделенной под него дуги (будет наложение букв)
for i := 1 to S.Length do
begin
Rect.Left := 0;
Rect.Top := R;
Rect.Width := Canvas.TextWidth(S[i]);
Rect.Height := Canvas.TextHeight(S[i]);
A := A + Ao / (S.Length - 1);
M1 := TMatrix.CreateTranslation(- Rect.CenterPoint.X, - Rect.CenterPoint.Y) *
TMatrix.CreateRotation(A - A - Pi / 2) *
TMatrix.CreateTranslation(Rect.CenterPoint.X, Rect.CenterPoint.Y);
M2 := TMatrix.CreateTranslation(-R, -R) *
TMatrix.CreateRotation(A) *
TMatrix.CreateTranslation(R, R);
Canvas.SetMatrix(M1 * M2);
Canvas.Fill.Color := TAlphaColor(Random(MaxInt) or $FF000000);
Canvas.FillText(Rect, S[i], False, 1, [{TFillTextFlag.RightToLeft}], TTextAlign.Leading, TTextAlign.Center);
end;
// Canvas.EndScene;
end;
end;