public override Task <Tuple <bool, double> > CheckPanelIntersectionAsync(bool targetLinkState, Vector3D linkDirection) { if (targetLinkState) { var ptPanel = ColliderExtensions.GetPanel(); if (ptPanel.HasValue) { if (Points.Count > 0) { var zDir = GetPanelFaceDirectionForLinkImpact(linkDirection); var retPanel = ptPanel.Value; var panelMin = retPanel.Location.ToVector3(); var panelMax = panelMin + new Vector3((float)retPanel.SizeX, (float)retPanel.SizeY, (float)retPanel.SizeZ); var panel = new Box3(panelMin, panelMax); var tt = TotalTransformation.Value; var planePoint = panelMax; var tasks = new List <Task <Tuple <bool, double> > >(); foreach (var p in Points) { var point = p; tasks.Add(Task.Run(() => { var pp = tt.Transform(point); var ray = new Ray3D(pp.ToVector3(), linkDirection.ToVector3()); if (ray.PlaneIntersection(planePoint, zDir.ToVector3(), out Vector3 intersect) && panel.Intersects(new Sphere3(intersect, 0.001f))) { var pi = intersect.ToPoint3D(); var intersectValue = Vector3D.DotProduct(pi - pp, linkDirection); return(new Tuple <bool, double>(true, intersectValue)); } else { return(new Tuple <bool, double>(false, 0.0)); } })); } return(Task.WhenAll(tasks).ContinueWith((t) => t.Result.FirstOrDefault(r => r.Item1) ?? new Tuple <bool, double>(false, 0.0))); } else { throw new ArgumentOutOfRangeException("The number of points of collider must be greater than 0!"); } } } return(Task.FromResult(new Tuple <bool, double>(false, 0.0))); }
public override Tuple <bool, double> CheckPanelIntersection(bool targetLinkState, Vector3D linkDirection) { bool result = false; double intersectValue = 0.0; var zDir = new Vector3D(0.0, 0.0, 1.0); if (targetLinkState) { var ptPanel = ColliderExtensions.GetPanel(); if (ptPanel.HasValue) { var retPanel = ptPanel.Value; var panelMin = retPanel.Location.ToVector3(); var panelMax = panelMin + new Vector3((float)retPanel.SizeX, (float)retPanel.SizeY, (float)retPanel.SizeZ); var panel = new Box3(panelMin, panelMax); var tt = TotalTransformation.Value; var planePoint = panelMax; foreach (var p in Points) { var pp = tt.Transform(p); var ray = new Ray3D(pp.ToVector3(), linkDirection.ToVector3()); if (ray.PlaneIntersection(planePoint, zDir.ToVector3(), out Vector3 intersect) && panel.Intersects(new Sphere3(intersect, 0.001f))) { var pi = intersect.ToPoint3D(); result = true; intersectValue = Vector3D.DotProduct(pi - pp, linkDirection); break; } } } } return(new Tuple <bool, double>(result, intersectValue)); }