示例#1
0
    /// <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);
    }
示例#2
0
        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);
        }