2012-09-01 76 views
2

以下是我正在嘗試的操作。我有一個字體,基本上是每個字形的位圖矩形。我試圖讓這樣的弧形文字效果:沿着圓形繪製時,將會佔據角度矩形(參見圖)

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

正如你所看到的,我在弧度尋找,圓的那個部門。

我怎麼計算它?

由於

+0

你想計算'每個字符'的角度? –

+0

我想計算每個字符將以弧度佔據多少圈。 – jmasterx

回答

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 
); 
+0

謝謝你這個偉大的作品:) – jmasterx

+0

沒問題:)美好的一天 –

+0

我使用FreeType的TTF字體,這給我準確的寬度。不過謝謝。 – jmasterx

0

弧度的角度由兩個半徑之間的圓,由圓的半徑分割的圓弧的長度給出。弧度爲,定義爲爲長度爲圓的半徑的弧所對的角度,這就是爲什麼圓中有2 * pi弧度的原因。你只需要爲了你的目的轉換這個定義。