沿圆绘制时,查找角度矩形将占用(参见图纸)

时间:2012-09-01 21:48:05

标签: c++ algorithm geometry

这是我正在尝试做的事情。我有一个字体,基本上是每个字形的位图矩形。我试图得到像这样的弧形文字效果:

enter image description here

我的计划是,给定一个中心和一个半径,我将解决每个字形的位置和角度。

我有一个可以找到位置的功能:

Vec2 Math::positionFromCenterToLineAt( Vec2 center, float dist,
        float totalAngular, float angularDistance, float angularOffset )
    {
        float startAngle = -((totalAngular) / 2.0f);
        float curAngle = startAngle + angularDistance;
        curAngle -= angularOffset;
        curAngle += angularDistance / 2.0f;
        curAngle += CGE_PI;

        Vec2 retVec = center;
        Vec2 angVec = Vec2(sin(curAngle),cos(curAngle));
        angVec *= dist;
        retVec += angVec;

        return retVec;
    }

它需要我知道圆弧中将占用多少圆,并且需要从起始角​​开始应该绘制当前字形的度数。

我无法弄清楚的是在给定字形的半径,中心,宽度和高度的情况下找到给定字形占据的角度的函数。每个字形可以有不同的维度。

看到这个: enter image description here

正如你所看到的,我正在寻找圆弧的那个部分。

我怎么能算出来?

由于

1 个答案:

答案 0 :(得分:2)

2*pi*radius equals the circumference
You know radius as a pixel base(lets say it is 40 pixels)
You can find circumference(lets say it is 251 pixels)
Then, if you get width of a char(lets say it is 8)
You know the angle of arc: angle=2*pi*(8/251)=2*pi*0.03=0.2 radians
0.2 radians * 57.3 = 11.5 degrees

如何根据当前字体查找字符的宽度?

LOGFONT lf;
int width=lf.lfWidth; //beware! this is average

您想要精确的选项吗?

GetTextExtentPoint32() // search usage of this!

Its structure type is:

 BOOL GetTextExtentPoint32(
  __in   HDC hdc,
  __in   LPCTSTR lpString,
  __in   int c,
  __out  LPSIZE lpSize
);