Delphi 将文本保持在一个圆圈内

Delphi 将文本保持在一个圆圈内,delphi,delphi-7,Delphi,Delphi 7,我在使用delphi,我有一个文本,我想把它放进一个小圆圈;我想减少文本的字体,使其保持在圆形内,我知道如何将其保持为矩形,但我;我对数学函数有点困惑,它能让我把它保持在圆圈内 这是我在网上冲浪时得到的矩形的代码 double fontSize = 20.0; bool bFontFits = false; while (bFontFits == false) { m_pCanvas->Font->Size = (int)fontSize; TSize te = m

我在使用delphi,我有一个文本,我想把它放进一个小圆圈;我想减少文本的字体,使其保持在圆形内,我知道如何将其保持为矩形,但我;我对数学函数有点困惑,它能让我把它保持在圆圈内 这是我在网上冲浪时得到的矩形的代码

double fontSize = 20.0;
bool bFontFits = false;

while (bFontFits == false)
{
    m_pCanvas->Font->Size = (int)fontSize;
    TSize te = m_pCanvas->TextExtent(m_name.c_str());
    if (te.cx < (width*0.90))  // Allow a little room on each side
    {
        // Calculate the position
        m_labelOrigin.x = rectX + (width/2.0) - (te.cx/2);
        m_labelOrigin.y = rectY + (height/2.0) - te.cy/2);
        m_fontSize = fontSize;
        bFontFits = true;
        break;
    }
    fontSize -= 1.0;
double fontSize=20.0;
bool bFontFits=false;
while(bFontFits==false)
{
m_pCanvas->Font->Size=(int)fontSize;
TSize te=m_pCanvas->TextExtent(m_name.c_str());
如果(te.cx<(宽度*0.90))//每侧留出一点空间
{
//计算位置
m_labelOrigin.x=rectX+(宽度/2.0)-(te.cx/2);
m_labelOrigin.y=rectY+(高度/2.0)-te.cy/2);
m_fontSize=fontSize;
bFontFits=true;
打破
}
fontSize-=1.0;

}

我会将代码改编为如下矩形:

procedure CalcFontSizeRectangle(aCanvas : TCanvas; const aText : string; const aRect : TRect);
var
  te : TSize;
begin
  aCanvas.Font.Size := 20;

  while aCanvas.Font.Size > 0 do begin
    te := aCanvas.TextExtent(aText);
    if (te.cx < ((aRect.Right-aRect.Left)*0.90)) and (te.cy < ((aRect.Bottom-aRect.Top)*0.90)) then begin
      break;
    end;

    aCanvas.Font.Size := aCanvas.Font.Size - 1;
  end;
end;
procedure CalcFontSizeCircle(aCanvas : TCanvas; const aText : string; const aDiameter : integer);
var
  te : TSize;
  d  : double;
begin
  aCanvas.Font.Size := 20;

  while aCanvas.Font.Size > 0 do begin
    te := aCanvas.TextExtent(aText);
    d := sqrt(te.cx * te.cx + te.cy * te.cy);
    if d < (aDiameter*0.90) then begin
      break;
    end;

    aCanvas.Font.Size := aCanvas.Font.Size - 1;
  end;
end;
procedure-CalcFontSizeRectangle(aCanvas:TCanvas;const-aText:string;const-aRect:TRect);
变量
te:TSize;
开始
aCanvas.Font.Size:=20;
当aCanvas.Font.Size>0开始时
te:=aCanvas.TextExtent(aText);
如果(te.cx<((右右右右右右)*0.90))和(te.cy<((下右右右右右右右右右右右右右右右右右右右右)*0.90)),则开始
打破
结束;
aCanvas.Font.Size:=aCanvas.Font.Size-1;
结束;
结束;
对其进行一点修改,使其适用于如下圆圈:

procedure CalcFontSizeRectangle(aCanvas : TCanvas; const aText : string; const aRect : TRect);
var
  te : TSize;
begin
  aCanvas.Font.Size := 20;

  while aCanvas.Font.Size > 0 do begin
    te := aCanvas.TextExtent(aText);
    if (te.cx < ((aRect.Right-aRect.Left)*0.90)) and (te.cy < ((aRect.Bottom-aRect.Top)*0.90)) then begin
      break;
    end;

    aCanvas.Font.Size := aCanvas.Font.Size - 1;
  end;
end;
procedure CalcFontSizeCircle(aCanvas : TCanvas; const aText : string; const aDiameter : integer);
var
  te : TSize;
  d  : double;
begin
  aCanvas.Font.Size := 20;

  while aCanvas.Font.Size > 0 do begin
    te := aCanvas.TextExtent(aText);
    d := sqrt(te.cx * te.cx + te.cy * te.cy);
    if d < (aDiameter*0.90) then begin
      break;
    end;

    aCanvas.Font.Size := aCanvas.Font.Size - 1;
  end;
end;
过程CalcFontSizeCircle(aCanvas:TCanvas;const-aText:string;const-diameter:integer);
变量
te:TSize;
d:双倍;
开始
aCanvas.Font.Size:=20;
当aCanvas.Font.Size>0开始时
te:=aCanvas.TextExtent(aText);
d:=sqrt(te.cx*te.cx+te.cy*te.cy);
如果d<(直径*0.90),则开始
打破
结束;
aCanvas.Font.Size:=aCanvas.Font.Size-1;
结束;
结束;

结果字体大小在画布中。

检查矩形的所有4个角是否都在圆圈内检查距中心的距离是否小于半径:(x-x0)^2+(y-y0)^2Math.hypot函数!