private static double CalculateRandomTargetLineLengthDiff(LineModel directionLine1, LineModel directionLine2, LineModel directionLine3, LineModel randomTargetLine)
        {
            var intercept1 = CoordinateSystemOperation.CalculatePointByTwoLines(directionLine1, randomTargetLine);
            var intercept2 = CoordinateSystemOperation.CalculatePointByTwoLines(directionLine2, randomTargetLine);
            var intercept3 = CoordinateSystemOperation.CalculatePointByTwoLines(directionLine3, randomTargetLine);
            var length1    = CoordinateSystemOperation.CalculateLengthBetweenPoints(intercept1, intercept2);
            var length2    = CoordinateSystemOperation.CalculateLengthBetweenPoints(intercept2, intercept3);
            var diff       = Math.Abs(length1 - length2);

            return(diff);
        }
        public static void CalculateEstimatedDirectionLine(LineModel directionLine1, LineModel directionLine2, LineModel directionLine3, LineModel randomTargetLine, TextBox observePos1Text, TextBox observePos1TimeDiffText, TextBox observePos2TimeDiffText, ref LineModel estimatedDirectionLine, ref TextBox estimatedDirectionLineText, ref TextBox targetHeadingText)
        {
            if (directionLine1 == null || directionLine2 == null || directionLine3 == null || randomTargetLine == null)
            {
                return;
            }

            double pos2LengthRatio = 1;

            if (!string.IsNullOrEmpty(observePos1TimeDiffText.Text) && !string.IsNullOrEmpty(observePos2TimeDiffText.Text))
            {
                try
                {
                    double pos1TimeDiff = Convert.ToDouble(observePos1TimeDiffText.Text);
                    double pos2TimeDiff = Convert.ToDouble(observePos2TimeDiffText.Text);
                    pos2LengthRatio = pos2TimeDiff / pos1TimeDiff;
                }
                catch
                {  }
            }

            var intercept1 = CoordinateSystemOperation.CalculatePointByTwoLines(directionLine1, randomTargetLine);
            var intercept2 = CoordinateSystemOperation.CalculatePointByTwoLines(directionLine2, randomTargetLine);
            var intercept3 = CoordinateSystemOperation.CalculatePointByTwoLines(directionLine3, randomTargetLine);

            var length1 = CoordinateSystemOperation.CalculateLengthBetweenPoints(intercept1, intercept2);
            var length2 = CoordinateSystemOperation.CalculateLengthBetweenPoints(intercept2, intercept3);
            var length  = (length1 + length2) / 2;

            length = length * pos2LengthRatio;

            LineDirection direction;

            if (intercept2.x > intercept1.x)
            {
                direction = LineDirection.LEFT_TO_RIGHT;
            }
            else
            {
                direction = LineDirection.RIGHT_TO_LEFT;
            }

            PointModel observePos = new PointModel(0, 0);

            if (!string.IsNullOrEmpty(observePos1Text.Text))
            {
                observePos = PointModel.Parse(observePos1Text.Text);
                if (observePos == null)
                {
                    return;
                }
            }

            var estimatedPoint = CoordinateSystemOperation.CalculatePointByLineAndLength(randomTargetLine, intercept3, length, direction);

            estimatedDirectionLine          = CoordinateSystemOperation.CalculateLineFromTwoPoint(observePos, estimatedPoint);
            estimatedDirectionLineText.Text = estimatedDirectionLine.ToString();

            var headingLine = CoordinateSystemOperation.CalculateLineFromTwoPoint(intercept1, intercept2);
            var heading     = CoordinateSystemOperation.CalculateDirectionFromLine(headingLine);

            targetHeadingText.Text = Math.Round(heading, 2).ToString();
        }
        public static void CalculateActualTargetLine(LineModel randomTargetLine, LineModel estimatedDirectionLine, LineModel directionLine1, LineModel directionLine2, LineModel directionLine3, LineModel directionLine4, TextBox observePos1TimeDiffText, ref LineModel actualTargetLine, ref TextBox actualTargetLineText, ref PointModel targetConfirmedPoint, ref DateTime targetConfirmedPointDate, ref TextBox targetSpeedText)
        {
            if (randomTargetLine == null || estimatedDirectionLine == null || directionLine4 == null)
            {
                return;
            }

            targetConfirmedPoint      = CoordinateSystemOperation.CalculatePointByTwoLines(estimatedDirectionLine, directionLine4);
            targetConfirmedPointDate  = DateTime.Now;
            actualTargetLine          = CoordinateSystemOperation.CalculateLineFromSlopeAndPoint(randomTargetLine.a, targetConfirmedPoint, randomTargetLine.lineDirection);
            actualTargetLineText.Text = actualTargetLine.ToString();

            if (string.IsNullOrEmpty(observePos1TimeDiffText.Text) || directionLine1 == null || directionLine2 == null || directionLine3 == null)
            {
                return;
            }

            double time;

            try
            {
                time = Convert.ToDouble(observePos1TimeDiffText.Text);
            }
            catch
            {
                MessageBox.Show("invalid number: " + observePos1TimeDiffText.Text);
                return;
            }

            var intercept1   = CoordinateSystemOperation.CalculatePointByTwoLines(actualTargetLine, directionLine1);
            var intercept2   = CoordinateSystemOperation.CalculatePointByTwoLines(actualTargetLine, directionLine2);
            var intercept3   = CoordinateSystemOperation.CalculatePointByTwoLines(actualTargetLine, directionLine3);
            var length       = (CoordinateSystemOperation.CalculateLengthBetweenPoints(intercept1, intercept2) + CoordinateSystemOperation.CalculateLengthBetweenPoints(intercept2, intercept3)) / 2.00;
            var speedByMeter = length / time;
            var speedByKnot  = speedByMeter * 1.94;

            targetSpeedText.Text = Math.Round(speedByKnot, 2).ToString();

            var actualDirectionLine = CoordinateSystemOperation.CalculateLineFromTwoPoint(intercept1, intercept2);

            actualTargetLine.lineDirection = actualDirectionLine.lineDirection;
        }
        public static void CalculateDirectionLine(TextBox subHeadingText, TextBox directionText, TextBox observePos1PositionText, ref LineModel directionLine, ref TextBox directionLineText, bool isObservePos1DirectionLine = true)
        {
            if (string.IsNullOrEmpty(directionText.Text) || string.IsNullOrEmpty(subHeadingText.Text))
            {
                return;
            }

            double direction, subHeading;

            try
            {
                direction  = Convert.ToDouble(directionText.Text);
                subHeading = Convert.ToDouble(subHeadingText.Text);
            }
            catch
            {
                MessageBox.Show("invalid number: " + directionText.Text + ", " + subHeadingText.Text);
                return;
            }

            direction = DirectionOperation.CalculateSubActualDirection(subHeading, direction);

            PointModel observePos = new PointModel(0, 0);

            if (isObservePos1DirectionLine && !string.IsNullOrEmpty(observePos1PositionText.Text))
            {
                observePos = PointModel.Parse(observePos1PositionText.Text);

                if (observePos == null)
                {
                    return;
                }
            }

            directionLine          = CoordinateSystemOperation.CalculateLineFromPointAndDirection(observePos, direction);
            directionLineText.Text = directionLine.ToString();
        }
        public static void CalculateRandomTargetLine(LineModel directionLine1, LineModel directionLine2, LineModel directionLine3, ref LineModel randomTargetLine, ref TextBox randomTargetLineText, ref TextBox targetLineLengthDiffText, ref TextBox randomTargetLineMethodText)
        {
            if (directionLine1 == null || directionLine2 == null || directionLine3 == null)
            {
                return;
            }

            var randomTaretLineByMath    = CoordinateSystemOperation.CalculateRandomTargetLineByMath(directionLine1, directionLine2, directionLine3);
            var randomTargetLineByRotate = CoordinateSystemOperation.CalculateRandomTargetLineByRotate(directionLine1, directionLine2, directionLine3);

            if (randomTargetLineByRotate == null)
            {
                MessageBox.Show("calculate parallel route failed.");
                return;
            }

            var rotateLineDiff = CalculateRandomTargetLineLengthDiff(directionLine1, directionLine2, directionLine3, randomTargetLineByRotate);
            var mathLineDiff   = CalculateRandomTargetLineLengthDiff(directionLine1, directionLine2, directionLine3, randomTaretLineByMath);

            if (rotateLineDiff < mathLineDiff)
            {
                randomTargetLine = randomTargetLineByRotate;
                randomTargetLineMethodText.Text = "ROTATE";
                targetLineLengthDiffText.Text   = rotateLineDiff.ToString();
            }
            else
            {
                randomTargetLine = randomTaretLineByMath;
                randomTargetLineMethodText.Text = "CALCULATE";
                targetLineLengthDiffText.Text   = mathLineDiff.ToString();
            }

            randomTargetLineText.Text = randomTargetLine.ToString();
        }
        public static void CalculateTargetLine(TextBox targetPos1Text, TextBox observeDate1Text, TextBox targetPos2Text, TextBox observeDate2Text, TextBox targetPos3Text, ref TextBox targetLineText, ref LineModel targetLine, ref TextBox targetHeadingText)
        {
            var pos1 = PointModel.Parse(targetPos1Text.Text);
            var pos2 = PointModel.Parse(targetPos2Text.Text);
            var pos3 = PointModel.Parse(targetPos3Text.Text);

            if (pos1 == null || pos2 == null)
            {
                return;
            }

            DateTime pos1Date, pos2Date;

            try
            {
                pos1Date = DateTime.ParseExact(observeDate1Text.Text, "yyyy-MM-dd HH:mm:ss", null);
                pos2Date = DateTime.ParseExact(observeDate2Text.Text, "yyyy-MM-dd HH:mm:ss", null);
            }
            catch
            {
                MessageBox.Show("invalid date time:" + observeDate1Text.Text + ", " + observeDate2Text.Text);
                return;
            }

            PointModel earlyPoint, laterPoint;

            if (pos1Date < pos2Date)
            {
                earlyPoint = pos1;
                laterPoint = pos2;
            }
            else
            {
                earlyPoint = pos2;
                laterPoint = pos1;
            }

            var line = CoordinateSystemOperation.CalculateLineFromTwoPoint(earlyPoint, laterPoint);

            targetLine          = line;
            targetLineText.Text = line.ToString();

            var targetHeading = CoordinateSystemOperation.CalculateDirectionFromLine(line);

            targetHeadingText.Text = targetHeading.ToString();
        }
Beispiel #7
0
        public ChartEntityModel(PointModel headPoint, PointModel bottomLeftPoint, PointModel bottomRightPoint, LineModel centerLine, LineModel bottomLine)
        {
            this.headPoint        = headPoint;
            this.bottomLeftPoint  = bottomLeftPoint;
            this.bottomRightPoint = bottomRightPoint;

            this.centerLine = centerLine;
            this.bottomLine = bottomLine;
        }
        public static LineModel CalculateRandomTargetLineByMath(LineModel directionLine1, LineModel directionLine2, LineModel directionLine3)
        {
            var randomLength = 3000;
            var randomPoint  = CalculatePointByLineAndLength(directionLine2, new PointModel(0, 0), randomLength, directionLine2.lineDirection);

            var verticalSlope = -1.0 / directionLine2.a;
            var verticalLine  = CalculateLineFromSlopeAndPoint(verticalSlope, randomPoint, LineDirection.LEFT_TO_RIGHT);

            var verticalIntercept1 = CalculatePointByTwoLines(directionLine1, verticalLine);
            var verticalIntercept3 = CalculatePointByTwoLines(directionLine3, verticalLine);
            var length1            = CalculateLengthBetweenPoints(verticalIntercept1, randomPoint);
            var length3            = CalculateLengthBetweenPoints(verticalIntercept3, randomPoint);

            LineModel  circleLine;
            LineModel  otherLine;
            PointModel circlePoint;
            double     circleR;

            if (length1 < length3)
            {
                circleLine  = directionLine1;
                otherLine   = directionLine3;
                circlePoint = verticalIntercept1;
                circleR     = length1;
            }
            else
            {
                circleLine  = directionLine3;
                otherLine   = directionLine1;
                circlePoint = verticalIntercept3;
                circleR     = length3;
            }

            var circleDiamLine      = CalculateLineFromTwoPoint(circlePoint, randomPoint);
            var circleOppositePoint = CalculatePointByLineAndLength(circleDiamLine, randomPoint, circleR, circleDiamLine.lineDirection);

            var parallelLine = CalculateLineFromSlopeAndPoint(circleLine.a, circleOppositePoint, circleLine.lineDirection);
            var randomTargetLineInterceptPoint = CalculatePointByTwoLines(parallelLine, otherLine);

            var randomTargetLine = CalculateLineFromTwoPoint(randomTargetLineInterceptPoint, randomPoint);

            return(randomTargetLine);
        }
        public static LineModel CalculateRandomTargetLineByRotate(LineModel directionLine1, LineModel directionLine2, LineModel directionLine3)
        {
            var randomLength = 3000;
            var randomPoint  = CalculatePointByLineAndLength(directionLine2, new PointModel(0, 0), randomLength, directionLine2.lineDirection);

            var       startDirection        = CalculateDirectionFromLine(directionLine2);
            var       increaseDirectionStep = 0.01;
            double    increaseDirection     = 0;
            var       idealLengthDiff       = 0.01;
            LineModel result            = null;
            double    minimumLengthDiff = 99999999999;

            while (true)
            {
                increaseDirection = increaseDirection + increaseDirectionStep;
                if (increaseDirection >= 180)
                {
                    break;
                }
                if (minimumLengthDiff <= idealLengthDiff)
                {
                    break;
                }

                var candidateHeading = startDirection + increaseDirection;
                candidateHeading = DirectionOperation.CorrectDirection(candidateHeading);
                var candidateLine   = CalculateLineFromPointAndDirection(randomPoint, candidateHeading);
                var interceptPoint1 = CalculatePointByTwoLines(candidateLine, directionLine1);
                var interceptPoint3 = CalculatePointByTwoLines(candidateLine, directionLine3);

                var length1    = CalculateLengthBetweenPoints(interceptPoint1, randomPoint);
                var length2    = CalculateLengthBetweenPoints(interceptPoint3, randomPoint);
                var lengthDiff = Math.Abs(length1 - length2);

                //verify
                var intercept2 = CalculatePointByTwoLines(candidateLine, directionLine2);
                if (intercept2.x < -1000000 || intercept2.x > 1000000)
                {
                    continue;
                }
                if (lengthDiff == 0)
                {
                    continue;
                }

                if (lengthDiff < minimumLengthDiff)
                {
                    result            = candidateLine;
                    minimumLengthDiff = lengthDiff;
                }
            }

            return(result);
        }
        public static double CalculateLengthBetweenPointAndLine(PointModel point, LineModel line)
        {
            var result = (line.a * point.x - point.y + line.b) / Math.Sqrt(line.a * line.a + 1);

            return(result);
        }