You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.3 KiB
69 lines
2.3 KiB
/*************************************************************************************
|
|
|
|
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 ) ) );
|
|
}
|
|
}
|
|
}
|
|
|