127 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Drawing;
 | 
						|
using System.Runtime.InteropServices;
 | 
						|
using System.Text;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Charts
 | 
						|
{
 | 
						|
    internal static class MathHelper
 | 
						|
    {
 | 
						|
        #region ToDegrees
 | 
						|
 | 
						|
        public static double ToDegrees(double radians)
 | 
						|
        {
 | 
						|
            return (radians * 180 / Math.PI);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ToRadians
 | 
						|
 | 
						|
        public static double ToRadians(double degrees)
 | 
						|
        {
 | 
						|
            return (degrees * Math.PI / 180);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetPointAngle
 | 
						|
 | 
						|
        public static int GetPointAngle(Point pt)
 | 
						|
        {
 | 
						|
            double theta = Math.Atan2(pt.X, -pt.Y);
 | 
						|
            int angle = (int)(MathHelper.ToDegrees(theta) + 270) % 360;
 | 
						|
 | 
						|
            return (angle);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetPointRadius
 | 
						|
 | 
						|
        public static int GetPointRadius(ref Point pt, Point cpt)
 | 
						|
        {
 | 
						|
            pt.X -= cpt.X;
 | 
						|
            pt.Y -= cpt.Y;
 | 
						|
 | 
						|
            return ((int)Math.Sqrt(pt.X * pt.X + pt.Y * pt.Y));
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetOffsetPoint
 | 
						|
 | 
						|
        public static Point GetOffsetPoint(
 | 
						|
            Point pt, Point cpt, out int radius, out int angle)
 | 
						|
        {
 | 
						|
            radius = MathHelper.GetPointRadius(ref pt, cpt);
 | 
						|
            angle = MathHelper.GetPointAngle(pt);
 | 
						|
 | 
						|
            return (pt);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Clamp
 | 
						|
 | 
						|
        public static T Clamp<T>(T value, T min, T max)
 | 
						|
            where T : IComparable<T>
 | 
						|
        {
 | 
						|
            T result = value;
 | 
						|
 | 
						|
            if (result.CompareTo(max) > 0)
 | 
						|
                result = max;
 | 
						|
 | 
						|
            if (result.CompareTo(min) < 0)
 | 
						|
                result = min;
 | 
						|
 | 
						|
            return (result);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ToScalar
 | 
						|
 | 
						|
        public static double ToScalar(double x)
 | 
						|
        {
 | 
						|
            return (MathHelper.Sqrt((float)(x / Math.PI)) * 2);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Sqrt
 | 
						|
 | 
						|
        [StructLayout(LayoutKind.Explicit)]
 | 
						|
        private struct FloatIntUnion
 | 
						|
        {
 | 
						|
            [FieldOffset(0)]
 | 
						|
            public float f;
 | 
						|
 | 
						|
            [FieldOffset(0)]
 | 
						|
            public int tmp;
 | 
						|
        }
 | 
						|
 | 
						|
        public static float Sqrt(float x)
 | 
						|
        {
 | 
						|
            if (x != 0)
 | 
						|
            {
 | 
						|
                FloatIntUnion u;
 | 
						|
 | 
						|
                u.tmp = 0;
 | 
						|
                u.f = x;
 | 
						|
 | 
						|
                u.tmp -= 1 << 23;   // Subtract 2^m
 | 
						|
                u.tmp >>= 1;        // Divide by 2
 | 
						|
                u.tmp += 1 << 29;   // Add ((b + 1) / 2) * 2^m
 | 
						|
 | 
						|
                return (u.f);
 | 
						|
            }
 | 
						|
 | 
						|
            return (0);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |