File: System.Activities.Presentation\System\Activities\Presentation\FreeFormEditing\DesignerGeometryHelper.cs
Project: ndp\cdf\src\NetFx40\Tools\System.Activities.Presentation.csproj (System.Activities.Presentation)
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
 
namespace System.Activities.Presentation.FreeFormEditing
{
    using System;
    using System.Windows;
    using System.Windows.Media;
 
    internal static class DesignerGeometryHelper
    {
        public const double EPS = 1e-6;
 
        public static double ManhattanDistanceBetweenPoints(Point begin, Point end)
        {
            return Math.Abs(begin.X - end.X) + Math.Abs(begin.Y - end.Y);
        }
 
        public static double DistanceBetweenPoints(Point point1, Point point2)
        {
            return Math.Sqrt(Math.Pow(point2.X - point1.X, 2) + Math.Pow(point2.Y - point1.Y, 2));
        }
 
        //This function calculates the total length of line segments by adding individual lengths
        public static double DistanceOfLineSegments(Point[] segments)
        {
            double distance = 0;
            for (int i = 1; i < segments.Length; i++)
            {
                distance += DistanceBetweenPoints(segments[i - 1], segments[i]);
            }
            return distance;
        }
 
        public static Point MidPointOfLineSegment(Point point1, Point point2)
        {
            return new Point(Math.Round((point1.X + point2.X) / 2), Math.Round((point1.Y + point2.Y) / 2));
        }
 
        public static double SlopeOfLineSegment(Point start, Point end)
        {
            //If line is vertical then the slope is infinite
            if (start.X == end.X)
            {
                return double.MaxValue;
            }
 
            //If the line is horizontal then slope is 0
            if (start.Y == end.Y)
            {
                return 0;
            }
 
            return ((end.Y - start.Y) / (end.X - start.X));
        }
 
 
        //This function returns the length of the longest segment in a PointsCollection.
        //The segments are assumed to be HORIZONTAL or VERTICAL.
        //the out parameter returns the start point of the longest segment.
        //We always choose the first segment among the segments with max length.
        public static double LongestSegmentLength(PointCollection points, out int longestSegmentIndex)
        {
            double maxLength = 0;
            longestSegmentIndex = -1;
            for (int i = 0; i < points.Count - 1; i++)
            {
                double length = Math.Abs((points[i].X == points[i + 1].X) ? points[i].Y - points[i + 1].Y : points[i].X - points[i + 1].X);
                if (!length.IsEqualTo(maxLength) && length > maxLength) 
                {
                    maxLength = length;
                    longestSegmentIndex = i;
                }
            }
            
            return maxLength;
        }
    }
 
}