public static Point? GetNearest(Line2D l, Point p)
        {
            Point startPoint = new Point(l.StartPoint.X, l.StartPoint.Y);
            Point endPoint = new Point(l.EndPoint.X, l.EndPoint.Y);

            double x2 = endPoint.X;
            double y2 = endPoint.Y;
            Vector v = endPoint - startPoint;
            double dAB = v.GetMagnitude();
            double u = ((p.X - startPoint.X) * v.X + (p.Y - startPoint.Y) * v.Y) / dAB;
            double x = startPoint.X + u * v.X;
            double y = startPoint.Y + u * v.Y;

            if (x > Math.Min(startPoint.X, endPoint.X)
            && x < Math.Max(startPoint.X, endPoint.X)
            && y > Math.Min(startPoint.Y, endPoint.Y)
            && y < Math.Max(startPoint.Y, endPoint.Y))
            {
                return new Point(x, y);
            } else
            {
                return GetNearest(new List<Point>() { startPoint, endPoint }, p);
            }
        }
Beispiel #2
0
 private void AddLine_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
 {
     if (lastClick == null)
         lastClick = e.GetPosition(viewport.Viewport);
     else
     {
         //var p1Ray = HT.Viewport3DHelper.GetRay(viewport.Viewport, lastClick.Value);
         var p1 = HT.Viewport3DHelper.UnProject(viewport.Viewport, lastClick.Value, refPlane.Plane.Position, refPlane.Plane.Normal);
         var p = e.GetPosition(viewport.Viewport);
         //var p2Ray = HT.Viewport3DHelper.GetRay(viewport.Viewport, p);
         var p2 = HT.Viewport3DHelper.UnProject(viewport.Viewport, p, refPlane.Plane.Position, refPlane.Plane.Normal);
         var line2d = new Line2D(sketch,p1.Value,p2.Value);
         sketch.Entities.Add(line2d);
         lastClick = null;
         viewport.Viewport.MouseLeftButtonUp -= AddLine_MouseLeftButtonUp;
         activeControl.IsChecked = false; activeControl = null;
     }
 }