2024年6月14日发(作者:)
制作印章来说,主要是如何让字均匀的显示在弧线段上,那么一般的印章要
么以圆或者椭圆为底图,不过这两者的算法大致相同,为了方便说明,如下就用
相对简单的圆来举例说明,如果需要做椭圆的话,可以在我的基础上进行扩展,
因为核心算法是一样的,相对于圆来说,椭圆求弧长以及各个字符的位置,这两
点相对麻烦些,但是这两者都可找到相应的数学公式。
这里首先提一点,我这篇文章部分借鉴了codeproject的一个例子,原文可以
参看如下地址。
vb/net/Text_on_Path_with_">/vb/net/
Text_on_Path_with_
(说实话,这篇文章写得有些乱,而且对于buffer的操作近乎于疯狂)
由于印章的实现相对于这篇文章来说,相对简单多了,而且规律性很强,因
此我自己考虑重新组织算法进行实现。
那么实现一个印章,大致步骤如下。
1.
计算字符串总长度,以及各个字符的长度;
2.
计算出字符串的起始角度;
3.
求出每个字符的所在的点,以及相对于中心的角度;
4.
绘制每个字符。
计算字符串总长度,以及各个字符的长度
这里需要用到“eString”和“eCharacterRang
es”这两个方法,由于前者算出来的总长度有问题,所以需要后面进行重新计算
(此外,这里我还考虑了字符最后显示方向)。
这部分的代码如下:
///
/// Compute string total length and every char length
///
///
///
///
///
///
private float ComputeStringLength( string sText, Graphics g, float[] fCharWidth,
float fIntervalWidth,
Char_Direction Direction )
{
// Init string format
StringFormat sf = new StringFormat();
ng = ;
Flags = |
| mit;
// Measure whole string length
SizeF size = eString( sText, _font, (int)_ );
RectangleF rect = new RectangleF( 0f,0f, , );
// Measure every character size
CharacterRange[] crs = new CharacterRange[];
for( int i = 0; i < ; i++ )
crs[i] = new CharacterRange( i, 1 );
// Reset string format
Flags = ;
surableCharacterRanges( crs );
ent = ;
发布评论