예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="p_spriteObj"></param>
        /// <param name="p_sprite"></param>
        /// <param name="p_point1"></param>
        /// <param name="p_point2"></param>
        /// <returns></returns>
        public OneCut.CutResult CutSpriteToMesh(OneCutObject p_spriteObj, Vector2 selfPos, Vector2 p_point1, Vector2 p_point2)
        {
            List <Triangle> exp_trig           = new List <Triangle>(p_spriteObj.triangles);
            List <Vector2>  intersectionPoints = new List <Vector2>();

            Sprite sprite = p_spriteObj.sprite;

            Vector2[]         vertices          = p_spriteObj.meshVert;
            VerticesSegmentor verticesSegmentor = new VerticesSegmentor(p_point1, p_point2);

            for (int i = 0; i < exp_trig.Count; i++)
            {
                if (exp_trig[i].pairs.Count == 3)
                {
                    HandleTrigIntersection(intersectionPoints, exp_trig[i], verticesSegmentor, selfPos, p_point1, p_point2);
                }
            }

            List <Triangle> newTrigCol = TrigBuilder.Build(exp_trig);

            //always contain 2 trig result
            var segmentResult = ResegmentTriangle(newTrigCol, verticesSegmentor, selfPos);

            return(new OneCut.CutResult(
                       GetSprite(segmentResult[0]),
                       GetSprite(segmentResult[1]),
                       GetSprite(exp_trig),

                       intersectionPoints

                       ));

            //ResegmentVertices(vertices, verticesSegmentor);
        }
예제 #2
0
        /// <summary>
        /// Segment raw triangles into two according to cutting line
        /// </summary>
        /// <param name="p_triangles"></param>
        /// <param name="verticesSegmentor"></param>
        /// <returns></returns>
        private List <Triangle>[] ResegmentTriangle(List <Triangle> p_triangles, VerticesSegmentor verticesSegmentor, Vector2 selfPos)
        {
            List <Triangle> segmentOne = new List <Triangle>();
            List <Triangle> segmentTwo = new List <Triangle>();

            float segmentA_area = 0, segmentB_area = 0;


            for (int i = 0; i < p_triangles.Count; i++)
            {
                if (verticesSegmentor.CompareInputWithAverageLine(p_triangles[i].center + selfPos))
                {
                    p_triangles[i].segmentID = "A";
                    segmentA_area           += p_triangles[i].area;
                    segmentOne.Add(p_triangles[i]);
                }
                else
                {
                    p_triangles[i].segmentID = "B";
                    segmentB_area           += p_triangles[i].area;
                    segmentTwo.Add(p_triangles[i]);
                }
            }

            List <Triangle> mainTrig = (segmentA_area > segmentB_area) ? segmentOne : segmentTwo;
            List <Triangle> subTrig  = (mainTrig == segmentOne) ? segmentTwo : segmentOne;

            return(new List <Triangle>[] { mainTrig, subTrig });
        }
예제 #3
0
        private Triangle.Fragment FindVerticesSegment(VerticesSegmentor verticesSegmentor, Vector2 vertices, Vector2 worldVert)
        {
            //Triangle.Fragment fragment = new Triangle.Fragment(vertices,);
            string segmentID = (verticesSegmentor.CompareInputWithAverageLine(worldVert)) ? "A" : "B";

            Triangle.Fragment fragment = new Triangle.Fragment(vertices, segmentID, Triangle.Fragment.Type.Original);

            return(fragment);
        }
예제 #4
0
        private void HandleTrigIntersection(List <Vector2> intersectList, Triangle triangle, VerticesSegmentor verticesSegmentor, Vector2 selfPos, Vector2 p_pointA, Vector2 p_pointB)
        {
            int pairNum = triangle.pairs.Count;

            for (int i = pairNum - 1; i >= 0; i--)
            {
                TrigPairs pair = triangle.pairs[i];

                Vector2 point = AddIntersectPoint(
                    pair.nodeA + selfPos,
                    pair.nodeB + selfPos,
                    p_pointA, p_pointB
                    );

                //Intersection has occur
                if (!point.Equals(Vector2.positiveInfinity))
                {
                    Triangle.Fragment fragmentA = FindVerticesSegment(verticesSegmentor, pair.nodeA, pair.nodeA + selfPos);
                    Triangle.Fragment fragmentB = FindVerticesSegment(verticesSegmentor, pair.nodeB, pair.nodeB + selfPos);
                    Triangle.Fragment fragmentC = new Triangle.Fragment(point - selfPos, "", Triangle.Fragment.Type.Cutted);

                    triangle.AddFragment(new Triangle.Fragment[] { fragmentA, fragmentB, fragmentC });
                    intersectList.Add(point);
                }
            }
        }