示例#1
0
        protected virtual List <Segment> GetSegmentList(IDictionary <string, object> objectAsDict)
        {
            if (!objectAsDict.ContainsKey("posList"))
            {
                return(null);
            }
            var lineList = (List <string>)objectAsDict["posList"];
            // extrior (GML name) is the only one in this case
            var exteriorLine = lineList.First();

            if (string.IsNullOrEmpty(exteriorLine))
            {
                return(null);
            }
            List <Segment> netSegments        = new List <Segment>();
            var            exteriorLinePoints = TranslatorUtils.LineToVectorList(exteriorLine);
            var            reductedPoints     = DouglasPointsReduction.Reduct(exteriorLinePoints, toleranceDP);

            if (reductedPoints.Count <= 1)
            {
                return(null);
            }
            for (int i = 0; i < reductedPoints.Count - 1; i++)
            {
                netSegments.Add(new Segment {
                    p1 = reductedPoints[i], p2 = reductedPoints[i + 1]
                });
            }
            return(netSegments);
        }
示例#2
0
        protected virtual string GetPointPosition(IDictionary <string, object> objectAsDict)
        {
            if (objectAsDict.ContainsKey("pos"))
            {
                string objPoint = objectAsDict["pos"].ToString();
                var    point    = objPoint.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                                  .Select(num => float.Parse(num, System.Globalization.CultureInfo.InvariantCulture))
                                  .ToArray();
                currentPoint = CoordinatesCalc.GameXY(new Vector2(point[0], point[1]));
                if (CoordinatesCalc.IsInRange(currentPoint))
                {
                    string pointStr = "";
                    pointStr += $"{currentPoint.X} {currentPoint.Y} ";
                    return(pointStr);
                }
                return(null);
            }

            else if (objectAsDict.ContainsKey("posList"))
            {
                var lineList = (List <string>)objectAsDict["posList"];
                List <List <Vector2> > lineV2List = new List <List <Vector2> >();
                for (int i = 0; i < lineList.Count; i++)
                {
                    lineV2List.Add(TranslatorUtils.LineToVectorList(lineList[i]));
                }
                var    avgPoint       = Calculations.AvgPoint(lineV2List[0]);
                string avgPointString = "";
                if (!TranslatorUtils.IsNaNVector2(avgPoint))
                {
                    avgPointString = $"{avgPoint.X} {avgPoint.Y}";
                }

                if (!string.IsNullOrEmpty(avgPointString))
                {
                    var pArea = Calculations.PolygonArea(lineV2List[0]);
                    if (lineV2List.Count > 1)
                    {
                        for (int i = 1; i < lineV2List.Count; i++)
                        {
                            pArea -= Calculations.PolygonArea(lineV2List[i]);
                        }
                    }
                    pArea64      = ((int)(pArea / 64)) * 64;
                    currentPoint = avgPoint;
                    return(avgPointString);
                }
            }
            return(null);
        }
        protected virtual HashSet <Vector2> GetPointsInArea(IDictionary <string, object> objectAsDict)
        {
            if (objectAsDict.ContainsKey("posList"))
            {
                var lineList   = (List <string>)objectAsDict["posList"];
                var exteriorV2 = TranslatorUtils.LineToVectorList(lineList[0]);
                //var exteriorV2 = TranslatorUtils.LineListToVector2Arr(lineList, 0);
                if (exteriorV2.Count < 3)
                {
                    return(null);
                }

                var areaMinMax = Calculations.FindMaxMin(exteriorV2);
                var points     = AdditionalPointsCreation.CreatePointArray(areaMinMax[0], areaMinMax[1], gridDist);
                List <List <Vector2> > interiors = new List <List <Vector2> >();
                if (lineList.Count > 1)
                {
                    for (int i = 1; i < lineList.Count; i++)
                    {
                        interiors.Add(TranslatorUtils.LineToVectorList(lineList[i]));
                    }
                }

                HashSet <Vector2> selectedPoints = new HashSet <Vector2>();
                foreach (var p in points)
                {
                    if (Calculations.PointInPoly(exteriorV2, p) &&
                        (interiors == null || !interiors.Any(interior => Calculations.PointInPoly(interior, p))))
                    {
                        selectedPoints.Add(p);
                    }
                }
                return(selectedPoints);
            }
            return(null);
        }