{"id":609,"date":"2016-09-29T14:46:46","date_gmt":"2016-09-29T06:46:46","guid":{"rendered":"http:\/\/39.100.100.179\/?p=609"},"modified":"2017-07-19T17:58:43","modified_gmt":"2017-07-19T09:58:43","slug":"%e6%89%8b%e5%8a%bf%e8%af%86%e5%88%ab%e5%9b%be%e5%bd%a2%e7%ae%97%e6%b3%95","status":"publish","type":"post","link":"http:\/\/www.u3d8.com\/?p=609","title":{"rendered":"\u624b\u52bf\u8bc6\u522b\u56fe\u5f62\u7b97\u6cd5"},"content":{"rendered":"<p>\u6211\u4eec\u53c2\u7167\u00a0<a href=\"http:\/\/www.u3d8.com\/?p=601\">http:\/\/www.u3d8.com\/?p=601<\/a>\u00a0 \u8fd9\u4e2ah5\u6559\u7a0b\u4e2d\u7684\u4f8b\u5b50\u53bb\u505a\uff0c\u8fd9\u6b21\u9700\u6c42\u662f\u68c0\u6d4b\u662f\u5426\u5728\u5c4f\u5e55\u4e0a\u753b\u51fa\u4e86\u5706\u5f62\u3002\u4e0a\u4ee3\u7801\uff1a<\/p>\n<p>\u9996\u5148 \u56fe\u5f62\u7b97\u6cd5\u811a\u672c\uff1a<\/p>\n<pre class=\"lang:c# decode:true \">using UnityEngine;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n\r\npublic class FigureGesture {\r\n\r\n\r\n    public List&lt;Vector2&gt; swipeDatas;\r\n    public bool isCircle = false;\r\n\r\n    public void Init()\r\n    {\r\n        swipeDatas = new List&lt;Vector2&gt;();\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u6570\u636e\u964d\u566a\u64cd\u4f5c\r\n    \/\/\/ &lt;\/summary&gt;\r\n    public void Motion()\r\n    {\r\n        List&lt;Vector2&gt; _arr = new List&lt;Vector2&gt;();\r\n        int currentIndex = 0;\r\n        int len = swipeDatas.Count;\r\n        _arr.Add(this.swipeDatas[currentIndex]);\r\n        for(int i = 0; i&lt;len; i++)\r\n        {\r\n            if (Vector2.Distance(this.swipeDatas[currentIndex], this.swipeDatas[i]) &gt; 10)\r\n            {\r\n                currentIndex = i;\r\n                _arr.Add(this.swipeDatas[currentIndex]);\r\n            }\r\n        }\r\n\r\n        this.swipeDatas = _arr;\r\n        this.ParseDirection();\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u5c06\u91c7\u6837\u6570\u636e\u8f6c\u6362\u4e3a\u65b9\u5411\u5e8f\u5217\r\n    \/\/\/ &lt;\/summary&gt;\r\n    private List&lt;float&gt; dirsArr;\r\n    private void ParseDirection()\r\n    {\r\n        dirsArr = new List&lt;float&gt;();\r\n        int len = this.swipeDatas.Count;\r\n        for(int i = 0; i&lt;len - 1; i++)\r\n        {\r\n            Vector2 p1 = this.swipeDatas[i];\r\n            Vector2 p2 = this.swipeDatas[i + 1];\r\n            float a = p1.y - p2.y;\r\n            float b = Vector2.Distance(p1, p2);\r\n            float rad = Mathf.Asin(a \/ b);\r\n            float ang = rad * 57.2957800f; \/\/ rad * 180\/Math.PI \u76f4\u63a5\u6c42\u5e38\u91cf\uff0c\u4f18\u5316\r\n            int quad = Quadrant(p1, p2);\r\n            int dir = GetDirByAngQuad(ang, quad);\r\n            dirsArr.Add(dir);\r\n        }\r\n        string dirstr = RepDiff();\r\n\r\n        JudgeIfCircle(dirstr);\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u8ba1\u7b97\u4e24\u70b9\u5173\u7cfb\u6240\u5f62\u6210\u7684\u8c61\u9650\r\n    \/\/\/ \u4ee5P1 \u4f5c\u4e3a\u5750\u6807\u539f\u70b9\uff0cP2\u4e3a\u8bbe\u5b9a\u70b9\uff0c\u5224\u65adP2\u76f8\u5bf9\u4e8eP1\u65f6\u6240\u5728\u8c61\u9650\r\n    \/\/\/ &lt;\/summary&gt;\r\n    \/\/\/ &lt;param name=\"p1\"&gt;&lt;\/param&gt;\r\n    \/\/\/ &lt;param name=\"p2\"&gt;&lt;\/param&gt;\r\n    \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n    private int Quadrant(Vector2 p1, Vector2 p2)\r\n    {\r\n        if(p2.x&gt;=p1.x)\r\n        {\r\n            if( p2.y &lt;= p1.y )\r\n            {\r\n                return 1;\r\n            }\r\n            else\r\n            {\r\n                return 4;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if( p2.y &lt;= p1.y )\r\n            {\r\n                return 2;\r\n            }\r\n            else\r\n            {\r\n                return 3;\r\n            }\r\n        }\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u6839\u636e\u6240\u5728\u8c61\u9650\u4e0e\u89d2\u5ea6\u8ba1\u7b97\u51fa\u65b9\u5411\u7f16\u53f7\u3002\r\n    \/\/\/ \u65b9\u5411\u7f16\u53f7\uff0c\u4ee5\u7b2c\u4e00\u8c61\u96500\u5ea6\u4e3a\u57fa\u7840\uff0c\u6309\u7167\u987a\u65f6\u9488\u65b9\u5411\uff0c\u5c06\u5706\u7b49\u5206\u4e3a8\u4efd\r\n    \/\/\/ &lt;\/summary&gt;\r\n    private int GetDirByAngQuad(float ang, int quad)\r\n    {\r\n        switch(quad)\r\n        {\r\n            case 1:\r\n                if( ang&lt;=22.5 &amp;&amp; ang&gt;= 0 )\r\n                {\r\n                    return 1;\r\n                }\r\n                else if( ang&lt;= 67.5 &amp;&amp; ang&gt; 22.5 )\r\n                {\r\n                    return 8;\r\n                }\r\n                else\r\n                {\r\n                    return 7;\r\n                }\r\n                break;\r\n            case 2:\r\n                if( ang&lt;=22.5 &amp;&amp; ang&gt;=0 )\r\n                {\r\n                    return 5;\r\n                }\r\n                else if( ang&lt;= 67.5 &amp;&amp; ang&gt; 22.5 )\r\n                {\r\n                    return 6;\r\n                }\r\n                else\r\n                {\r\n                    return 7;\r\n                }\r\n                break;\r\n            case 3:\r\n                if( ang&lt;= -67.5 &amp;&amp; ang&gt;= -90 )\r\n                {\r\n                    return 3;\r\n                }\r\n                else if( ang&lt;=-22.5 &amp;&amp; ang&gt; -67.5 )\r\n                {\r\n                    return 4;\r\n                }\r\n                else{\r\n                    return 5;\r\n                }\r\n                break;\r\n            case 4:\r\n                if( ang&lt;=-67.5 &amp;&amp; ang&gt;= -90 )\r\n                {\r\n                    return 3;\r\n                }\r\n                else if( ang&lt;=-22.5 &amp;&amp; ang&gt;-67.5)\r\n                {\r\n                    return 2;\r\n                }\r\n                else{\r\n                    return 1;\r\n                }\r\n                break;\r\n        }\r\n        return 0;\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u5bf9\u6bd4\u53bb\u91cd\r\n    \/\/\/ &lt;\/summary&gt;\r\n    \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n    private string RepDiff()\r\n    {\r\n        string str = \"\";\r\n        int len = dirsArr.Count;\r\n        int currentType = 0;\r\n        for(int i=0; i&lt;len; i++)\r\n        {\r\n            if( currentType != dirsArr[i])\r\n            {\r\n                currentType = (int)dirsArr[i];\r\n                str += dirsArr[i];\r\n            }\r\n        }\r\n        return str;\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u5224\u65ad\u662f\u5426\u4e3a\u5706\u5f62\r\n    \/\/\/ &lt;\/summary&gt;\r\n    \/\/\/ &lt;param name=\"str\"&gt;&lt;\/param&gt;\r\n    private void JudgeIfCircle(string str)\r\n    {\r\n        List&lt;int&gt; ints = new List&lt;int&gt;();\r\n        for (var i = 0; i &lt; str.Length; i++)\r\n        {\r\n            ints.Add(int.Parse(str[i].ToString()));\r\n        }\r\n\r\n        int wrongNum1 = 0;      \/\/ \u8bb0\u5f55\u6bcf\u4e09\u4e2a\u8fde\u7eed\u6570\u5b57\u662f\u5426\u5176\u4e2d\u4efb\u610f\u4e24\u4e2a\u90fd\u4e0d\u6328\u7740 \u5219+1  \u5982\uff1a153  758 \r\n        int wrongNum11 = 0;     \/\/ \u8bb0\u5f55\u6bcf\u4e24\u4e2a\u8fde\u7eed\u6570\u5b57 \u4e0d\u6328\u7740\u5219 +1  \u5982\uff1a 63   72\r\n        for (var j = 0; j &lt; ints.Count - 1; j++)\r\n        {\r\n            if (j &gt; 0 &amp;&amp; ints[j - 1] - ints[j] != 1 &amp;&amp; ints[j] - ints[j + 1] != 1)\r\n            {\r\n                wrongNum1++;\r\n            }\r\n            if (ints[j] - ints[j + 1] != 1)\r\n            {\r\n                wrongNum11++;\r\n            }\r\n        }\r\n        int wrongNum2 = 0;\r\n        int wrongNum22 = 0;\r\n        for (var j = 0; j &lt; ints.Count - 1; j++)\r\n        {\r\n            if (j &gt; 0 &amp;&amp; ints[j + 1] - ints[j] != 1 &amp;&amp; ints[j] - ints[j - 1] != 1)\r\n            {\r\n                wrongNum2++;\r\n            }\r\n\r\n            if (ints[j + 1] - ints[j] != 1)\r\n            {\r\n                wrongNum22++;\r\n            }\r\n        }\r\n\r\n        \/\/Debug.Log(str + \" w1: \" + wrongNum1 + \" w11: \" + wrongNum11 + \" w2: \" + wrongNum2 + \" w22: \" + wrongNum22);\r\n        if (ints.Count &gt;= 8 &amp;&amp; ((wrongNum1 == 0 &amp;&amp; wrongNum11 &lt;= 2) || (wrongNum1 == 1 &amp;&amp; wrongNum11 &lt;= 1)\r\n            || (wrongNum2 == 0 &amp;&amp; wrongNum22 &lt;= 2) || (wrongNum2 == 1 &amp;&amp; wrongNum22 &lt;= 1)))\r\n        {\r\n            isCircle = true;\r\n        }\r\n        else\r\n        {\r\n            isCircle = false;\r\n        }\r\n        \/\/GevekInputTest.test1Log.text = (isCircle + \"  \u5e8f\u53f7: \" + str + '\\n' + \"w1: \" + wrongNum1 + \" w11: \" + wrongNum11 + '\\n' + \"w2: \" + wrongNum2 + \" w22: \" + wrongNum22);\r\n    }\r\n}\r\n<\/pre>\n<p>\u4e0b\u9762\u4e3a\u624b\u6307\u6309\u4e0b\u65f6\u4e8b\u4ef6\u54cd\u5e94\uff1a<\/p>\n<pre class=\"lang:c# decode:true \">using UnityEngine;\r\nusing System.Collections;\r\n\r\npublic class Test : MonoBehaviour {\r\n\r\n    FigureGesture fg;\r\n    void Start()\r\n    {\r\n        fg = new FigureGesture();\r\n    }\r\n\r\n    void Update()\r\n    {\r\n\r\n        if (Input.GetMouseButtonDown(0))\r\n        {\r\n            fg.Init();\r\n            fg.swipeDatas.Add(Input.mousePosition);\r\n        }\r\n        else if (Input.GetMouseButton(0))\r\n        {\r\n            fg.swipeDatas.Add(Input.mousePosition);\r\n        }\r\n        else if (Input.GetMouseButtonUp(0))\r\n        {\r\n            fg.swipeDatas.Add(Input.mousePosition);\r\n            fg.Motion();\r\n            if (fg.isCircle)\r\n            {\r\n                Debug.Log(\"\u753b\u51fa\u4e86\u5706\u5f62\");\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>\u968f\u610f\u521b\u5efa\u4e2a\u7a7a\u7684\u5de5\u7a0b\uff0c\u5c06Test\u7c7b\u811a\u672c\u653e\u5728\u6444\u50cf\u673a\u4e0a\uff0c\u5c31\u53ef\u4ee5\u6d4b\u8bd5\u4e86\u3002<\/p>\n<p><a href=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2016\/09\/1.png\" data-lightbox=\"image_lg\"><img title=\"\u624b\u52bf\u8bc6\u522b\u56fe\u5f62\u7b97\u6cd5 - \u7b2c1\u5f20  | u3d8\u6280\u672f\u5206\u4eab\" alt=\"\u624b\u52bf\u8bc6\u522b\u56fe\u5f62\u7b97\u6cd5 - \u7b2c1\u5f20  | u3d8\u6280\u672f\u5206\u4eab\"  loading=\"lazy\" class=\"size-full wp-image-610 alignleft\"  data-src=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2016\/09\/1.png\" width=\"255\" height=\"205\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u4eec\u53c2\u7167\u00a0http:\/\/www.u3d8.com\/?p=601\u00a0 \u8fd9\u4e2ah5\u6559\u7a0b\u4e2d &hellip; <a href=\"http:\/\/www.u3d8.com\/?p=609\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[23],"tags":[174],"_links":{"self":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/609"}],"collection":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=609"}],"version-history":[{"count":7,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/609\/revisions"}],"predecessor-version":[{"id":1199,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/609\/revisions\/1199"}],"wp:attachment":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=609"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}