private void Init() { var segment = Utilities.GetSegment(Id); IsStartSide = segment.m_startNode == Markup.Id; IsLaneInvert = IsStartSide ^ segment.IsInvert(); var info = segment.Info; var lanes = segment.GetLanesId().ToArray(); var driveLanesIdxs = info.m_sortedLanes.Where(s => Utilities.IsDriveLane(info.m_lanes[s])); if (!IsLaneInvert) { driveLanesIdxs = driveLanesIdxs.Reverse(); } DriveLanes = driveLanesIdxs.Select(d => new DriveLane(this, lanes[d], info.m_lanes[d])).ToArray(); if (!DriveLanes.Any()) { return; } Lines = new SegmentMarkupLine[DriveLanes.Length + 1]; for (int i = 0; i < Lines.Length; i += 1) { var left = i - 1 >= 0 ? DriveLanes[i - 1] : null; var right = i < DriveLanes.Length ? DriveLanes[i] : null; var markupLine = new SegmentMarkupLine(this, left, right); Lines[i] = markupLine; } }
private void CreatePoints(NetSegment segment) { var info = segment.Info; var lanes = segment.GetLanesId().ToArray(); var driveLanesIdxs = info.m_sortedLanes.Where(s => Utilities.IsDriveLane(info.m_lanes[s])); if (!IsLaneInvert) { driveLanesIdxs = driveLanesIdxs.Reverse(); } DriveLanes = driveLanesIdxs.Select(d => new DriveLane(this, lanes[d], info.m_lanes[d])).ToArray(); if (!DriveLanes.Any()) { return; } Lines = new SegmentMarkupLine[DriveLanes.Length + 1]; for (int i = 0; i < Lines.Length; i += 1) { var left = i - 1 >= 0 ? DriveLanes[i - 1] : null; var right = i < DriveLanes.Length ? DriveLanes[i] : null; var markupLine = new SegmentMarkupLine(this, left, right); Lines[i] = markupLine; } foreach (var markupLine in Lines) { PointsList.AddRange(markupLine.GetMarkupPoints()); } }
private void CalculateCorner(NetSegment segment) { var cornerAngle = (IsStartSide ? segment.m_cornerAngleStart : segment.m_cornerAngleEnd) / 255f * 360f; if (IsLaneInvert) { cornerAngle = cornerAngle >= 180 ? cornerAngle - 180 : cornerAngle + 180; } CornerAngle = cornerAngle * Mathf.Deg2Rad; CornerDir = DriveLanes.Length <= 1 ? CornerAngle.Direction() : (DriveLanes.Last().NetLane.CalculatePosition(T) - DriveLanes.First().NetLane.CalculatePosition(T)).normalized; NormalDir = (DriveLanes.Any() ? DriveLanes.Aggregate(Vector3.zero, (v, l) => v + l.NetLane.CalculateDirection(T)).normalized : Vector3.zero) * (IsStartSide ? -1 : 1); NormalAngle = NormalDir.AbsoluteAngle(); var angle = Vector3.Angle(NormalDir, CornerDir); CornerAndNormalAngle = (angle > 90 ? 180 - angle : angle) * Mathf.Deg2Rad; }
private void CalculatePosition(NetSegment segment) { if (DriveLanes.FirstOrDefault() is DriveLane driveLane) { var position = driveLane.NetLane.CalculatePosition(T); var coef = Mathf.Sin(CornerAndNormalAngle); RoadHalfWidth = (segment.Info.m_halfWidth - segment.Info.m_pavementWidth) / coef; Position = position + (IsLaneInvert ? -CornerDir : CornerDir) * driveLane.Position / coef; RightSide = Position.Value - RoadHalfWidth * CornerDir; LeftSide = Position.Value + RoadHalfWidth * CornerDir; } else { Position = null; } }
private void CalculatePosition(NetSegment segment) { if (DriveLanes.FirstOrDefault() is DriveLane driveLane) { var position = driveLane.NetLane.CalculatePosition(T); var coef = Mathf.Sin(CornerAndNormalAngle); RoadHalfWidth = segment.Info.m_halfWidth - segment.Info.m_pavementWidth; RoadHalfWidthTransform = RoadHalfWidth / coef; Position = position + (IsLaneInvert ? -CornerDir : CornerDir) * driveLane.Position / coef; FirstPointSide = Position.Value - RoadHalfWidthTransform * CornerDir; LastPointSide = Position.Value + RoadHalfWidthTransform * CornerDir; Line = new StraightTrajectory(FirstPointSide, LastPointSide); } else { Position = null; } }
public void Update() { var segment = Utilities.GetSegment(Id); CornerAngle = (IsStartSide ? segment.m_cornerAngleStart : segment.m_cornerAngleEnd) / 255f * 360f; if (IsLaneInvert) { CornerAngle = CornerAngle >= 180 ? CornerAngle - 180 : CornerAngle + 180; } CornerDir = Vector3.right.TurnDeg(CornerAngle, false).normalized; if (DriveLanes.FirstOrDefault() is DriveLane driveLane) { Position = driveLane.NetLane.CalculatePosition(IsStartSide ? 0f : 1f) + CornerDir * driveLane.Position * (IsLaneInvert ? -1 : 1); } foreach (var point in PointsList) { point.Update(); } }
protected virtual void Init() { _pointNum = 0; var segment = GetSegment(); IsStartSide = GetIsStartSide(); IsLaneInvert = IsStartSide ^ segment.IsInvert(); FirstLane = segment.m_lanes; var sources = new List <IPointSource>(); if (segment.Info is IMarkingNetInfo info) { foreach (var position in IsLaneInvert ? info.MarkupPoints : info.MarkupPoints.Reverse()) { sources.Add(new RoadGeneratorPointSource(this, IsLaneInvert ? position : -position)); } } else { var driveLanes = DriveLanes.ToArray(); if (driveLanes.Any()) { for (var i = 0; i <= driveLanes.Length; i += 1) { var left = i - 1 >= 0 ? driveLanes[i - 1] : null; var right = i < driveLanes.Length ? driveLanes[i] : null; foreach (var source in NetInfoPointSource.GetSource(this, left, right)) { sources.Add(source); } } } } var points = sources.Select(s => new MarkupEnterPoint(this, s)).ToArray(); EnterPointsDic = points.ToDictionary(p => p.Num, p => p); ResetPoints(); }