예제 #1
0
파일: Path.cs 프로젝트: sxtgyrq/VRPGame
        private List <SaveRoad.DictCross> findCrossesF(SaveRoad.DictCross[] cross, SaveRoad.RoadInfo current, MapGo.nyrqPosition p1, MapGo.nyrqPosition p2, double ascendingValue, getRoadCodeParameter codeF, getRoadOrderParameter orderF, getPercentParameter percentF)
        {
            var findCrosses = (from item in cross
                               where item.CrossState == 1 &&
                               codeF(item) == current.RoadCode &&
                               (orderF(item) + percentF(item)) * ascendingValue > (p1.roadOrder + p1.percent) * ascendingValue &&
                               (orderF(item) + percentF(item)) * ascendingValue < (p2.roadOrder + p2.percent) * ascendingValue
                               orderby(orderF(item) + percentF(item)) * ascendingValue ascending
                               select item).ToList();

            return(findCrosses);
        }
예제 #2
0
        private static double[] getRoadRectangle(SaveRoad.RoadInfo value, Dictionary <int, SaveRoad.RoadInfo> result)
        {
            double KofPointStretchFirstAndSecond = 1;
            double KofPointStretchThirdAndFourth = 1;

            if (value.CarInOpposeDirection == 0)
            {
                KofPointStretchFirstAndSecond = 0.1;
                KofPointStretchThirdAndFourth = 1.5;
            }

            double[] point1, point2, point3, point4;
            var      vec = new double[] { value.endLongitude - value.startLongitude, value.endLatitude - value.startLatitude };

            vec = setToOne(vec);
            System.Numerics.Complex c = new System.Numerics.Complex(vec[0], vec[1]);
            if (!result.ContainsKey(value.RoadOrder - 1))
            {
                var c2 = new System.Numerics.Complex(0, 1);
                var c3 = c * c2;

                point1 = new double[] {
                    value.startLongitude + c3.Real * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond,
                    value.startLatitude + c3.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond
                };
                var c5 = c / c2;
                point2 = new double[] {
                    value.startLongitude + c5.Real * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond,
                    value.startLatitude + c5.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond
                };
            }
            else
            {
                var valueP = result[value.RoadOrder - 1];//previows
                var vecP   = new double[] { valueP.endLongitude - valueP.startLongitude, valueP.endLatitude - valueP.startLatitude };
                vecP = setToOne(vecP);
                System.Numerics.Complex cP = new System.Numerics.Complex(-vecP[0], -vecP[1]);
                var vecDiv2 = c + cP;
                {
                    if (Math.Abs((vecDiv2 / c).Imaginary) < 1e-6)
                    {
                        var c2 = new System.Numerics.Complex(0, 1);
                        var c3 = c * c2;
                        point1 = new double[] {
                            value.startLongitude + c3.Real * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond,
                            value.startLatitude + c3.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond
                        };
                        var c5 = c / c2;
                        point2 = new double[] {
                            value.startLongitude + c5.Real * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond,
                            value.startLatitude + c5.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond
                        };
                    }
                    else
                    {
                        var k = 1 / (vecDiv2 / c).Imaginary;
                        var s = Math.Sqrt(k * k + 1 / k / k);

                        {
                            var vecDivOperate = s / k * setToOne(vecDiv2);
                            point1 = new double[] {
                                value.startLongitude + vecDivOperate.Real * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond,
                                value.startLatitude + vecDivOperate.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond
                            };
                        }
                        {
                            var vecDiv2_opp_diretion = -1 * (vecDiv2);
                            var vecDivOperate        = s / k * setToOne(vecDiv2_opp_diretion);
                            point2 = new double[] {
                                value.startLongitude + vecDivOperate.Real * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond,
                                value.startLatitude + vecDivOperate.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchFirstAndSecond
                            };
                        }
                    }
                }
            }
            c = new System.Numerics.Complex(-vec[0], -vec[1]);
            if (!result.ContainsKey(value.RoadOrder + 1))
            {
                var c2 = new System.Numerics.Complex(0, 1);
                var c3 = c * c2;
                point3 = new double[] {
                    value.endLongitude + c3.Real * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth,
                    value.endLatitude + c3.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth
                };
                var c5 = c / c2;
                point4 = new double[] {
                    value.endLongitude + c5.Real * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth,
                    value.endLatitude + c5.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth
                };
            }
            else
            {
                var valueN = result[value.RoadOrder + 1];//next
                var vecN   = new double[] {
                    valueN.endLongitude - valueN.startLongitude,
                    valueN.endLatitude - valueN.startLatitude
                };
                vecN = setToOne(vecN);
                System.Numerics.Complex cP = new System.Numerics.Complex(vecN[0], vecN[1]);
                var vecDiv2 = c + cP;
                if (Math.Abs((vecDiv2 / c).Imaginary) < 1e-6)
                {
                    var c2 = new System.Numerics.Complex(0, 1);
                    var c3 = c * c2;
                    point3 = new double[] {
                        value.endLongitude + c3.Real * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth,
                        value.endLatitude + c3.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth
                    };
                    var c5 = c / c2;
                    point4 = new double[] {
                        value.endLongitude + c5.Real * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth,
                        value.endLatitude + c5.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth
                    };
                }
                else
                {
                    var k = 1 / (vecDiv2 / c).Imaginary;
                    var s = Math.Sqrt(k * k + 1 / k / k);
                    {
                        var vecDivOperate = s / k * setToOne(vecDiv2);
                        point3 = new double[] {
                            value.endLongitude + vecDivOperate.Real * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth,
                            value.endLatitude + vecDivOperate.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth
                        };
                    }
                    {
                        var vecDiv2_opp_diretion = -1 * vecDiv2;
                        var vecDivOperate        = s / k * setToOne(vecDiv2_opp_diretion);
                        point4 = new double[] {
                            value.endLongitude + vecDivOperate.Real * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth,
                            value.endLatitude + vecDivOperate.Imaginary * value.MaxSpeed * roadZoomValue * KofPointStretchThirdAndFourth
                        };
                    }
                }
            }
            return(new double[]
            {
                Math.Round(point1[0], 9), Math.Round(point1[1], 9),
                Math.Round(point2[0], 9), Math.Round(point2[1], 9),
                Math.Round(point3[0], 9), Math.Round(point3[1], 9),
                Math.Round(point4[0], 9), Math.Round(point4[1], 9)
            });
        }
예제 #3
0
 private static object getCrossPoints(SaveRoad.RoadInfo value, Dictionary <string, Dictionary <int, SaveRoad.RoadInfo> > result)
 {
     //List<string>
     throw new NotImplementedException();
 }