Пример #1
0
        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));
            }
        }
Пример #2
0
        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));
            }
        }