コード例 #1
0
        public PointInfo GetNextPoint(Direction direction)
        {
            PointInfo result = default(PointInfo);

            result.Index     = this.GetNextIndex(direction);
            result.Points    = this.Points;
            result.Point     = result.Points[result.Index];
            result.Path      = this.Path;
            result.Direction = direction;
            return(result);
        }
コード例 #2
0
        private PointInfo GetNextPoint(PointInfo currentPoint, PointF previousPoint, Pen pen)
        {
            ArrayList arrayList = new ArrayList();

            for (int i = 0; i < this.boundsArray.Length; i++)
            {
                if (this.paths[i] != currentPoint.Path)
                {
                    RectangleF rectangleF = this.boundsArray[i];
                    rectangleF.Inflate(2f, 2f);
                    if (rectangleF.Contains(currentPoint.Point) && (this.paths[i].IsOutlineVisible(currentPoint.Point, pen) || this.paths[i].IsVisible(currentPoint.Point)))
                    {
                        this.DrawMarker(currentPoint.Point, 2f);
                        PointF[]  pathPoints   = this.GetPathPoints(this.paths[i]);
                        PointInfo closestPoint = this.GetClosestPoint(currentPoint.Point, pathPoints, this.paths[i]);
                        arrayList.Add(closestPoint);
                    }
                }
            }
            if (arrayList.Count == 0)
            {
                return(currentPoint.GetNextPoint(currentPoint.Direction));
            }
            PointInfo result = currentPoint.GetNextPoint(currentPoint.Direction);
            double    num    = this.CalculateAngle(previousPoint, currentPoint.Point, result.Point);

            foreach (PointInfo item in arrayList)
            {
                PointInfo nextPoint  = item.GetNextPoint(Direction.Forward);
                double    num2       = this.CalculateAngle(previousPoint, currentPoint.Point, nextPoint.Point);
                PointInfo nextPoint2 = item.GetNextPoint(Direction.Backward);
                double    num3       = this.CalculateAngle(previousPoint, currentPoint.Point, nextPoint2.Point);
                if (num2 > num && !this.visitedPoints.Contains(nextPoint.Point))
                {
                    num    = num2;
                    result = nextPoint;
                }
                if (num3 > num && !this.visitedPoints.Contains(nextPoint2.Point))
                {
                    num    = num3;
                    result = nextPoint2;
                }
            }
            return(result);
        }
コード例 #3
0
        private PointInfo GetClosestPoint(PointF point, PointF[] points, GraphicsPath graphicsPath)
        {
            PointInfo result = default(PointInfo);

            result.Points = points;
            result.Path   = graphicsPath;
            double num = double.PositiveInfinity;

            for (int i = 0; i < points.Length; i++)
            {
                double num2 = (double)(points[i].X - point.X);
                double num3 = (double)(points[i].Y - point.Y);
                double num4 = num2 * num2 + num3 * num3;
                if (num4 < num)
                {
                    result.Point = points[i];
                    result.Index = i;
                    num          = num4;
                }
            }
            return(result);
        }
コード例 #4
0
        public GraphicsPath GetOutlinePath(GraphicsPath[] paths)
        {
            this.paths = paths;
            Pen        pen = new Pen(Brushes.Blue, 0f);
            RectangleF a   = RectangleF.Empty;

            this.boundsArray = new RectangleF[paths.Length];
            this.pointsTable = new Hashtable();
            for (int i = 0; i < paths.Length; i++)
            {
                this.boundsArray[i] = paths[i].GetBounds();
                a = ((!a.IsEmpty) ? RectangleF.Union(a, this.boundsArray[i]) : this.boundsArray[i]);
            }
            this.visitedPoints = new Hashtable();
            PointInfo currentPoint = default(PointInfo);
            int       num          = 0;

            while (num < paths.Length)
            {
                if (this.boundsArray[num].X != a.X)
                {
                    num++;
                    continue;
                }
                currentPoint.Path   = paths[num];
                currentPoint.Points = paths[num].PathPoints;
                break;
            }
            this.pointsTable.Add(currentPoint.Path, currentPoint.Points);
            int num2 = 0;

            while (num2 < currentPoint.Points.Length)
            {
                if (currentPoint.Points[num2].X != a.X)
                {
                    num2++;
                    continue;
                }
                currentPoint.Point = currentPoint.Points[num2];
                currentPoint.Index = num2;
                break;
            }
            ArrayList arrayList = new ArrayList();

            arrayList.Add(currentPoint.Point);
            PointF    previousPoint = new PointF(a.X - a.Width, (float)(a.Y + 2.0 * a.Height));
            PointInfo currentPoint2 = this.GetNextPoint(currentPoint, previousPoint, pen);

            previousPoint = currentPoint.Point;
            while (arrayList.Count < 3000 && currentPoint2.Point != currentPoint.Point)
            {
                arrayList.Add(currentPoint2.Point);
                if (!this.visitedPoints.Contains(currentPoint2.Point))
                {
                    this.visitedPoints.Add(currentPoint2.Point, null);
                }
                PointInfo nextPoint = this.GetNextPoint(currentPoint2, previousPoint, pen);
                previousPoint = currentPoint2.Point;
                currentPoint2 = nextPoint;
            }
            GraphicsPath graphicsPath = new GraphicsPath();

            graphicsPath.StartFigure();
            graphicsPath.AddPolygon((PointF[])arrayList.ToArray(typeof(PointF)));
            graphicsPath.CloseFigure();
            return(graphicsPath);
        }