Exemplo n.º 1
0
        private static List <FillerContour.Part> Move(List <FillerContour.Part> originalParts, TrajectoryHelper.Direction direction, float offset, float medianOffset)
        {
            var result = new List <FillerContour.Part>(originalParts.Count);

            foreach (var part in originalParts)
            {
                var move = part.IsEnter ? medianOffset : offset;

                if (move == 0f)
                {
                    result.Add(part);
                }
                else
                {
                    var trajectory  = part.Trajectory;
                    var startNormal = trajectory.StartDirection.MakeFlatNormalized().Turn90(direction == TrajectoryHelper.Direction.ClockWise) * move;
                    var endNormal   = trajectory.EndDirection.MakeFlatNormalized().Turn90(direction == TrajectoryHelper.Direction.CounterClockWise) * move;

                    var movedTrajectory = part.IsEnter ? (ITrajectory) new StraightTrajectory(trajectory.StartPosition + startNormal, trajectory.EndPosition + endNormal) : (ITrajectory) new BezierTrajectory(trajectory.StartPosition + startNormal, trajectory.StartDirection, trajectory.EndPosition + endNormal, trajectory.EndDirection);
                    var newPart         = new FillerContour.Part(movedTrajectory, part.IsEnter);
                    result.Add(newPart);
                }
            }

            return(result);
        }
Exemplo n.º 2
0
        private static void Connect(List <FillerContour.Part> parts, List <FillerContour.Part> originalParts, float offset, float medianOffset)
        {
            var count = 0;

            for (var i = 0; i < parts.Count; i += 1)
            {
                var j      = (i + 1) % parts.Count;
                var first  = parts[i];
                var second = parts[j];

                if ((first.IsEnter ? medianOffset : offset) != 0)
                {
                    if ((second.IsEnter ? medianOffset : offset) != 0)
                    {
                        if ((first.Trajectory.EndPosition - second.Trajectory.StartPosition).sqrMagnitude > 0.0001f)
                        {
                            var nextCount        = (count + 1) % originalParts.Count;
                            var firstTrajectory  = new StraightTrajectory(first.Trajectory.EndPosition, originalParts[count].Trajectory.EndPosition);
                            var secondTrajectory = new StraightTrajectory(originalParts[nextCount].Trajectory.StartPosition, second.Trajectory.StartPosition);

                            AddToList(parts, i + 1, new FillerContour.Part(firstTrajectory));
                            AddToList(parts, i + 2, new FillerContour.Part(secondTrajectory));
                            i += 2;
                        }
                    }
                    else if (Intersection.CalculateSingle(first.Trajectory, second.Trajectory, out var firstT, out var secondT))
                    {
                        if (first.Trajectory.Length * (1f - firstT) < 0.1f || second.Trajectory.Length * secondT < 0.1f)
                        {
                            first    = new FillerContour.Part(first.Trajectory.Cut(0f, firstT), first.IsEnter);
                            parts[i] = first;
                            second   = new FillerContour.Part(second.Trajectory.Cut(secondT, 1f), second.IsEnter);
                            parts[j] = second;
                        }
                        else
                        {
                            Add(parts, ref i, first.Trajectory.EndPosition, second.Trajectory.StartPosition);
                        }
                    }
                    else if (Intersection.CalculateSingle(new StraightTrajectory(first.Trajectory.EndPosition, first.Trajectory.EndPosition - first.Trajectory.EndDirection), second.Trajectory, out _, out var t))
                    {
                        second   = new FillerContour.Part(second.Trajectory.Cut(t, 1f), second.IsEnter);
                        parts[j] = second;

                        Add(parts, ref i, first.Trajectory.EndPosition, second.Trajectory.StartPosition);
                    }
                    else
                    {
                        Add(parts, ref i, first.Trajectory.EndPosition, second.Trajectory.StartPosition);
                    }
                }