protected IEnumerable <MarkupStyleDash> CalculateCroswalkDash(ILineTrajectory trajectory, float startT, float endT, Vector3 direction, ILineTrajectory[] borders, float length, float width) { var position = trajectory.Position((startT + endT) / 2); var dashTrajectory = new StraightTrajectory(position, position + direction, false); var intersects = MarkupIntersect.Calculate(dashTrajectory, borders, true); intersects = intersects.OrderBy(i => i.FirstT).ToList(); var halfLength = length / 2; var halfWidth = width / 2; for (var i = 1; i < intersects.Count; i += 2) { var startOffset = GetOffset(intersects[i - 1], halfWidth); var endOffset = GetOffset(intersects[i], halfWidth); var start = Mathf.Clamp(intersects[i - 1].FirstT + startOffset, -halfLength, halfLength); var end = Mathf.Clamp(intersects[i].FirstT - endOffset, -halfLength, halfLength); var delta = end - start; if (delta < 0.9 * length && delta < 0.67 * width) { continue; } var startPosition = position + direction * start; var endPosition = position + direction * end; yield return(new MarkupStyleDash(startPosition, endPosition, direction, width, Color)); } }
private bool FindIntersects(List <ITrajectory> A, List <ITrajectory> B, bool invert) { var x = !invert ? A.Count - 1 : 0; var xPart = new StraightTrajectory(A[x]); for (var y = !invert ? 1 : B.Count - 2; !invert ? y < B.Count : y >= 0; y += !invert ? 1 : -1) { var yPart = new StraightTrajectory(B[y]); var intersect = MarkupIntersect.CalculateSingle(xPart, yPart); if (intersect.IsIntersect) { if (!invert) { A[x] = xPart.Cut(0f, intersect.FirstT); B[y] = yPart.Cut(intersect.SecondT, 1f); B.RemoveRange(0, y); } else { A[x] = xPart.Cut(intersect.FirstT, 1f); B[y] = yPart.Cut(0f, intersect.SecondT); B.RemoveRange(y + 1, B.Count - (y + 1)); } return(true); } } return(false); }
protected float GetOffset(MarkupIntersect intersect, float offset) { var tan = Mathf.Tan(intersect.Angle); return(tan != 0 ? offset / tan : 1000f); }
protected float GetOffset(MarkupIntersect intersect, float offset) { var sin = Mathf.Sin(intersect.Angle); return(sin != 0 ? offset / sin : 1000f); }