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); }
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); } }