Ejemplo n.º 1
0
        /// <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));
            }
        }
Ejemplo n.º 2
0
        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);
        }