帮酷LOGO
0 0 评论
文章标签:样式  generating  style  AES  

介绍

这种技术是产生审美线类型的一种创新方法。 它主要用于 cad/gis和联合应用程序,其中需要定制的线路类型。 它完全使用MFC编写,使用起来非常简单。

背景

我正在研究创建自定义行类型。 我生成此类线路类型的努力包括:

  • 矢量图形在给定直线上的放置。 它涉及复杂的数学使用矩阵。 但它效率低下,不能适用于填充的几何实体。
  • 使用分形几何,这也证明了不明智,因为需要创建一个新的公式,我感兴趣的每一行 Pattern。
  • 在使用生成复杂线条样式 ( codeguru ) 时,我遇到了一篇文章,它涉及使用回调过程绘制复杂线条类型。 这里技术是一个 WIN32 解决方案,目前不直接被MFC支持。 虽然它是一个优秀的解决方案,但它不是万无一失的,我正在得到不希望的输出。 例如当我选择字符"x"作为行 Pattern的输入时,输出如下所示: ( 图 1 & 2 )。
图 1.所需输出图 2. Wrong 输出

这使我能够为MFC中的解决方案提供更简单。优雅和不对平均程序员的智能感到困惑。 我已经使用 Truetype (. ttf ) 字体生成线型。 字体中的每个标志符号(。Microsoft ) 都可以用作行的Pattern。

这种技术

图 3: Windows 中的字符映射

使用microsoft应用程序( 启动> 所有程序> 附件> 系统工具> 字符映射 )的字符,并从所需字体中选择字符或者符号( 它表示你的行类型的Pattern )。 每个符号都有唯一的十六进制数。 我们在逻辑中使用这个十六进制数。 上面图像中突出显示的符号有一个十六进制数字 0 x5C。

图 3

我打算通过在文章 XCharMap 中使用代码来扩展这个应用程序。A dialog这个站点的显示一个字符映射

使用字体创建工具,如 CorelDraw,字体创建者或者 Fontlab.Copy,你可以将自己的图案设计为Truetype字体,你已经创建了 Windows 目录的字体文件夹。

了解代码

我采用了从 Jeff'基于mfc的Prosise Windows 编程'的Chapter3那里绘制的摩托马线的代码,我没有在这里解释。 核心逻辑在 OnLButtonUp 视图类中。

若要沿绘制的线排列所需的Pattern,首先计算线条 w.r.t 水平线所包含的线条和角度的坡度。

//calculate the slope of this lineif(point.x-m_ptFrom.x==0)return;float slope= -(point.y
-m_ptFrom.y)/(point.x-m_ptFrom.x);//Negative sign is used as the slope from math.h isin clockwise direction, while the //LOGFONT expects angle in counter-clockwisedirection.//find the inclination w.r.thorizontal float ang=atan2(m_ptFrom.y-point.y,point.x-m_ptFrom.x)*180.0f/3.1415927f;

指定LOGFONT变量的方向和对齐属性的角度。 选择感兴趣的字体,并将字符/符号的十六进制值指定给CString变量。

LOGFONT lf;
lf.lfCharSet=SYMBOL_CHARSET;//For Symbol Fonts like"Wingdings"lf.lfHeight=20;
lf.lfEscapement=(long)ang*10;//Angle of the textlf.lfOrientation=(long)ang*10;//Angle of the textlf.lfItalic=false;
lf.lfStrikeOut=false;
lf.lfUnderline=false;
lf.lfQuality=ANTIALIASED_QUALITY;
lf.lfWeight=FW_BOLD;
strcpy(lf.lfFaceName,_T("Wingdings"));//Select the desired font--
--
--
--
--
--
CString str;
 str=0x5c;//Hexadecimal value of the desired//character/symbol from Character Map

查找线段的长度,并重复将字符/符号的十六进制值添加到vmkernel变量,直到字符串宽度小于。 绘制文本,我们得到令人惊奇的线条图案。

//Calculate Length of line segement in pixelsfloat dist= sqrt( (point.y - m_ptFrom.y )*(point.y-m_ptFrom.y)+
 (point.x-m_ptFrom.x)*(point.x-m_ptFrom.x) ) ;//Add Symbol to the text until the width of string is less than length of linewhile(textwidth <dist )
{
 str+=0x5c;
 textwidth=dc.GetTextExtent(str).cx;
}

运行应用程序

编译并在VS6中编译。 单击并拖动以绘制 Rubberband。

注意,如果从源点到目标绘制文本,则从目标到源绘制文本在线上绘制文本。 我们只需颠倒绘图顺序就可以得到倒符号。

图 6

图 4: 生成的线条图案

进一步改进

  • 从该应用程序中调用的字符映射对话框中选择所需符号。 ( 让我联系 Hans Dietrich的 )。
  • 扩展绘图逻辑,使用户能够绘制多段线和多边形。
  • 提供用于选择字体大小。颜色。对齐方式等的对话框。

引用

确认

Pravin Ramdas Raijade



文章标签:style  generating  样式  AES  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语