public static LineModel CalculateLineFromPointAndDirection(PointModel point, double direction)
        {
            double yAxisAngle;
            int    quadrant;

            if (direction < 90)
            {
                yAxisAngle = direction;
                quadrant   = 1;
            }
            else if (direction < 180)
            {
                yAxisAngle = 180 - direction;
                quadrant   = 2;
            }
            else if (direction < 270)
            {
                yAxisAngle = direction - 180;
                quadrant   = 3;
            }
            else
            {
                yAxisAngle = 360 - direction;
                quadrant   = 4;
            }

            var sin = MathOperation.Sin(yAxisAngle);
            var cos = MathOperation.Cos(yAxisAngle);
            var toNextPointLength = 100;
            //var nextPointX = sin * toNextPointLength + point.x;
            //var nextPointY = cos * toNextPointLength + point.y;
            double nextPointX, nextPointY;

            if (quadrant == 1 || quadrant == 2)
            {
                nextPointX = sin * toNextPointLength + point.x;
            }
            else
            {
                nextPointX = point.x - sin * toNextPointLength;
            }
            if (quadrant == 1 || quadrant == 4)
            {
                nextPointY = cos * toNextPointLength + point.y;
            }
            else
            {
                nextPointY = point.y - cos * toNextPointLength;
            }


            var nextPoint = new PointModel(nextPointX, nextPointY);
            var line      = CalculateLineFromTwoPoint(point, nextPoint);

            return(line);
        }
        public static void CalculateTargetObservationPos(TextBox targetDirectionText, TextBox subDirectionText, TextBox observationHeightText, TextBox targetHeightText, ref TextBox distanceText, ref TextBox observationDateText, ref TextBox targetPositionText, bool updateObservationDate = true)
        {
            if (updateObservationDate)
            {
                observationDateText.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            }

            if (string.IsNullOrEmpty(targetHeightText.Text) || string.IsNullOrEmpty(observationHeightText.Text))
            {
                return;
            }

            double targetHeight, observationHeight = 0;

            try
            {
                targetHeight      = Convert.ToDouble(targetHeightText.Text);
                observationHeight = Convert.ToDouble(observationHeightText.Text);
            }
            catch
            {
                MessageBox.Show("invalid number: " + targetHeightText.Text + ", " + observationHeightText.Height);
                return;
            }

            var distance = Math.Round(targetHeight / observationHeight * 400.00, 2);

            distanceText.Text = distance.ToString();

            if (string.IsNullOrEmpty(targetDirectionText.Text) || string.IsNullOrEmpty(subDirectionText.Text))
            {
                return;
            }

            double targetDirection = 0, subDirection = 0;

            try
            {
                targetDirection = Convert.ToDouble(targetDirectionText.Text);
                subDirection    = Convert.ToDouble(subDirectionText.Text);
            }
            catch
            {
                MessageBox.Show("invalid number: " + targetDirectionText.Text + ", " + subDirectionText.Text);
            }

            var    actualDirection = DirectionOperation.CalculateSubActualDirection(subDirection, targetDirection);
            double xAxisAngle;
            int    quadrantIndex;

            if (actualDirection < 90)
            {
                xAxisAngle    = 90 - actualDirection;
                quadrantIndex = 1;
            }
            else if (actualDirection < 180)
            {
                xAxisAngle    = actualDirection - 90;
                quadrantIndex = 2;
            }
            else if (actualDirection < 270)
            {
                xAxisAngle    = 270 - actualDirection;
                quadrantIndex = 3;
            }
            else
            {
                xAxisAngle    = actualDirection - 270;
                quadrantIndex = 4;
            }

            var cos = MathOperation.Cos(xAxisAngle);
            var sin = MathOperation.Sin(xAxisAngle);
            var x   = cos * distance;
            var y   = sin * distance;

            if (quadrantIndex == 2)
            {
                y = -1 * y;
            }
            if (quadrantIndex == 3)
            {
                y = -1 * y;
                x = -1 * x;
            }
            if (quadrantIndex == 4)
            {
                x = -1 * x;
            }

            var point = new PointModel(x, y);

            targetPositionText.Text = point.ToString();
        }