public static double[] CurveBoundsDoubleArray(this ICurve curve)
        {
            var start = curve.Evaluate2(curve.Domain().Min(), 0).CastArray <double>().Take(3);
            var end   = curve.Evaluate2(curve.Domain().Max(), 0).CastArray <double>().Take(3);

            return(start.Concat(end).ToArray());
        }
Exemple #2
0
        public static PointParamWithRayProjection ClosestPointToRay(this ICurve curve, PointDirection3 ray, double tol = 1e-9)
        {
            var bound       = curve.Domain();
            int numOfRadius = 0;

            double[]  radius   = null;
            MathPoint location = null;

            var radiusResult       = curve.FindMinimumRadius();
            var domain             = new RangeDouble(curve.Domain());
            var tessTol            = radiusResult.Radius / 10;
            var closestPointOnEdge = Vector3.Zero;

            for (var i = 0; i < 1; i++)
            {
                var tessPoints = Sequences
                                 .LinSpace(domain.Min, domain.Max, 100)
                                 .Select(curve.PointParamAt).ToList();
                var edges = tessPoints.Buffer(2, 1).Where(buf => buf.Count == 2)
                            .ToList();

                var closestEdge
                    = edges
                      .Select(edge => new { edge, connection = MakeEdge(edge).ShortestEdgeJoining(ray, tol) })
                      .MinBy(o => o.connection.LengthSquared)[0];

                var a = closestEdge.edge[0].T;
                var b = closestEdge.edge[1].T;
                domain  = new RangeDouble(a, b);
                tessTol = tessTol / 10;
            }

            Func <Vector3, Vector3> projectOnRay = p => (p - ray.Point).ProjectOn(ray.Direction) + ray.Point;

            var solver = new BrentSearch(t =>
            {
                var p    = curve.PointAt(t);
                var proj = projectOnRay(p);
                return((p - proj).LengthSquared());
            }, domain.Min, domain.Max);

            solver.Minimize();
            var minT = solver.Solution;

            var pointParam = curve.PointParamAt(minT);

            return(new PointParamWithRayProjection(pointParam, projectOnRay(pointParam.Point)));
        }
Exemple #3
0
        public static MinimumRadiusResult FindMinimumRadius(this ICurve curve)
        {
            var bound = curve.Domain();

            int    numOfRadius    = 0;
            object radiusObject   = null;
            object locationObject = null;
            object tObject        = null;
            var    hasRadius      = curve.FindMinimumRadius(bound
                                                            , ref numOfRadius
                                                            , ref radiusObject
                                                            , ref locationObject
                                                            , ref tObject);

            if (hasRadius && numOfRadius > 0)
            {
                return(new MinimumRadiusResult
                           (t: ((double[])tObject)[0]
                           , radius: ((double[])radiusObject)[0]
                           , location: ((MathPoint)((object[])locationObject)[0]).ToVector3()));
            }
            else
            {
                return(null);
            }
        }
Exemple #4
0
        /// <summary>
        /// Approximation. Be carefull
        /// </summary>
        /// <param name="curve"></param>
        /// <param name="pointDistance"></param>
        /// <param name="flankHelixDomain"></param>
        /// <returns></returns>
        public static List <PointParam> GetPointsByLength
            (this ICurve curve
            , double pointDistance
            , DoubleRange?flankHelixDomain = null)
        {
            var length         = curve.Length();
            var numberOfPoints = (int)(length / pointDistance);

            var curveDomain = curve.Domain();
            var domain      = flankHelixDomain ?? new DoubleRange(curveDomain[0], curveDomain[1]);

            return(Sequences.LinSpace(domain.Min, domain.Max, numberOfPoints)
                   .Select(t => new PointParam(curve.PointAt(t), t))
                   .ToList());
        }
Exemple #5
0
        /// <summary>
        /// Should solve
        /// </summary>
        /// <param name="c"></param>
        /// <param name="t0"></param>
        /// <param name="distance"></param>
        /// <returns></returns>
        public static double PointAtDistanceFrom(this ICurve c, double t0, double distance)
        {
            Func <double, double> objFunc = t1 =>
            {
                var length3 = t0 < t1?c.GetLength3(t0, t1) : c.GetLength3(t1, t0);

                return(length3 - Math.Abs(distance));
            };
            var domain = c.Domain();
            var min    = distance < 0.0 ? 0.8 * domain[0] : t0;
            var max    = distance < 0.0 ? t0 : 1.2 * domain[1];
            var solver = new BrentSearch(objFunc, min, max);

            solver.FindRoot();
            var sol = solver.Solution;

            return(sol);
        }
Exemple #6
0
        public static EdgeDistance ClosestDistanceBetweenTwoCurves(IMathUtility m, ICurve curve0, ICurve curve1)
        {
            var curveDomain = curve1.Domain();

            var solver = new BrentSearch
                             (t =>
            {
                var pt = curve1.PointAt(t);
                return((curve0.ClosestPointOn(pt).Point - pt).Length());
            }
                             , curveDomain[0]
                             , curveDomain[1]
                             );

            solver.Minimize();
            var param = solver.Solution;

            var pt1  = curve1.PointAt(param);
            var pt0  = curve0.ClosestPointOn(pt1).Point;
            var edge = new Edge3(pt1, pt0);

            return(new EdgeDistance(edge, solver.Value));
        }
Exemple #7
0
        public static Vector3 EndPoint(this ICurve curve)
        {
            var d = curve.Domain()[1];

            return(curve.PointAt(d));
        }
Exemple #8
0
        public static List <Vector3> EndPoint(this ICurve curve, int derivatives)
        {
            var d = curve.Domain()[1];

            return(curve.PointAt(d, derivatives));
        }
        public static EdgeDistance ClosestDistanceBetweenTwoCurves(IMathUtility m,ICurve curve0, ICurve curve1)
        {
            var curveDomain = curve1.Domain();

            var solver = new BrentSearch
                (t =>
                {
                    var pt = curve1.PointAt(t);
                    return (curve0.ClosestPointOn(pt).Point - pt).Length();
                }
                , curveDomain[0]
                , curveDomain[1]
                );

            solver.Minimize();
            var param = solver.Solution;

            var pt1 = curve1.PointAt(param);
            var pt0 = curve0.ClosestPointOn(pt1).Point;
            var edge = new Edge3(pt1, pt0);
            return new EdgeDistance(edge, solver.Value);
        }