private IBody2 ConvertToTempIfNeeded(IBody2 body) { if (body.IsTemporaryBody()) { return(body); } else { return(body.ICopy()); } }
public CylinderParams GetBoundingCylinder(IBody2 body, double[] dir) { double[] xAxis = new double[] { 1, 0, 0 }; double[] yAxis = new double[] { 0, 1, 0 }; double[] zAxis = new double[] { 0, 0, 1 }; bool isAligned = m_MathHelper.ArrayEqual(dir, yAxis); IMathTransform alignTransform = null; if (!isAligned) { alignTransform = m_MathHelper.GetTransformBetweenVectorsAroundPoint( dir, yAxis, new double[] { 0, 0, 0 }); IBody2 bodyCopy = body.ICopy(); bodyCopy.ApplyTransform(alignTransform as MathTransform); body = bodyCopy; } double[] rootPt; double[] endPt; GetExtremePoints(body, yAxis, out rootPt, out endPt); double height = Math.Abs(endPt[1] - rootPt[1]); dir = new double[] { 0, endPt[1] - rootPt[1], 0 }; List <double[]> perPoints = GetPerimeterPoints(body, xAxis, zAxis); List <Point> points = new List <Point>(); foreach (double[] pt in perPoints) { points.Add(new Point(pt[0], pt[2])); } Circle cir = SmallestEnclosingCircle.MakeCircle(points); double[] circCenter = new double[] { cir.c.x, rootPt[1], cir.c.y }; if (!isAligned) { circCenter = m_MathHelper.TransformPoint(circCenter, alignTransform.IInverse()); dir = m_MathHelper.TransformVector(dir, alignTransform.IInverse()); } double radius = cir.r; return(new CylinderParams(height, circCenter, dir, radius)); }
private void CreateBodyForPreview(int trackCookie, ref List <IEdge> edges, ref IBody2 body) { var inputEdges = edges; try { for (int i = 0; i < inputEdges.Count; i++) { var status = (swTrackingIDError_e)inputEdges[i].SetTrackingID(trackCookie, i); if (status != swTrackingIDError_e.swTrackingIDError_NoError) { Logger.Log($"Failed to set tracking id: {status}"); throw new UserErrorException("Failed to track entity"); } } body = body.ICopy(); var copiedEdges = body.GetEdges() as object[]; if (copiedEdges != null) { var trackedEdges = copiedEdges.Where(e => { object trackIds; if ((e as IEdge).GetTrackingIDs(trackCookie, out trackIds) == (int)swTrackingIDError_e.swTrackingIDError_NoError) { if (trackIds != null && (trackIds as int[]).Length == 1) { if ((trackIds as int[]).First() < inputEdges.Count) { return(true); } } return(true); } return(false); }); if (trackedEdges.Count() == inputEdges.Count) { edges = trackedEdges.Cast <IEdge>().ToList(); } else { throw new UserErrorException("Failed to track entity"); } } } catch (Exception ex) { Logger.Log(ex); throw; } finally { inputEdges.ForEach(e => { var status = (swTrackingIDError_e)e.RemoveTrackingID(trackCookie); if (status != swTrackingIDError_e.swTrackingIDError_NoError) { Logger.Log($"Failed to remove tracking id: {status}"); throw new UserErrorException("Failed to track entity"); } }); } }