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); } }
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; } }