예제 #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;
            }
        }
예제 #2
0
파일: Enter.cs 프로젝트: Quboid/NodeMarkup
        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());
            }
        }
예제 #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;
        }
예제 #4
0
        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;
            }
        }
예제 #5
0
        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;
            }
        }
예제 #6
0
파일: Enter.cs 프로젝트: Quboid/NodeMarkup
        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();
            }
        }
예제 #7
0
        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();
        }