示例#1
0
        private void Awake()
        {
            var input     = Geometry.StarPolygon2(5, 1, 2);
            var generator = new StraightSkeletonGenerator();

            skeleton = generator.Generate(input);
        }
示例#2
0
        private static void DrawSkeleton(StraightSkeleton skeleton)
        {
            GL.Color(Color.white);
            for (var polygonIndex = 0; polygonIndex < skeleton.polygons.Count; polygonIndex++)
            {
                Vector3 zOffset = Vector3.back * (skeletonPolygonOffset * polygonIndex);

                var skeletonPolygon = skeleton.polygons[polygonIndex];
                for (int vertexIndex = 0; vertexIndex < skeletonPolygon.Count; vertexIndex++)
                {
                    Vector2 current = skeletonPolygon[vertexIndex];
                    Vector2 next    = skeletonPolygon.GetLooped(vertexIndex + 1);
                    GLE.DrawLine((Vector3)current + zOffset, (Vector3)next + zOffset);
                }
            }
        }
        public StraightSkeleton Generate(IList <Vector2> polygon)
        {
            activePlans.Clear();
            newPlans.Clear();

            var activePlan = new Plan(polygon);

            activePlans.Add(activePlan);

            skeleton = new StraightSkeleton(activePlan);

            foreach (var p in activePlans)
            {
                foreach (var vertex in p)
                {
                    CalculateBisector(vertex);
                }
            }

            int count = 0;

            while (activePlans.Count > 0)
            {
                if (count > polygon.Count)
                {
                    Debug.LogError("Too many iterations");
                    break;
                }
                bool success = OffsetAndDetectEvents();
                if (!success)
                {
                    return(skeleton);
                }
                count++;
            }
            return(skeleton);
        }