DrawTool多重笔之前奏 => 通过InkAnalyzer实现图形识别
这里要介绍的是通过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
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------