public MarkGeometrySpline(Spline spline) : base() { FitPoints = spline.FitPoints.ConvertAll(x => new MarkGeometryPoint(x)); ControlPoints = new List <SplineVertex>(spline.ControlPoints).ConvertAll(x => new MarkGeometryPoint(x.Position));; Knots = spline.Knots.ToList(); IsPeriodic = spline.IsPeriodic; IsClosed = spline.IsClosed; Degree = spline.Degree; // TODO : Remove var polyline = spline.ToPolyline(spline.ControlPoints.Count * 5); Points.AddRange( polyline.Vertexes.Select(v => new MarkGeometryPoint(v.Position)) ); if ( polyline.IsClosed && GeometricArithmeticModule.Compare(StartPoint, EndPoint, ClosureTolerance) != 0) { Points.Add((MarkGeometryPoint)StartPoint.Clone()); } // END Remove Update(); }
public GeneralizedDrawingPrimitive(CgmFile container, int id, CgmPoint[] points, string data) : this(container) { Identifier = id; Points.AddRange(points); DataRecord = data; }
public void Perform() { DataPoint[] pts = this.Points.OrderBy(p => p.X).ToArray(); this.Points.Clear(); Points.AddRange(pts); LineStyle = (LineStyle)(int)SeriesLineStyle; }
public Rectangle(Point point1, Point point2, Point point3, Point point4) : base("Rectangle", point1) { Points.AddRange(new List <Point> { point2, point3, point4 }); }
public void AddVerticle(Point[] p, bool drawLines = false) { Points.AddRange(p); if (drawLines) { DrawPolygon(); } }
protected void SetValues(int splineOrder, IEnumerable <CgmPoint> points, IEnumerable <double> knots, double start, double end) { SplineOrder = splineOrder; Points.AddRange(points); Knots.AddRange(knots); StartValue = start; EndValue = end; }
public MarkGeometryPath(IEnumerable <MarkGeometryPoint> points) : base() { Points.AddRange(points); // TODO : Calculate centroid CentrePoint = new MarkGeometryPoint(); Update(); }
public RegionMarker(GeographicalRegionViewModel region) : base(Enumerable.Empty <PointLatLng>()) { Region = region; Points.AddRange(region.Coordinates.Select(coord => new PointLatLng(coord.Item1, coord.Item2))); Position = Points[0]; _regionPoints = new List <RegionPointMarker>(); _regionMidpoints = new List <RegionPointMarker>(); }
public wBezierSpline(wPoint A, wPoint B, wPoint C, wPoint D) { Spans.Add(new wBezierSpans(0, 1, 2, 3)); Points.AddRange(new List <wPoint>() { A, B, C, D }); Segments.Add(new wCubicBezier(A, B, C, D)); }
public void RecalculateValues(List <SimpleDateValue> currentCurrencyValues) { if (Display) { var emaPoints = EMA.CalculateEMA(currentCurrencyValues, Period); Points.Clear(); Points.AddRange(emaPoints); } }
public MarkGeometryPath(params MarkGeometryPoint[] points) : base() { Points.AddRange(points); // TODO : Calculate centroid CentrePoint = new MarkGeometryPoint(); Update(); }
public MarkGeometryPath(MarkGeometryCircle circle) : base() { Points.AddRange((MarkGeometryPoint[])circle); CentrePoint = circle.CentrePoint; Fill = circle.Fill; Stroke = circle.Stroke; Update(); }
public Line(Color c, bool auto = true) : base(c) { Point first = new Point(0, FormMain.BlockSize); Point last = new Point(FormMain.BlockSize, 0); if (auto) { Points.AddRange(new Point[] { first, last }); } }
public MarkGeometryPath(MarkGeometryArc arc) : base() { Points.AddRange((MarkGeometryPoint[])arc); CentrePoint = arc.CentrePoint; Fill = arc.Fill; Stroke = arc.Stroke; Update(); }
public MarkGeometryPath(MarkGeometryCircle circle, double minimumFacetLength) : base() { int nSegments = (int)Math.Floor(GeometricArithmeticModule.CalculatePerimeter(circle) / minimumFacetLength); Points.AddRange(GeometricArithmeticModule.Explode(circle, nSegments + 1)); CentrePoint = circle.CentrePoint; Update(); }
public KeyFrame(uint id, double fx, double fy, double cx, double cy, int points, Frame frame) { Id = id; Fx = fx; Fy = fy; Cx = cx; Cy = cy; Frame = frame; Points.AddRange(Enumerable.Range(1, points).Select(c => (Point)null)); }
public RightTriangle(Color c, bool auto = false) : base(c) { if (auto) { Point top = new Point(0, 0); Point left = new Point(0, FormMain.BlockSize); Point right = new Point(FormMain.BlockSize, FormMain.BlockSize); Points.AddRange(new Point[] { top, left, right }); } }
public AsciiPoints(string path) { try { Points.AddRange(File.ReadLines(path).Select(line => new Point(new Vect3(line.Split(' ').Select(Double.Parse).ToList()))).ToList()); } catch (Exception) { throw; } }
public Tetrahedron(Color c, bool auto = false) : base(c) { if (auto) { Point top = new Point(FormMain.BlockSize / 2, 0); Point left = new Point(0, FormMain.BlockSize); Point bottom = new Point(FormMain.BlockSize, FormMain.BlockSize); Point right = new Point(FormMain.BlockSize, FormMain.BlockSize / 2); Points.AddRange(new Point[] { top, left, bottom, right }); } }
public wLine(wPoint StartPoint, wVector Direction, double Length) { Points.AddRange(new List <wPoint>() { Start, End }); Indices.AddRange(new List <int>() { 0, 1 }); }
public wCatmullRom() { Points.AddRange(new List <wPoint>() { StartPoint, StartControlPoint, EndControlPoint, EndPoint }); Indices.AddRange(new List <int>() { 0, 1, 2, 3 }); }
public wQuadraticBezier() { Points.AddRange(new List <wPoint>() { StartPoint, StartControlPoint, EndControlPoint, EndPoint }); Indices.AddRange(new List <int>() { 0, 1, 2, 3 }); }
public wLine() { Points.AddRange(new List <wPoint>() { Start, End }); Indices.AddRange(new List <int>() { 0, 1 }); }
public void DrawPoints() { int count = _BlockingCollection.Count; bool clear = false; List <DataPoint> points = new List <DataPoint>(); for (int i = 0; i < count; i++) { DataPoint point = _BlockingCollection.Take(); if (point.Y > _MaxY) { _MaxY = point.Y; } else if (point.Y < _MinY) { _MinY = point.Y; } points.Add(point); if (point.X == 0) { clear = true; points.Clear(); _MinY = 0; _MaxY = 0; } } if (clear || points.Count > 0) { Parent.Parent.SyncContext.Post(o => { if (clear) { Points.Clear(); } Points.AddRange(points); if (Points.Count > 0) { double max = Math.Max(Math.Abs(_MinY), Math.Abs(_MaxY)) * 1.05; int pow = (int)Math.Ceiling(Math.Log(max) / Math.Log(2)); double newMaxY = Math.Max(Math.Pow(2, pow), 0.25); if (MaximumY != newMaxY) { MaximumY = newMaxY; MinimumY = -newMaxY; MajorStepY = newMaxY / 2; MinorStepY = newMaxY / (2 * 5); } } }, null); } }
public Polyline(Point origin, Point offset) { var rect = new Rectangle(origin, new Size(offset.X, offset.Y)); var points = new List <PointF> { new PointF(rect.Left, rect.Top), new PointF(rect.Left + rect.Width, rect.Top + rect.Height) }; Points.AddRange(points); }
public void AddSpan(wPoint A, wPoint B, wPoint C, wPoint D) { int i = Points.Count - 1; Points.AddRange(new List <wPoint>() { B, C, D }); Spans.Add(new wBezierSpans(i, i + 1, i + 2, i + 3)); Segments.Add(new wCubicBezier(A, B, C, D)); }
public Rectangle(Color c, bool auto = false) : base(c) { if (auto) { Point lt = new Point(0, 0); Point rt = new Point(W, 0); Point lb = new Point(0, H); Point rb = new Point(W, H); Points.AddRange(new Point[] { lt, rt, rb, lb }); pen.DashStyle = DashStyle.Dash; } }
public EquilateralTriangle(Color c, bool auto = false) : base(c) { if (auto) { Point top = new Point(FormMain.BlockSize / 2, 0); //h*ctg(60*) половина стороны треугольника int deltaX = (int)Math.Round(FormMain.BlockSize / Math.Sqrt(3)); Point left = new Point(FormMain.BlockSize / 2 - deltaX, FormMain.BlockSize); Point right = new Point(FormMain.BlockSize / 2 + deltaX, FormMain.BlockSize); Points.AddRange(new Point[] { top, left, right }); } }
public MarkGeometryPath(MarkGeometryArc arc, double minimumFacetLength) : base() { int nSegments = (int)Math.Floor(GeometricArithmeticModule.CalculatePerimeter(arc) / minimumFacetLength); Points.AddRange((MarkGeometryPoint[])arc); CentrePoint = arc.CentrePoint; Fill = arc.Fill; Stroke = arc.Stroke; Update(); }
public wLine(wPoint StartPoint, wPoint EndPoint) { Start = StartPoint; End = EndPoint; Points.AddRange(new List <wPoint>() { Start, End }); Indices.AddRange(new List <int>() { 0, 1 }); Direction = new wVector(Start, End); }
public Moves Do(ACar car, Points pts) { // Проверка что данный путь был выбран if (_selectThisTick + 1 != MyStrategy.world.Tick) _lastSuccessStack = null; Self = car.Clone(); if (_lastCall == LastSuccess) LastSuccess = _lastCall; for (var t = 0; t < MyStrategy.world.Tick - _lastCall && _lastSuccessStack != null && _lastSuccessStack.Count > 0; t++) { _lastSuccessStack[0].Times--; _lastSuccessStack.Normalize(); } if (_lastSuccessStack != null && (_lastSuccessStack.Count == 0 || _useDist2 && _lastSuccessStack.ComputeTime() < 30)) _lastSuccessStack = null; _lastCall = MyStrategy.world.Tick; /* * Количество бонусов на расстоянии 0.5t * Если изменилось - пересчитывать сильно */ var bonusesCount05 = MyStrategy.Bonuses .Count(bonus => Self.GetDistanceTo(bonus) < Const.TileSize / 2); /* * Количество бонусов на расстоянии 2t * Если изменилось - чуть нужно пересчитать */ var bonusesCount2 = MyStrategy.Bonuses .Count( bonus => Self.GetDistanceTo(bonus) < Const.TileSize*2 && MyStrategy.CellDistance(Self, bonus) <= 2); // Если был success на прошлом тике, то продолжаем. Или каждые _interval тиков. if (Const.Game.InitialFreezeDurationTicks < MyStrategy.world.Tick && bonusesCount05 == _bonusesCount05 && LastSuccess < MyStrategy.world.Tick - 1 && (MyStrategy.world.Tick - (LastSuccess + 1))%_interval != 0) { _validateLastSuccessStack(); return _lastSuccessStack; } /* * Смотрим на шины, которые на расстоянии не более 6 тайлов */ var prevProj = _projCandidates; _projCandidates = MyStrategy.Tires .Where( proj => Self.GetDistanceTo(proj[0]) <= Const.TileSize * 6 && MyStrategy.CellDistance(Self, proj[0]) <= 6) .ToArray(); var extended = MyStrategy.ExtendWaySegments(pts, 50); _bruteWayPoints = extended.GetRange(0, Math.Min(_waypointsCount, extended.Count)).ToArray(); if (LastStageMove.IsUseNitro && _turnsCount(_bruteWayPoints) > 1) return null; #if DEBUG var bruteWayPoints = new Points(); bruteWayPoints.AddRange(_bruteWayPoints); Visualizer.SegmentsDrawQueue.Add(new object[]{ Brushes.Brown, bruteWayPoints, 0.0 }); #endif _needDist = Const.TileSize*0.5 - 3; _needDist2 = Const.TileSize - 3; _turnTo = _bruteWayPoints[_bruteWayPoints.Length - 1]; _turnTo2 = _bruteWayPoints[Math.Min(_bruteWayPoints.Length - 1, (int)(_bruteWayPoints.Length * 0.83))]; #if DEBUG Visualizer.CircleFillQueue.Add(new Tuple<Brush, ACircularUnit>(Brushes.OrangeRed, new ACircularUnit { X = _turnTo.X, Y = _turnTo.Y, Radius = 20})); Visualizer.CircleFillQueue.Add(new Tuple<Brush, ACircularUnit>(Brushes.Orange, new ACircularUnit { X = _turnTo2.X, Y = _turnTo2.Y, Radius = 20 })); #endif _patterns = Patterns.Select(pt => new PathPattern { From = pt.From, To = pt.To, Step = pt.Step, Move = pt.Move.Clone() }).ToArray(); foreach (var p in _patterns) { if (p.Move.WheelTurn is TurnPattern) { var turnPattern = p.Move.WheelTurn as TurnPattern; if (turnPattern.Pattern == TurnPatternType.ToNext) p.Move.WheelTurn = Self.GetAngleTo(_turnTo) < 0 ? -1 : 1; else if (turnPattern.Pattern == TurnPatternType.FromNext) p.Move.WheelTurn = Self.GetAngleTo(_turnTo) < 0 ? 1 : -1; } } _movesStack = new Moves(); _bestMovesStack = new Moves(); _bestTime = MyStrategy.Infinity; _bestImportance = 0; /* * Смотрим на бонусы, которые на расстоянии не более 4t * TODO: уменьшить приоритет бонусов, которые может быть возьмет другой (в.т.ч тиммейт) */ _bonusCandidates = MyStrategy.Bonuses .Where( bonus => MyStrategy.world.Tick > 270 && // Не смотреть на бонусы при старте!!! Self.GetDistanceTo(bonus) <= Const.TileSize * 4 && MyStrategy.CellDistance(Self, bonus) <= 4 ) .ToArray(); /* * Смотрим на лужи, которые на расстоянии не более 5 тайлов */ var prevSlicks = _slickCandidates; _slickCandidates = MyStrategy.OilSlicks .Where( slick => Self.GetDistanceTo(slick) <= Const.TileSize*5 && MyStrategy.CellDistance(Self, slick) <= 5 ) .ToArray(); /* * Пытаться объехать тех, которые * - Крашнулись * - Убиты * - Двигатель меньше чем на 0.5 мощности * - Двигаются по встречной * * - Если у меня нитро, или будет нитро * * - Своих */ var prevCars = _carCandidates; _carCandidates = MyStrategy.Others .Where(opp => opp[0].GetDistanceTo(Self) < Const.TileSize*9) .Where( opp => opp[0].Original.IsTeammate || MyStrategy.IsCrashed(opp[0].Original) || !DurabilityObserver.IsActive(opp[0].Original) || opp[0].EnginePower < 0.5 || Self.RemainingNitroTicks > 0 || Math.Abs(Geom.GetAngleBetween(Self.Speed, opp[0].Speed)) > Math.PI / 2 ) .Where(opp => MyStrategy.CellDistance(Self, opp[0]) <= 9) // 9 - потому что он может ехать по встречке .ToArray(); if (_cache != null) { for (var k = 0; k < _patterns.Length; k++) { var range = (prevSlicks == null || prevCars == null || prevProj == null || _bonusesCount2 != bonusesCount2 || prevSlicks.Length != _slickCandidates.Length || prevCars.Length != _carCandidates.Length || prevProj.Length != _projCandidates.Length) ? (k == 0 ? 6 : 4) : (k == 0 ? 6 : 2); if (_bonusesCount05 != bonusesCount05 || Special && k == 0) range = 10; _patterns[k].From = Math.Max(0, _cache[k].Times - range); _patterns[k].To = Math.Min(_patterns[k].To * 9 / 7, _cache[k].Times + range); _patterns[k].Step = 2; } } _bonusesCount05 = bonusesCount05; _bonusesCount2 = bonusesCount2; var wayPointRequired = false; for(var i = _bruteWayPoints.Length - 1; i >= 0; i--) { if (_bruteWayPoints[i].GetDistanceTo2(_turnTo) < _needDist*_needDist) { for (var j = 0; j < i; j++) wayPointRequired |= MyStrategy.GetNextWayPoint(Self.Original).Equals(MyStrategy.GetCell(_bruteWayPoints[j])); break; } } _doRecursive(Self, 0, new PassedInfo { WayPoint = !wayPointRequired }); _cache = null; if (_bestTime == MyStrategy.Infinity) return _lastSuccessStack; if (_bestMovesStack.ComputeTime() != _bestTime) throw new Exception("ComputeTime != BestTime"); LastSuccess = MyStrategy.world.Tick; _cache = _bestMovesStack.Clone(); if (_maxTicksInfo == null) _maxTicksInfo = new int[_bestMovesStack.Count]; for (var i = 0; i < _maxTicksInfo.Length; i++) _maxTicksInfo[i] = Math.Max(_maxTicksInfo[i], _bestMovesStack[i].Times); _bestMovesStack.Normalize(); _lastSuccessStack = _bestMovesStack.Clone(); return _bestMovesStack; }
public static void DrawWay(Car self, Moves stack, Brush brush, double width) { if (stack == null) return; var pts = new Points(); pts.AddRange(MyStrategy.GetCarPath(self, stack).Select(car => new Point(car))); SegmentsDrawQueue.Add(new object[] { brush, pts, width }); }