Click here to Skip to main content
15,884,537 members
Articles / Programming Languages / C#

NextUI Thermometer Panel

Rate me:
Please Sign up or sign in to vote.
3.56/5 (15 votes)
23 Oct 20073 min read 32.3K   2.8K   33  
a thermometer like display
// *****************************************************************************
// 
//  (c) NextWave Software  2007
//  All rights reserved. The software and associated documentation 
//  supplied hereunder are the proprietary information of NextWave Software 
//	Limited, Kuala Lumpur , Malaysia and are supplied subject to 
//	licence terms.
// 
//  Version 0.9 	www.nextwavesoft.com
// *****************************************************************************
using System;
using System.Drawing;

namespace NextUI.Helper
{
    public class AlgorithmHelper
    {
        public static float NormalizeDegreeFromX(float degree)
        {
            float temp = degree;
            while (temp < 0 || temp >= 360)
            {
                if (temp >= 360)
                {
                    temp -= 360;
                }
                else if (temp <= 0)
                {
                    temp += 360;
                }
            }
            return temp;
        }

        //Normalze degree to reference

        public static float NormalizeDegree(float reference , float degree)
        {
            float temp = degree - reference;
            if (temp < 0)
            {
                temp = degree + ( 360 - reference);
            }
            while (temp < 0 || temp >= 360)
            {
                if (temp >= 360)
                {
                    temp -= 360;
                }
                else if (temp <= 0)
                {
                    temp += 360;
                }
            }
            //Console.WriteLine("Normalize to " + reference + ",converted=" + degree + " to " + temp);
            return temp;
        }

        public static float AngleDifferentClockWise(float startAngle, float endAngle)
        {
            //Lets normalize the angle;
            float nStartAngle = NormalizeDegreeFromX(startAngle);
            float nEndAngle = NormalizeDegreeFromX(endAngle);
            //Calculate the Diff, where the 0 is always on the positive x axis. 
            float result = 360f;
            if (nStartAngle > nEndAngle)
            {
                result = 360 - (nStartAngle - nEndAngle);
            }
            if (nStartAngle < nEndAngle)
            {
                result = nEndAngle - nStartAngle;
            }
            return result;

        }
        
        public static PointF LocationToCenter(PointF center, float radius, float angle)
        {
            //angle is clockwise from x axis .
            //translate the angle relative to x axis .
            PointF location = new PointF(0,0);
            if (angle <= 90)
            {
                location.X = radius * (float)Math.Cos(angle * (Math.PI / 180f)) + center.X;
                location.Y = radius * (float)Math.Sin(angle * (Math.PI / 180f)) + center.Y;
            }
            else if (angle <= 180)
            {
                location.X = center.X - radius * (float)Math.Cos((180 - angle) * (Math.PI / 180f));
                location.Y = radius * (float)Math.Sin((180 - angle) * (Math.PI / 180f)) + center.Y;
            }
            else if (angle <= 270)
            {
                location.X = center.X - radius * (float)Math.Cos((angle - 180) * (Math.PI / 180f));
                location.Y = center.Y - radius * (float)Math.Sin((angle - 180) * (Math.PI / 180f));
            }
            else
            {
                location.X = radius * (float)Math.Cos((360 - angle) * (Math.PI / 180f)) + center.X;
                location.Y = center.Y - radius * (float)Math.Sin((360 - angle) * (Math.PI / 180f));
            }
            return location;
        }

        public static float PointToCenterAngle(PointF center, Point location)
        {
            float x = (float)location.X - center.X;
            float y = (float)location.Y - center.Y;
          //  Console.WriteLine("x=" + x + ":y=" + y);
            float angle = 0;
            if (x > 0 && y >= 0)
            {
                //we are at the 1 st rn
                angle = (float)(Math.Atan(Math.Abs(y / x)) * (180 / Math.PI));
            }
            else if (x <= 0 && y > 0)
            {
                //at 2nd Qua
                angle = (float)(180 - Math.Atan(Math.Abs(y / x)) * (180 / Math.PI));
            }
            else if (x < 0 && y <= 0)
            {
                angle = (float)(Math.Atan(Math.Abs(y / x)) * (180 / Math.PI) + 180);
            }
            else
            {
                angle = (float)(360 - Math.Atan(Math.Abs(y / x)) * (180 / Math.PI));
            }
            return angle;
        }

        public static bool IsPointInCircle(PointF center, float radius, Point location, float offset)
        {
            //  ( x - a )^2 + ( y - b )^2= r2. 
            // Console.WriteLine(rsqt);
            float rsqt = (float)(Math.Pow((float)(location.X) - center.X, 2) + Math.Pow((float)(location.Y) - center.Y, 2));
            //  Console.WriteLine(rsqt + " square=" + Math.Pow(radius,2) + " : " + Math.Pow(radius + (float)offset,2));
            if (rsqt >= Math.Pow(radius, 2) && rsqt <= Math.Pow(radius + (float)offset, 2))
            {
                return true;
            }
            return false;

        }


        public static PointF CalXYCircle(PointF center, float radius, float angle)
        {
            float x = center.X + (radius * (float)(Math.Cos((angle / 360) * 2 * Math.PI)));
            float y = center.Y + (radius * (float)(Math.Sin((angle / 360) * 2 * Math.PI)));
            return new PointF(x, y);
        }

        public static bool IsPointInRectF(RectangleF x1, PointF n)
        {
            if (n.X > x1.Left && n.X < x1.Left + x1.Width
                && n.Y > x1.Top && n.Y < x1.Top + x1.Height)
            {
                return true;
            }
            return false;
        }


        public static bool IsPointInRect(Rectangle x1, Point n)
        {
            if (n.X > x1.Left && n.X < x1.Left + x1.Width
                && n.Y > x1.Top && n.Y < x1.Top + x1.Height)
            {
                return true;
            }
            return false;
        }

        public static bool IsPointInLine(Point x1, Point x2, Point n)
        {
            //Lets calculate the gradient x1 and x2
            bool inLine = false;
            if ((n.X >= x1.X && n.X <= x2.X && n.Y >= x1.Y && n.Y <= x2.Y) ||
                 (n.X <= x1.X && n.X >= x2.X && n.Y >= x1.Y && n.Y <= x2.Y) ||
                 (n.X <= x1.X && n.X >= x2.X && n.Y <= x1.Y && n.Y >= x2.Y) ||
                (n.X >= x1.X && n.X <= x2.X && n.Y <= x1.Y && n.Y >= x2.Y))
            {
                //this is a horizontal line, cannot use
                //gradient since it will be infinity.
                if (x1.X == x2.X)
                {
                    if ((n.X == x1.X && n.Y > x1.Y && n.Y < x2.Y) ||
                        (n.X == x1.X && n.Y < x1.Y && n.Y > x2.Y))
                    {
                        inLine = true;
                    }
                }
                else if (x1.X != n.X)
                {
                    Double m = Math.Round((float)(x1.Y - x2.Y) / (float)(x1.X - x2.X), 1);
                    Double z = Math.Round((float)(x1.Y - n.Y) / (float)(x1.X - n.X), 1);
                    if (m == z)
                    {
                        inLine = true;
                    }
                }
            }
            return inLine;
        }


    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior) www.nextwavesoft.com
United States United States
Senior Software Developer at nextwavesoft

Comments and Discussions