Пример #1
0
        public List <TrailSegment> GetTrailSegmentList(bool withHead)
        {
            if (!withHead)
            {
                return(_trail.GetList());
            }

            var   trailWithHead = new List <TrailSegment>(_trail.GetList());
            float headSegmentStartX;
            float headSegmentStartY;

            if (_trail.Size() > 0)
            {
                var head = _trail.GetHead();
                if (head == null)
                {
                    return(new List <TrailSegment>());
                }
                var lastSeg = _trail.GetHead().GetLine();
                headSegmentStartX = lastSeg.End.X;
                headSegmentStartY = lastSeg.End.Y;
            }
            else
            {
                headSegmentStartX = _startPos.X;
                headSegmentStartY = _startPos.Y;
            }

            var headSegment = new TrailSegment(_ownerPid, new LineSegment2D(new Vector2(headSegmentStartX, headSegmentStartY), new Vector2(_pos.X, _pos.Y)));

            trailWithHead.Add(headSegment);

            return(trailWithHead);
        }
Пример #2
0
        public void ReplaceSegments(TrailSegment s, params TrailSegment[] newSegments)
        {
            var segment = _segments.GetValueOrDefault(s.GetId());

            if (segment == null)
            {
                return;
            }

            // TODO this is clearly not done
        }
Пример #3
0
 public void SetTrailSegment(TrailSegment trailSegment)
 {
     this.trailSegment = trailSegment;
 }
Пример #4
0
 public ImpactPoint(TrailSegment seg, Point p)
 {
     trailSegment = seg;
     point        = p;
 }
Пример #5
0
        public void BreakSegment(ImpactPoint impactPoint, double radius)
        {
            var          requestedSegment = impactPoint.GetTrailSegment();
            var          orientation      = requestedSegment.GetOrientation();
            TrailSegment newSegment1      = null;
            TrailSegment newSegment2      = null;

            if (orientation.X == 1)
            {
                // segment is horizontal
                var   y = requestedSegment.GetLine().Start.Y;
                var   x1 = requestedSegment.GetLine().Start.X;
                var   x2 = requestedSegment.GetLine().End.X;
                float t1x1, t1x2, t2x1, t2x2;
                if (x1 < x2)
                {
                    t1x1 = Math.Min(x1, x2);
                    t1x2 = (float)Math.Max(impactPoint.GetPoint().X - radius, t1x1);
                    t2x2 = Math.Max(x1, x2);
                    t2x1 = (float)Math.Min(impactPoint.GetPoint().X + radius, t2x2);
                }
                else
                {
                    t1x1 = Math.Max(x1, x2);
                    t1x2 = (float)Math.Min(impactPoint.GetPoint().X + radius, t1x1);
                    t2x2 = Math.Min(x1, x2);
                    t2x1 = (float)Math.Max(impactPoint.GetPoint().X - radius, t2x2);
                }

                var newSegment1Line = new LineSegment2D();
                newSegment1Line.Start.X = t1x1;
                newSegment1Line.Start.Y = y;
                newSegment1Line.End.X   = t1x2;
                newSegment1Line.End.Y   = y;

                var newSegment2Line = new LineSegment2D();
                newSegment2Line.Start.X = t2x1;
                newSegment2Line.Start.Y = y;
                newSegment2Line.End.X   = t2x2;
                newSegment2Line.End.Y   = y;

                newSegment1 = new TrailSegment(requestedSegment.GetOwnerPid(), newSegment1Line);
                newSegment2 = new TrailSegment(requestedSegment.GetOwnerPid(), newSegment2Line);
            }
            else if (orientation.Y == 1)
            {
                // segment is vertical
                var   x = requestedSegment.GetLine().Start.X;
                var   y1 = requestedSegment.GetLine().Start.Y;
                var   y2 = requestedSegment.GetLine().End.Y;
                float t1y1, t1y2, t2y1, t2y2;
                if (y1 < y2)
                {
                    t1y1 = Math.Min(y1, y2);
                    t1y2 = (float)Math.Max(impactPoint.GetPoint().Y - radius, t1y1);
                    t2y2 = Math.Max(y1, y2);
                    t2y1 = (float)Math.Min(impactPoint.GetPoint().Y + radius, t2y2);
                }
                else
                {
                    t1y1 = Math.Max(y1, y2);
                    t1y2 = (float)Math.Min(impactPoint.GetPoint().Y + radius, t1y1);
                    t2y2 = Math.Min(y1, y2);
                    t2y1 = (float)Math.Max(impactPoint.GetPoint().Y - radius, t2y2);
                }

                var newSegment1Line = new LineSegment2D();
                newSegment1Line.Start.X = x;
                newSegment1Line.Start.Y = t1y1;
                newSegment1Line.End.X   = x;
                newSegment1Line.End.Y   = t1y2;

                var newSegment2Line = new LineSegment2D();
                newSegment2Line.Start.X = x;
                newSegment2Line.Start.Y = t2y1;
                newSegment2Line.End.X   = x;
                newSegment2Line.End.Y   = t2y2;

                newSegment1 = new TrailSegment(requestedSegment.GetOwnerPid(), newSegment1Line);
                newSegment2 = new TrailSegment(requestedSegment.GetOwnerPid(), newSegment2Line);
            }

            _segments.TryGetValue(requestedSegment.GetId(), out var segment);
            if (segment == null)
            {
                if (requestedSegment.GetId() == _head.GetId())
                {
                    segment = requestedSegment; // Segment being broken is (missing) segment between bike and last corner
                }
                else
                {
                    return;
                }
            }

            // Int casts here may be an issue TODO
            var frontOfSegment    = new Point((int)segment.GetLine().End.X, (int)segment.GetLine().End.Y);
            var newSegment1Point1 = new Point((int)newSegment1.GetLine().Start.X, (int)newSegment1.GetLine().Start.Y);
            var newSegment1Point2 = new Point((int)newSegment1.GetLine().End.X, (int)newSegment1.GetLine().End.Y);
            var newSegment2Point1 = new Point((int)newSegment2.GetLine().Start.X, (int)newSegment2.GetLine().Start.Y);
            var newSegment2Point2 = new Point((int)newSegment2.GetLine().End.X, (int)newSegment2.GetLine().End.Y);

            if (segment.GetId() == _head.GetId())
            {
                if (frontOfSegment.Equals(newSegment1Point1) || frontOfSegment.Equals(newSegment1Point2))
                {
                    _head = newSegment1;
                }
                else if (frontOfSegment.Equals(newSegment2Point1) || frontOfSegment.Equals(newSegment2Point2))
                {
                    _head = newSegment2;
                }
            }

            _segments.Remove(requestedSegment.GetId(), out var _);
            _segments.TryAdd(newSegment1.GetId(), newSegment1);
            _segments.TryAdd(newSegment2.GetId(), newSegment2);
        }
Пример #6
0
 public void Add(TrailSegment segment)
 {
     _segments.TryAdd(segment.GetId(), segment);
     _head = segment;
 }