Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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());
            }
        }
Beispiel #3
0
        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;
        }