/************************************************************************************* Extended WPF Toolkit Copyright (C) 2007-2013 Xceed Software Inc. This program is provided to you under the terms of the Microsoft Public License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license For more features, controls, and fast professional support, pick up the Plus Edition at http://xceed.com/wpf_toolkit Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids ***********************************************************************************/ using System; using System.Windows; namespace Xceed.Wpf.Toolkit.Core.Utilities { internal static class EllipseHelper { public static Point PointOfRadialIntersection( Rect ellipseRect, double angle ) { // given by the formula: // // x = a cos q, // y = b sin q, // // where a is the elliptical radius along the major axis // b is the elliptical radius along the minor axis // q is the central angle from the major axis double a = ellipseRect.Width / 2; double b = ellipseRect.Height / 2; // since this is WPF, we can assume angle is currently specified in degrees, so convert to radians double q = angle * Math.PI / 180; return RectHelper.Center( ellipseRect ) + new Vector( a * Math.Cos( q ), b * Math.Sin( q ) ); } public static double RadialDistanceFromCenter( Rect ellipseRect, double angle ) { // given by the formula: // // 2 2 // 2 a b // r = ----------------- // 2 2 2 2 // a sin q + b cos q // // where a is the elliptical radius along the major axis // b is the elliptical radius along the minor axis // q is the central angle from the major axis double a = ellipseRect.Width / 2; double b = ellipseRect.Height / 2; // since this is WPF, we can assume angle is currently specified in degrees, so convert to radians double q = angle * Math.PI / 180; double sinq = Math.Sin( q ); double cosq = Math.Cos( q ); return Math.Sqrt( ( a * a * b * b ) / ( ( a * a * sinq * sinq ) + ( b * b * cosq * cosq ) ) ); } } }