Exemple #1
0
        private static double CalculateAngleSign(Axis3D cylinderAxis, Position3D start, Position3D end)
        {
            var       axisFrame = Matrix44D.CreateRotation(cylinderAxis.Offset, cylinderAxis.Direction);
            Matrix44D invframe  = axisFrame.Inverse();

            var startInFrame = invframe * start;
            var endInFrame   = invframe * end;

            var sx = startInFrame.X;
            var sy = startInFrame.Y;
            var ex = endInFrame.X;
            var ey = endInFrame.Y;

            var sign = TriangleMath.IsCounterClockwise(sx, sy, ex, ey, 0.0, 0.0) ? 1.0 : -1.0;

            return(sign);
        }
    private void CreateMeshMaskByPolygonCollider2D()
    {
#if UNITY_EDITOR
        //把顶点归一化
        vertices = polygon2d.GetPath(0).ToList();
        if (vertices[0] == vertices[vertices.Count - 1])
        {
            vertices.RemoveAt(vertices.Count - 1);
        }

        Stopwatch sw = new Stopwatch();
        sw.Start();
        TriangleMath tr = new TriangleMath(vertices.ToArray());
        triangles = tr.Triangulate().ToList();
        sw.Stop();
        UnityEngine.Debug.Log("三角化耗时:" + sw.ElapsedMilliseconds + "ms");
#endif
    }
    private void CreateMeshMaskByImage()
    {
#if UNITY_EDITOR
        GameObject o = Selection.activeGameObject;
        if (o != null && o.GetComponent <Image>() != null)
        {
            Image  img  = o.GetComponent <Image>();
            string path = AssetDatabase.GetAssetPath(img.mainTexture);
            if (!string.IsNullOrEmpty(path))
            {
                TextureImporter         textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
                TextureImporterSettings cacheSettings   = new TextureImporterSettings();
                textureImporter.ReadTextureSettings(cacheSettings);

                //将Texture临时设置为可读写
                TextureImporterSettings tmp = new TextureImporterSettings();
                textureImporter.ReadTextureSettings(tmp);
                tmp.readable = true;
                textureImporter.SetTextureSettings(tmp);
                AssetDatabase.ImportAsset(path);

                SobelEdgeDetection sobel = new SobelEdgeDetection();

                Texture2D targetT2d = sobel.Detect(img.mainTexture as Texture2D);

                List <Vector2> vertices = EdgeUtil.GetPoints(targetT2d);

                for (int i = 0; i < vertices.Count; i++)
                {
                    Vector3 vec = vertices[i];
                    vec.x -= targetT2d.width * 0.5f;
                    vec.y -= targetT2d.height * 0.5f;
                    //vec.x /= targetT2d.width;
                    //vec.y /= targetT2d.height;
                    vertices[i] = vec;
                }

                //恢复Texture设置
                textureImporter.SetTextureSettings(cacheSettings);
                AssetDatabase.ImportAsset(path);

                MeshMask          mm        = o.GetComponent <MeshMask>();
                PolygonCollider2D polygon2d = o.GetComponent <PolygonCollider2D>();
                if (mm == null)
                {
                    mm = o.AddComponent <MeshMask>();
                }
                if (polygon2d == null)
                {
                    polygon2d = o.AddComponent <PolygonCollider2D>();
                }

                vertices = vertices.Select(p =>
                {
                    return(new Vector2(p.x / img.mainTexture.width * image.rectTransform.rect.width, p.y / img.mainTexture.height * image.rectTransform.rect.height));
                }).ToList();
                polygon2d.SetPath(0, vertices.ToArray());

                mm.vertices = polygon2d.GetPath(0).ToList();
                if (mm.vertices[0] == mm.vertices[vertices.Count - 1])
                {
                    mm.vertices.RemoveAt(mm.vertices.Count - 1);
                }

                Stopwatch sw = new Stopwatch();
                sw.Start();
                TriangleMath tr = new TriangleMath(mm.vertices.ToArray());
                mm.triangles = tr.Triangulate().ToList();
                sw.Stop();
                UnityEngine.Debug.Log("三角化耗时:" + sw.ElapsedMilliseconds + "ms");

                AssetDatabase.Refresh();
            }
            else
            {
                UnityEngine.Debug.LogError("Image组件还没设置图片");
            }
        }
        else
        {
            UnityEngine.Debug.LogError("选中物体需要有Image组件才能生成PolygonImage");
        }
#endif
    }
 /// <summary>
 /// Determines whether this quad contains the specified point.
 /// </summary>
 /// <param name="v">The point</param>
 /// <returns>
 ///     <c>true</c> if quad contains the specified point; otherwise, <c>false</c>.
 /// </returns>
 public bool Contains(Point pt)
 {
     // breaking quad into 2 triangles,
     // points contains in quad, if it contains in at least one half-triangle of it.
     return(TriangleMath.TriangleContains(v00, v01, v11, pt) || TriangleMath.TriangleContains(v00, v10, v11, pt));
 }
Exemple #5
0
 public void IsCounterClockwiseTest1()
 {
     var res = TriangleMath.IsCounterClockwise(10, 10, 10, 10, 0, 0);
 }