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
}
}