/// <summary> /// Gets the point on the sketch plane that is intersected by a given ray /// </summary> /// <param name="sketchPlane">The sketch plane</param> /// <param name="lineRange">The ray information</param> /// <returns>The point on the plane of <paramref name="sketchPlane"/> that intersects the ray given by <paramref name="lineRange"/>, or <c>null</c> /// if no such point exists.</returns> public static Point3D?PointFromRay(this SketchPlane sketchPlane, LineRange lineRange) { Contract.Requires(sketchPlane != null); var plane = Plane3D.FromPointAndNormal(sketchPlane.Center, sketchPlane.Normal); var t = plane.IntersectLine(lineRange.Point1, lineRange.Point2); if (double.IsNaN(t)) { return(null); } else { return(MathUtils3D.Lerp(lineRange.Point1, lineRange.Point2, t)); } }
private NewConeViewModel.DragStartProximities GetDragStartProximity(LineRange startRay) { NewConeViewModel.DragStartProximities result = default(NewConeViewModel.DragStartProximities); bool success = false; var htParams = new RayHitTestParameters(startRay.Point1, startRay.Point2 - startRay.Point1); var topNode = this.VisualPathUp().TakeWhile(x => x is Visual3D).OfType <Visual3D>().Last(); VisualTreeHelper.HitTest( topNode, null, htResult => { if (htResult.VisualHit.VisualPathUp().Contains(cylinder)) { var htResult3d = htResult as RayMeshGeometry3DHitTestResult; var topPlane = Plane3D.FromPointAndNormal(viewModel.Center + 0.5 * viewModel.Length * viewModel.Axis, viewModel.Axis); var botPlane = Plane3D.FromPointAndNormal(viewModel.Center - 0.5 * viewModel.Length * viewModel.Axis, viewModel.Axis); var topDist = topPlane.DistanceFromPoint(htResult3d.PointHit); var botDist = botPlane.DistanceFromPoint(htResult3d.PointHit); if (topDist < botDist) { result = NewConeViewModel.DragStartProximities.Top; } else { result = NewConeViewModel.DragStartProximities.Bottom; } success = true; return(HitTestResultBehavior.Stop); } else { return(HitTestResultBehavior.Continue); } }, htParams); Debug.Assert(success == true); return(result); }