/// <summary> /// Creates a collection of evenly spaced points, ordered by a common distance value to the end of the piecewise polynomial. /// </summary> /// <param name="polynomials">QuadraticPolynomial[numberLanes + 1,numberAnchors - 1]</param> /// <returns>ValuedPoint[numberLanes + 1][numberPoints]</returns> public static ValuedPoint[][] GetEvenlySpacedPoints(QuadraticPolynomial[,] polynomials) { const double vertexSpacing = 3.0; var evenlySpacedPoints = new ValuedPoint[polynomials.GetLength(0)][]; for (int i = 0; i < polynomials.GetLength(0); i++) { var localList = new List <ValuedPoint> { new ValuedPoint { Value = 0, Distance = 0, Point = polynomials[i, 0].Calculate(0) } }; int polyIndexCheck = 0; double accumulatedRoot = 0; double currentPolyLength = 0; double currentSpacingLength = 0; double currentTotalLength = 0; double currentRoot = 0; while (polyIndexCheck < polynomials.GetLength(1)) { double currentArcLength = polynomials[i, polyIndexCheck].ArcLength(0, 1); while (currentPolyLength < currentArcLength) { currentRoot += 0.01; double addedDistance = polynomials[i, polyIndexCheck].ArcLength(currentRoot - 0.01f, currentRoot); currentSpacingLength += addedDistance; currentPolyLength += addedDistance; currentTotalLength += addedDistance; accumulatedRoot += 0.01; if (currentSpacingLength > vertexSpacing) { localList.Add(new ValuedPoint { Value = accumulatedRoot / polynomials.GetLength(1), Distance = currentTotalLength, Point = polynomials[i, polyIndexCheck].Calculate(currentRoot) }); currentSpacingLength = 0; } } currentPolyLength = 0; currentRoot = 0; polyIndexCheck++; } localList.Add(new ValuedPoint { Value = 1, Distance = currentTotalLength, Point = polynomials[i, polynomials.GetLength(1) - 1].Calculate(1) }); evenlySpacedPoints[i] = localList.ToArray(); } return(evenlySpacedPoints); }
private void DrawValuedPoint(ValuedPoint point) { var brush = GetBrush(point); var symbol = GetSymbol(point); var textFont = new Font("Arial", 6); var textBrush = new SolidBrush(Color.Black); var screenPoint = MapToScreen(point.X, point.Y); graphics.DrawString(symbol.Char.ToString(), symbol.Font, brush, screenPoint, symbol.Format); graphics.DrawString($"{point.Value:0.00}", textFont, textBrush, screenPoint); }