108 lines
3.8 KiB
C#
108 lines
3.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace TrajectoryPlanningVisualization;
|
|
|
|
public sealed class VisualizationPolyline
|
|
{
|
|
public VisualizationPolyline(string id, string legendChinese, string kind, VisualizationLineStyle lineStyle,
|
|
IReadOnlyList<VisualizationPoint> points)
|
|
{
|
|
Id = VisualizationContract.RequireText(id, nameof(id));
|
|
LegendChinese = VisualizationContract.RequireText(legendChinese, nameof(legendChinese));
|
|
Kind = VisualizationContract.RequireText(kind, nameof(kind));
|
|
LineStyle = lineStyle;
|
|
Points = VisualizationContract.Copy(points, nameof(points));
|
|
}
|
|
|
|
public string Id { get; }
|
|
public string LegendChinese { get; }
|
|
public string Kind { get; }
|
|
public VisualizationLineStyle LineStyle { get; }
|
|
public IReadOnlyList<VisualizationPoint> Points { get; }
|
|
}
|
|
|
|
public sealed class VisualizationMarker
|
|
{
|
|
public VisualizationMarker(string id, string kind, string labelChinese, VisualizationPoint position)
|
|
{
|
|
Id = VisualizationContract.RequireText(id, nameof(id));
|
|
Kind = VisualizationContract.RequireText(kind, nameof(kind));
|
|
LabelChinese = VisualizationContract.RequireText(labelChinese, nameof(labelChinese));
|
|
Position = position ?? throw new ArgumentNullException(nameof(position));
|
|
}
|
|
|
|
public string Id { get; }
|
|
public string Kind { get; }
|
|
public string LabelChinese { get; }
|
|
public VisualizationPoint Position { get; }
|
|
}
|
|
|
|
public sealed class VisualizationDirectionSegment
|
|
{
|
|
public VisualizationDirectionSegment(int segmentIndex, string direction, bool startsAtGearSwitch,
|
|
bool endsAtGearSwitch, IReadOnlyList<VisualizationPoint> points)
|
|
{
|
|
SegmentIndex = segmentIndex;
|
|
Direction = VisualizationContract.RequireText(direction, nameof(direction));
|
|
StartsAtGearSwitch = startsAtGearSwitch;
|
|
EndsAtGearSwitch = endsAtGearSwitch;
|
|
Points = VisualizationContract.Copy(points, nameof(points));
|
|
}
|
|
|
|
public int SegmentIndex { get; }
|
|
public string Direction { get; }
|
|
public bool StartsAtGearSwitch { get; }
|
|
public bool EndsAtGearSwitch { get; }
|
|
public IReadOnlyList<VisualizationPoint> Points { get; }
|
|
}
|
|
|
|
public sealed class VisualizationOccupancyGrid
|
|
{
|
|
public VisualizationOccupancyGrid(VisualizationBounds bounds, double resolutionMeters, int rows, int columns,
|
|
byte[] occupancyBits)
|
|
{
|
|
Bounds = bounds ?? throw new ArgumentNullException(nameof(bounds));
|
|
VisualizationContract.RequireFinite(resolutionMeters, nameof(resolutionMeters));
|
|
if (resolutionMeters <= 0d)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(resolutionMeters));
|
|
}
|
|
|
|
if (rows <= 0)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(rows));
|
|
}
|
|
|
|
if (columns <= 0)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(columns));
|
|
}
|
|
|
|
if (occupancyBits == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(occupancyBits));
|
|
}
|
|
|
|
long cellCount = (long)rows * columns;
|
|
long requiredByteCount = (cellCount + 7L) / 8L;
|
|
if (occupancyBits.Length != requiredByteCount)
|
|
{
|
|
throw new ArgumentException("Occupancy bit count does not match the grid dimensions.", nameof(occupancyBits));
|
|
}
|
|
|
|
var bitsCopy = new byte[occupancyBits.Length];
|
|
Buffer.BlockCopy(occupancyBits, 0, bitsCopy, 0, bitsCopy.Length);
|
|
ResolutionMeters = resolutionMeters;
|
|
Rows = rows;
|
|
Columns = columns;
|
|
OccupancyBitsBase64 = Convert.ToBase64String(bitsCopy);
|
|
}
|
|
|
|
public VisualizationBounds Bounds { get; }
|
|
public double ResolutionMeters { get; }
|
|
public int Rows { get; }
|
|
public int Columns { get; }
|
|
public string OccupancyBitsBase64 { get; }
|
|
}
|