Exemple #1
0
        public Point VectorToPoint(FigurePoint point)
        {
            var dx = point.x - x;
            var dy = point.y - y;

            return(new Point(dx, dy));
        }
Exemple #2
0
        public bool IsOnBorder(FigurePoint p, PolygonFigure pf)
        {
            var  points   = pf.Points;
            bool onBorder = false;

            for (int i = 0; i < points.Count; i++)
            {
                int j  = (i + 1) % points.Count;
                var p1 = points[i];
                var p2 = points[j];

                if (p1.x - p2.x == 0 && p1.x == p.x)
                {
                    onBorder = p1.y < p2.y ? (p.y >= p1.y && p.y <= p2.y) : (p.y >= p2.y && p.y <= p1.y);
                }
                else if (p1.y - p2.y == 0 && p1.y == p.y)
                {
                    onBorder = p1.x < p2.x ? (p.x >= p1.x && p.x <= p2.x) : (p.x >= p2.x && p.x <= p1.x);
                }
                else
                {
                    var lc = new LineCutter(points[i], points[j], p, p);
                    if (lc.SimpleCutYFormule(p.x) == p.y)
                    {
                        onBorder = p1.x < p2.x ? (p.x >= p1.x && p.x <= p2.x) : (p.x >= p2.x && p.x <= p1.x);
                    }
                }
                if (onBorder)
                {
                    return(true);
                }
            }
            return(false);
        }
Exemple #3
0
        private bool IsInPoligon(FigurePoint point, PolygonFigure pf)
        {
            int  i1, i2, n, N, S, S1, S2, S3;
            bool flag = false;

            N = pf.Points.Count;
            var p = pf.Points;

            for (n = 0; n < N; n++)
            {
                flag = false;
                i1   = n < N - 1 ? n + 1 : 0;
                while (!flag)
                {
                    i2 = i1 + 1;
                    if (i2 >= N)
                    {
                        i2 = 0;
                    }
                    if (i2 == (n < N - 1 ? n + 1 : 0))
                    {
                        break;
                    }
                    S = Math.Abs(p[i1].x * (p[i2].y - p[n].y) +
                                 p[i2].x * (p[n].y - p[i1].y) +
                                 p[n].x * (p[i1].y - p[i2].y));
                    S1 = Math.Abs(p[i1].x * (p[i2].y - point.y) +
                                  p[i2].x * (point.y - p[i1].y) +
                                  point.x * (p[i1].y - p[i2].y));
                    S2 = Math.Abs(p[n].x * (p[i2].y - point.y) +
                                  p[i2].x * (point.y - p[n].y) +
                                  point.x * (p[n].y - p[i2].y));
                    S3 = Math.Abs(p[i1].x * (p[n].y - point.y) +
                                  p[n].x * (point.y - p[i1].y) +
                                  point.x * (p[i1].y - p[n].y));
                    if (S == S1 + S2 + S3)
                    {
                        flag = true;
                        break;
                    }
                    i1 = i1 + 1;
                    if (i1 >= N)
                    {
                        i1 = 0;
                    }
                }
                if (!flag)
                {
                    break;
                }
            }
            return(flag);
        }
Exemple #4
0
 public LineCutter(FigurePoint cutterP1, FigurePoint cutterP2, FigurePoint figureP1, FigurePoint figureP2)
 {
     Cp1   = cutterP1;
     Cp2   = cutterP2;
     Fp1   = figureP1;
     Fp2   = figureP2;
     Cutdx = cutterP2.x - cutterP1.x;
     Cutdy = cutterP2.y - cutterP1.y;
     Cutk  = (double)Cutdy / Cutdx;
     Figdx = figureP2.x - figureP1.x;
     Figdy = figureP2.y - figureP1.y;
     Figk  = (double)Figdy / Figdx;
 }
Exemple #5
0
        private FigurePoint FindCutPoint(FigurePoint cutterP1, FigurePoint cutterP2, FigurePoint figureP1, FigurePoint figureP2)
        {
            if (cutterP2.x < cutterP1.x)
            {
                var p = cutterP1;
                cutterP1 = cutterP2;
                cutterP2 = p;
            }
            if (figureP2.x < figureP1.x)
            {
                var p = figureP1;
                figureP1 = figureP2;
                figureP2 = p;
            }
            var lc = new LineCutter(cutterP1, cutterP2, figureP1, figureP2);

            return(lc.getPoint());
        }
Exemple #6
0
        private List <FigurePoint> FindCutPoints(FigurePoint p1, FigurePoint p2, PolygonFigure pf)
        {
            List <FigurePoint> list = new List <FigurePoint>();

            for (int i = 0; i < pf.Points.Count; i++)
            {
                int j = (i + 1) % pf.Points.Count;
                list.Add(FindCutPoint(pf.Points[i], pf.Points[j], p1, p2));
            }

            if (p2.x < p1.x)
            {
                list.Sort(new DecPointComparer());
                list = list.Where(p => p.x != -1).ToList();
            }
            else
            {
                list.Sort(new IncPointComparer());
                list = list.Where(p => p.x != -1).ToList();
            }
            return(list);
        }
Exemple #7
0
        public FigurePoint getPoint()
        {
            if ((Cp1.x == Cp2.x && Cp1.y == Cp2.y) || (Fp1.x == Fp2.x && Fp1.y == Fp2.y))
            {
                return(new FigurePoint(-1, -1, LineDrawType.Solid));
            }

            var isParallel = (Cutdx != 0 && Figdx != 0 &&
                              Cutdy != 0 && Figdy != 0 &&
                              Cutdx % Figdx == 0 && Cutdx * Figdx > 0 &&
                              Cutdy % Figdy == 0 && Cutdy * Figdy > 0) ||
                             (Cutdx == 0 && Figdx == 0) ||
                             (Cutdy == 0 && Figdy == 0);

            if (isParallel)
            {
                return(new FigurePoint(-1, -1, LineDrawType.Solid));
            }

            int x;
            int y;

            if (Figdx == 0 || Cutdx == 0)
            {
                if (Figdy == 0 || Cutdy == 0)
                {
                    x = VerticalAndHorizontalXFormule();
                    y = VerticalAndHorizontalYFormule();
                }
                else
                {
                    if (Figdx == 0)
                    {
                        y = FigureVerticalYFormule();
                        x = SimpleCutXFormule(y);
                    }
                    else
                    {
                        y = CutterVerticalYFormule();
                        x = SimpleFigXFormule(y);
                    }
                }
            }
            else if (Figdy == 0 || Cutdy == 0)
            {
                if (Figdx == 0)
                {
                    x = FigureHorizontalXFormule();
                    y = SimpleCutYFormule(x);
                }
                else
                {
                    x = CutterHorizontalXFormule();
                    y = SimpleFigYFormule(x);
                }
            }
            else
            {
                x = GeneralizedXFormule();
                y = SimpleCutYFormule(x);
            }

            var fp = new FigurePoint(x, y, LineDrawType.Solid);

            if (isValueNotInRange(x, Fp1.x, Fp2.x, Cp1.x, Cp2.x))
            {
                return(new FigurePoint(-1, -1, LineDrawType.Solid));
            }
            if (isValueNotInRange(y, Fp1.y, Fp2.y, Cp1.y, Cp2.y))
            {
                return(new FigurePoint(-1, -1, LineDrawType.Solid));
            }
            if (fp.Equals(Fp1) || fp.Equals(Fp2) || fp.Equals(Cp1) || fp.Equals(Cp2))
            {
                return(new FigurePoint(-1, -1, LineDrawType.Solid));
            }

            return(fp);
        }
Exemple #8
0
 public bool Equals(FigurePoint fp)
 {
     return(x == fp.x && y == fp.y);
 }