Exemplo n.º 1
0
        internal void CopyFrom(SimpleFixedSizedList <T> points)
        {
            //if (points._count > _count)
            //    Debug.LogError("Source array is larger than destination!");

            _count = points._count;
            for (int i = 0; i < _count; i++)
            {
                _elements[i] = points[i];
            }
        }
Exemplo n.º 2
0
        internal static bool ClipPointsAgainstEdge(SimpleFixedSizedList <Vector2> points, bool isHorizontalEdge, bool keepInside, float edgeValue)
        {
            int inputPointsCount = points.Count;

            if (inputPointsCount < 1)
            {
                return(false);
            }

            _outputPoints.Clear();

            // vertical edge (right/left) => coord = 0 (vector2[0] = vector2.x)
            // horizontal edge (top/bottom) => coord = 1 (vector2[1] = vector2.y)
            int coord = isHorizontalEdge ? 1 : 0;

            Vector2 previousPoint         = points[inputPointsCount - 1];
            bool    isPreviousPointInside = keepInside ? (previousPoint[coord] > edgeValue) : (previousPoint[coord] < edgeValue);

            bool areInputPointsUnchanged = isPreviousPointInside;

            for (int i = 0; i < inputPointsCount; i++)
            {
                Vector2 currentPoint         = points[i];
                bool    isCurrentPointInside = keepInside ? (currentPoint[coord] > edgeValue) : (currentPoint[coord] < edgeValue);

                if (isCurrentPointInside != isPreviousPointInside)
                {
                    //intersection
                    Vector2 dir = currentPoint - previousPoint;
                    float   x   = !isHorizontalEdge ? edgeValue : previousPoint.x + (dir.x / dir.y) * (edgeValue - previousPoint.y);
                    float   y   = isHorizontalEdge ? edgeValue : previousPoint.y + (dir.y / dir.x) * (edgeValue - previousPoint.x);
                    _outputPoints.Add(new Vector2(x, y));

                    areInputPointsUnchanged = false;
                }

                if (isCurrentPointInside)
                {
                    _outputPoints.Add(currentPoint);
                }

                previousPoint         = currentPoint;
                isPreviousPointInside = isCurrentPointInside;
            }

            points.CopyFrom(_outputPoints);

            return(areInputPointsUnchanged);
        }