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()); }
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))); }
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); } }
/// <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()); }
/// <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); }
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)); }
public static Vector3 EndPoint(this ICurve curve) { var d = curve.Domain()[1]; return(curve.PointAt(d)); }
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); }