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