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

 

 

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

posted on 2015-03-18 15:09  andy1987  阅读(1395)  评论(0编辑  收藏  举报

导航