/// <summary>
 /// returns a parameter t such that the distance between curve[t] and a is minimal
 /// </summary>
 /// <param name="targetPoint"></param>
 /// <returns></returns>
 public double ClosestParameter(Point targetPoint)
 {
     return(curve.ClosestParameter(targetPoint));
 }
Пример #2
0
        public void ClosestParameterWithinBounds() {
#if GDI_DEBUG_VIEWER
            if (!MsaglTestBase.DontShowTheDebugViewer()) {
                DisplayGeometryGraph.SetShowFunctions();
            }
#endif
            var ellipse = CurveFactory.CreateEllipse(8, 10, new Point());
            var point = new Point(20, 1);
            var t = ellipse.ClosestParameter(point);
            var low = t - 1;
            var high = t + 1;
            var t1 = ellipse.ClosestParameterWithinBounds(point, low, high);
#if GDI_DEBUG_VIEWER
            if (!MsaglTestBase.DontShowTheDebugViewer()) {
                LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(100, 0.1, "black", ellipse),
                        new DebugCurve(100, 0.01, "brown", new LineSegment(ellipse[t], point)),
                        new DebugCurve(100, 0.01, "green", new LineSegment(ellipse[t1], point)));
            }
#endif
            var dist = point - ellipse[t];
            var dist1 = point - ellipse[t1];
            Assert.IsTrue(ApproximateComparer.Close(dist.Length, dist1.Length) && ApproximateComparer.Close(t, t1));
#if GDI_DEBUG_VIEWER
            if (!MsaglTestBase.DontShowTheDebugViewer()) {
                LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(ellipse), new DebugCurve("red", new LineSegment(point, ellipse[t])));
            }
#endif

            var curve = new Curve();
            curve.AddSegment(new LineSegment(new Point(-10, -10), new Point(10, -10)));
            curve.AddSegment(new Ellipse(0, Math.PI / 2, new Point(0, -10), new Point(10, 0), new Point(10, 0)));
            Curve.ContinueWithLineSegment(curve, new Point(20, 10));
            curve.AddSegment(new CubicBezierSegment(curve.End, new Point(20, 20), new Point(15, 25), new Point(10, 25)));
            Curve.ContinueWithLineSegment(curve, new Point(-10, 25));
            Point p = new Point(11, 0);
            t = curve.ClosestParameter(p);

#if GDI_DEBUG_VIEWER
            if (!MsaglTestBase.DontShowTheDebugViewer()) {
                LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(curve), new DebugCurve("red", new LineSegment(p, curve[t])));
            }
#endif
            t1 = curve.ClosestParameterWithinBounds(p, 1 + Math.PI / 4, 2);
#if GDI_DEBUG_VIEWER
            if (!MsaglTestBase.DontShowTheDebugViewer()) {
                LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(curve), new DebugCurve("red", new LineSegment(p, curve[t1])));
            }
#endif
            Assert.IsTrue(t1 < t);
            p = new Point(30, 30);
            t = curve.ClosestParameter(p);
            t1 = curve.ClosestParameterWithinBounds(p, t - 0.5, t + 0.5);
            Assert.IsTrue(t > 1 + Math.PI / 2 + 1 && t < 1 + Math.PI / 2 + 2);
            Assert.IsTrue(ApproximateComparer.Close(t, t1));

            var poly = new Polyline(new Point(0, 0), new Point(10, 0), new Point(20, 10));
            p = new Point(9, 9);
            const double l = 0.7;
            const double h = 1.3;
            t = poly.ClosestParameterWithinBounds(p, l, h);
#if GDI_DEBUG_VIEWER
            if (!MsaglTestBase.DontShowTheDebugViewer()) {
                LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(poly), new DebugCurve("red", new LineSegment(p, poly[t])));
            }
#endif
            var d = (p - poly[t]).Length;

            Assert.IsTrue(d <= (p - poly[l]).Length + ApproximateComparer.Tolerance && d < (p - poly[h]).Length + ApproximateComparer.Tolerance && d < (p - poly[(l + h) / 2]).Length + ApproximateComparer.Tolerance);
        }