Beispiel #1
0
        private Tuple <int?, RayHitTestParameters> GetMouseOver(MouseEventArgs e)
        {
            const double MAXHITDISTANCE = .035;

            // Fire a ray from the mouse point
            Point mousePoint = e.GetPosition(grdViewPort);
            var   ray        = UtilityWPF.RayFromViewportPoint(_camera, _viewport, mousePoint);

            var hit = _sketches.Sketches.
                      Select((o, i) => new
            {
                Index    = i,
                Position = o.Position,
                Dot      = Vector3D.DotProduct(ray.Direction, o.Position - ray.Origin)
            }).
                      Where(o => o.Dot > 0). // throwing out points that are behind the camera
                      Select(o => new
            {
                o.Index,
                o.Position,
                Distance = Math3D.GetClosestDistance_Line_Point(ray.Origin, ray.Direction, o.Position)
            }).
                      Where(o => o.Distance <= MAXHITDISTANCE).
                      OrderBy(o => (o.Position - ray.Origin).LengthSquared).
                      FirstOrDefault();

            // Sooooon :)
            //hit?.Index;
            int?hitIndex = hit == null ? (int?)null : hit.Index;

            return(Tuple.Create(hitIndex, ray));
        }
Beispiel #2
0
        private void ShowCircles()
        {
            _circleVisuals = null;
            grdCircles.Children.Clear();

            if (_triangles == null)
            {
                return;
            }

            _circleVisuals = new Ellipse[_triangles.Length];

            for (int cntr = 0; cntr < _circleVisuals.Length; cntr++)
            {
                _circleVisuals[cntr] = new Ellipse();

                Point3D center = _triangles[cntr].Triangle.GetCenterPoint();
                double  radius = Math1D.Min(
                    Math3D.GetClosestDistance_Line_Point(_triangles[cntr].Triangle.Point0, _triangles[cntr].Triangle.Point1 - _triangles[cntr].Triangle.Point0, center),
                    Math3D.GetClosestDistance_Line_Point(_triangles[cntr].Triangle.Point1, _triangles[cntr].Triangle.Point2 - _triangles[cntr].Triangle.Point1, center),
                    Math3D.GetClosestDistance_Line_Point(_triangles[cntr].Triangle.Point2, _triangles[cntr].Triangle.Point0 - _triangles[cntr].Triangle.Point2, center));

                //  Min is too small, but avg has overlap.  Getting an inscribed circle would be the right way, but this is just a quick tester
                //double radius = new double[] {
                //    Math3D.GetClosestDistanceBetweenPointAndLine(_triangles[cntr].Triangle.Point0, _triangles[cntr].Triangle.Point1 - _triangles[cntr].Triangle.Point0, center),
                //    Math3D.GetClosestDistanceBetweenPointAndLine(_triangles[cntr].Triangle.Point1, _triangles[cntr].Triangle.Point2 - _triangles[cntr].Triangle.Point1, center),
                //    Math3D.GetClosestDistanceBetweenPointAndLine(_triangles[cntr].Triangle.Point2, _triangles[cntr].Triangle.Point0 - _triangles[cntr].Triangle.Point2, center) }.Average();

                _circleVisuals[cntr].HorizontalAlignment = HorizontalAlignment.Left;
                _circleVisuals[cntr].VerticalAlignment   = VerticalAlignment.Top;
                _circleVisuals[cntr].Width  = radius * 2d;
                _circleVisuals[cntr].Height = radius * 2d;
                _circleVisuals[cntr].Margin = new Thickness(center.X - radius, center.Y - radius, 0, 0);

                _circleVisuals[cntr].Fill = Brushes.Transparent;

                grdCircles.Children.Add(_circleVisuals[cntr]);
            }

            grdTriangles_SizeChanged(this, null);
        }