这里要介绍的是通过InkAnalyzer来实现简单图形的识别,例如圆,椭圆,正方形,三角形等,当然你也可以通过扩展来实现自定义图形的识别,在使用InkAnalyzer前,你需要引用IAWinFX.dll才能保证InkAnalyzer正常的工作.

ps:通过InkAnalyzer实现简单的图形的识别,并不是什么很高深的技术,除了InkANalyzer你也可以通过现有的一些算法来实现笔迹到图形的识别转换,只是我们工作在window平台下,使用的是Net技术,所以没有重复造轮子的必要了,这篇文章其实是Drawtool工具的中一个小功能就是图形识别笔了。对于drawtool来说除了需要具备画笔,荧光笔,flash笔,排笔,纹理笔等外还需要一个图形识别笔的支持.

代码相对简单,相关类的使用可以参考msdn,这是你最好的伙伴了.

对于自定义的图形的识别,你可以在_internalAnalyzer函数中,当drawingNode.GetShapeName返回的名称为other时候,然后根据笔迹进行分析,其实就是点分析算法的应用了

    /// <summary>
/// 图形识别类
/// </summary>
public class ShapeRecogniser
{
public InkAnalyzer _inkAnalyzer = null; private ShapeRecogniser()
{
this._inkAnalyzer = new InkAnalyzer
{
AnalysisModes = AnalysisModes.AutomaticReconciliationEnabled
};
} /// <summary>
/// 根据笔迹集合返回图形名称字符串
/// </summary>
/// <param name="strokeCollection"></param>
/// <returns></returns>
public string Recognition(StrokeCollection strokeCollection)
{
if (strokeCollection == null)
{
MessageBox.Show("dddddd");
return null;
} string result = null;
try
{
this._inkAnalyzer.AddStrokes(strokeCollection);
if (this._inkAnalyzer.Analyze().Successful)
{
result = _internalAnalyzer(this._inkAnalyzer);
this._inkAnalyzer.RemoveStrokes(strokeCollection);
}
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
} return result;
} /// <summary>
/// 实现笔迹的分析,返回图形对应的字符串
/// 你在实际的应用中根据返回的字符串来生成对应的Shape
/// </summary>
/// <param name="ink"></param>
/// <returns></returns>
private string _internalAnalyzer(InkAnalyzer ink)
{
try
{
ContextNodeCollection nodecollections = ink.FindNodesOfType(ContextNodeType.InkDrawing);
foreach (ContextNode node in nodecollections)
{
InkDrawingNode drawingNode = node as InkDrawingNode;
if (drawingNode != null)
{
return drawingNode.GetShapeName();
}
}
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
} return null;
} private static ShapeRecogniser instance = null;
public static ShapeRecogniser Instance
{
get
{
return instance == null ? (instance = new ShapeRecogniser()) : instance;
}
}
}

应用其实很简单的,你可以在你任何程序上添加一个InkCanvas,然后在鼠标up或者其你觉得适合地方通过调用ShapeRecogniser的Recognition方法,然后根据返回的图形的名称生成对应的shape

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

DrawTool多重笔之前奏 => 通过InkAnalyzer实现图形识别的更多相关文章

  1. Java企业实训 - 01 - Java前奏

    前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...

  2. ASP.Net请求处理机制初步探索之旅 - Part 1 前奏

    开篇:ASP.Net是一项动态网页开发技术,在历史发展的长河中WebForm曾一时成为了ASP.Net的代名词,而ASP.Net MVC的出现让这项技术更加唤发朝气.但是,不管是ASP.Net Web ...

  3. Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)

    一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk  主要采用的是静态方式,步骤也很简单,首先使用 ...

  4. JavaScript设计模式——前奏(封装和信息隐藏)

    前面一篇讲了js设计模式的前奏,包括接口的讲解.. 三:封装和信息隐藏: 信息隐藏用来进行解耦,定义一些私有的数据和方法. 封装是用来实现信息隐藏的技术,通过闭包实现私有数据的定义和使用. 接口在这其 ...

  5. Objective-C专题,是学习iOS开发的前奏(转)

    第一个OC的类 来源:http://www.cnblogs.com/mjios/archive/2013/04/06/3002814.html 本文目录 一.语法简介 二.用Xcode创建第一个OC的 ...

  6. DrawTool画笔之图形笔

    相关知识参考DrawTool画笔之纹理笔  , 图形笔的实现跟纹理笔的实现是一样的,重载Stroke的DrawCore方法,效果图: --------------------------------- ...

  7. 企业DC Windows运维监控规范及C辅助监控开发实战前奏;

    春天来了,小草发芽了,花儿开了,你还在等什么? 人家都自驾游了,ruiy可还是徒步游的,并且还留着汗+油; 什么是生活,我的理解就是跟着gd生,跟着gd活,可是讲到这我又自恋了,人家开二会也没想起我来 ...

  8. ASP.Net请求处理机制初步探索之旅 - Part 1 前奏(转)

        在读本文之前建议先阅读IIS架构:http://www.cnblogs.com/tiantianle/p/5079932.html     不管是ASP.Net WebForm还是ASP.Ne ...

  9. 设计模式之前奏(UML类图)

    原文:设计模式之前奏(UML类图) 本人菜菜一个,最近一直在博客园游走闲逛,看到了各种技术,各种各种…….便看到了大话设计模式这本书,下了电子版的看了看第一章,感觉相当不错,不仅通俗易懂,而且与实际案 ...

随机推荐

  1. iptable怎么用?

    iptables -A FORWARD -s 10.0.0.0/8  -p tcp  --dport  80  -j DROP [拒绝转发来自10.0.0.0/8网段,目的端口是80的数据包]

  2. jenkins系列1--自动打tag

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  3. "HTTP 错误 500.19 请求的页面的相关配置数据无效" 解决办法

    HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效. 问题"详细错误信息模块 IIS Web Core通知 Begin ...

  4. Android开发-API指南-创建 Content Provider

    Creating a Content Provider 英文原文:http://developer.android.com/guide/topics/providers/content-provide ...

  5. Orchard官方文档翻译(二) 安装 Orchard

    原文地址:http://docs.orchardproject.net/Documentation/Installing-Orchard 想要查看文档目录请用力点击这里 最近想要学习了解orchard ...

  6. JS 在open打开的子窗口页面中调用父窗口页面的JS方法

    需求的情景如下: 1:做新增或修改等操作的时候打开一个新的浏览器窗口(使用window.open(参数等)方法) 2:在新增或修改等的页面上有返回按钮.重置按钮.保存按钮,对于返回就直接关闭此窗口(使 ...

  7. CSS3之圆角

    CSS3圆角border-radius也是比较常用的,有了圆角,可以少很多图片了:) 语法: border-radius : none | <length>{1,4} [/ <len ...

  8. C#基础知识点

    一.方法(结构.数组.冒泡排序.3个参数重载) 1将string转换为int类型 Convert.ToInt32(); int.Parse() ; int.TryParse()三种方式. 2 结构:可 ...

  9. C++ Namespace 详解

    命名空间的定义格式为:(取自C++标准文档) named-namespace-definition: namespace identifier { namespace-body } unnamed-n ...

  10. [Ajax] 使用Ajax异步上传图片文件(非Form表单提交)

    通过表单Form提交来上传文件的方式这里就不说了: 下面介绍,通过js中使用ajax异步上传图片文件: 新建一个html页面和一个一般处理程序即可: 涉及思路: //发送2次Ajax请求完成js异步上 ...