public override object MeasureRoot(RootInfo root, RootInfo parent = null) { // If parent == null, then this is a primary root and there is no emergence angle if (parent == null) { double angleMax = 30.0; Point start, end; if (angleMax > root.Spline.Length) { double newMinDistanceOffset = angleMax - root.Spline.Length; start = root.Spline.Start; end = root.Spline.GetPoint(root.Spline.GetPositionReference(root.Spline.Length)); } else { start = root.Spline.Start; end = root.Spline.GetPoint(root.Spline.GetPositionReference(angleMax)); } // Angle between horizontal and emergence vectors double angle = 90 - Vector.AngleBetween(new Vector(1, 0), end - start); return(Math.Round(angle > 180 ? angle - 360 : angle, 2)); } else { double angleMax = 30.0, angleMin = 10.0, parentAngleRadius = 20.0; Point start, end; if (angleMax > root.Spline.Length) { double newMinDistanceOffset = angleMax - root.Spline.Length; start = root.Spline.GetPoint(root.Spline.GetPositionReference(Math.Max(0.0, angleMin - newMinDistanceOffset))); end = root.Spline.GetPoint(root.Spline.GetPositionReference(root.Spline.Length)); } else { start = root.Spline.GetPoint(root.Spline.GetPositionReference(Math.Min(root.Spline.Length, angleMin))); end = root.Spline.GetPoint(root.Spline.GetPositionReference(angleMax)); } Vector rootVector = end - start; SampledSpline parentSpline = parent.Spline; double parentIntersectionDistance = parentSpline.GetLength(root.StartReference); Point parentStart = parentSpline.GetPoint(parentSpline.GetPositionReference(Math.Max(0.0, parentIntersectionDistance - parentAngleRadius))); Point parentEnd = parentSpline.GetPoint(parentSpline.GetPositionReference(Math.Min(parent.Spline.Length, parentIntersectionDistance + parentAngleRadius))); Vector parentVector = parentEnd - parentStart; return(Math.Round(Vector.AngleBetween(rootVector, parentVector), 2)); } }
public override object MeasureRoot(RootInfo root, RootInfo parent = null) { // If parent == null, then this is a primary root and there is no emergence angle if (parent == null) { return(""); } else { SampledSpline parentSpline = parent.Spline; double parentIntersectionDistance = parentSpline.GetLength(root.StartReference); return(Math.Round(parentIntersectionDistance, 2)); } }
public override object MeasureRoot(RootInfo root, RootInfo parent = null) { // If parent == null, then this is a primary root and there is no emergence angle if (parent == null) { return(""); } else { double parentAngleRadius = 10.0; SampledSpline parentSpline = parent.Spline; double parentIntersectionDistance = parentSpline.GetLength(root.StartReference); Point parentStart = parentSpline.GetPoint(parentSpline.GetPositionReference(Math.Max(0.0, parentIntersectionDistance - parentAngleRadius))); Point parentEnd = parentSpline.GetPoint(parentSpline.GetPositionReference(Math.Min(parent.Spline.Length, parentIntersectionDistance + parentAngleRadius))); Vector parentVector = parentEnd - parentStart; double angle = 90 - Vector.AngleBetween(new Vector(1, 0), parentEnd - parentStart); return(Math.Round(angle > 180 ? angle - 360 : angle, 2)); } }