示例#1
0
        public static ParallelResult ParallelCheck(
            Point pta, Vector da,          //bod a vektor prvni primky
            Point ptb, Vector db,          //bod a vektor druhe primky
            out Point retRel,              // vraci relativni souradnice ( x = begin, y = end) na prvni primce
            out bool direct)               // smer vektoru primek, true stejny smer, false opacny smer
        {
            retRel = new Point();
            direct = false;
            var rr = Funcs2D.IsParallel(da, db);

            if (rr == 0)
            {
                return(ParallelResult.Nothing);
            }
            direct = rr > 0;

            retRel.X = Funcs2D.PointToLine(pta, da, ptb);
            retRel.Y = Funcs2D.PointToLine(pta, da, ptb.Plus(db));

            if (Funcs2D.IsThreePointsOnLine(pta, pta.Plus(da), ptb))
            {
                return(ParallelResult.ParallelOn);
            }
            else
            {
                return(ParallelResult.ParallelOut);
            }
        }
示例#2
0
        private Object[] f_MakeCross()
        {
            Object[]     ret    = new Object[2];
            List <Point> retPt  = new List <Point>();
            List <int>   retInx = new List <int>();

            Point[] bln = null, eln;             // ofsetovane usecky
            int     b, m, e, len;

            if (IsClosed)
            {
                b   = mySrc.Length - 1;
                m   = 0;
                len = mySrc.Length;
            }
            else
            {
                b   = 0;
                m   = 1;
                len = mySrc.Length - 1;
            }

            for (; m < len; m++)
            {
                e = m + 1;
                if (e == mySrc.Length)
                {
                    e = 0;
                }

                // test totoznych bodu
                if (Funcs2D.IsEqual(mySrc[b].Pt, mySrc[m].Pt, Funcs2D.Epson))
                {
                    b = m;
                    continue;                      // vynecham
                }

                // test tri body na jedne primce
                if (Funcs2D.IsThreePointsOnLine(mySrc[b].Pt, mySrc[m].Pt, mySrc[e].Pt, Funcs2D.Epson))
                {
                    b = m;
                    continue;                      // vynecham
                }

                //vypocitam offsety
                if (bln == null)
                {
                    bln = Funcs2D.LineOffset(mySrc[b].Pt, mySrc[m].Pt, mySrc[b].Offset);
                }
                eln = Funcs2D.LineOffset(mySrc[m].Pt, mySrc[e].Pt, mySrc[m].Offset);

                if (!IsClosed && b == 0)
                {
                    retPt.Add(bln[0]);
                    retInx.Add(0);
                }

                // prusecik
                TwoLine2D.CrossAbs(bln[0], bln[1],
                                   eln[0], eln[1],
                                   TwoLine2D.CrossStatus.Infinite, out Point rpt);
                retPt.Add(rpt);
                retInx.Add(m);

                if (!IsClosed && e == len)
                {
                    retPt.Add(eln[1]);
                    retInx.Add(len);
                }

                b   = m;
                bln = eln;
            }
            if (len == 1)
            {
                bln = Funcs2D.LineOffset(mySrc[b].Pt, mySrc[m].Pt, mySrc[b].Offset);
                retPt.Add(bln[0]);
                retInx.Add(0);
                retPt.Add(bln[1]);
                retInx.Add(1);
            }
            ret[0] = retPt;
            ret[1] = retInx;
            return(ret);
        }
示例#3
0
        private static bool f_PolygonPure(Point[] pt, bool closed, double limit, ref List <int> ret)
        {
            if (pt.Length < 2)
            {
                if (ret != null)
                {
                    ret = new List <int>()
                    {
                        0
                    }
                }
                ;
                return(false);
            }

            int b, m, e, len;

            if (closed)
            {
                // budu zmensovat delku tak dlouho dokud nebude prvni, posledni a predposledni bod na jedne primce
                for (len = pt.Length; len > 2; len--)
                {
                    if (!Funcs2D.IsThreePointsOnLine(pt[0], pt[len - 1], pt[len - 2], limit))
                    {
                        break;
                    }
                    else
                    {
                        if (ret == null)
                        {
                            return(false);                                    // testovani
                        }
                    }
                }

                // jeste otestuji s poslednim a druhym
                if (!Funcs2D.IsThreePointsOnLine(pt[len - 1], pt[0], pt[1], limit))
                {
                    if (ret != null)
                    {
                        ret.Add(0);
                    }
                }
                else
                if (ret == null)
                {
                    return(false);                                    // testovani
                }
            }
            else
            {
                // budu zmensovat delku tak dlouho dokud nebude prvni a posledni bod stejny
                // musim zajistit aby byl polygon skutecne otevreny
                for (len = pt.Length; len > 1; len--)
                {
                    if (!Funcs2D.IsEqual(pt[0], pt[len - 1], limit))
                    {
                        break;
                    }
                    else
                    {
                        if (ret == null)
                        {
                            return(false);                                    // testovani
                        }
                    }
                }
                if (ret != null)
                {
                    ret.Add(0);
                }
            }

            // skoncim u predposledniho bodu
            len--;

            // zapisu prvni bod

            bool saved = true;

            for (b = 0, m = 1, e = 2; m < len; e++)
            {
                if (Funcs2D.IsThreePointsOnLine(pt[b], pt[m], pt[e], limit))
                {
                    if (ret == null)
                    {
                        return(false);                                // testovani
                    }
                    if (m > b + 1)
                    {
                        if (!Funcs2D.IsThreePointsOnLine(pt[b], pt[b + 1], pt[e], limit))
                        {
                            if (ret != null)
                            {
                                ret.Add(b + 1);
                            }
                            saved = false;
                            b     = b + 1;
                            m     = b + 1;
                            e     = m;
                            continue;
                        }
                    }

                    saved = false;
                    m     = e;
                    continue;                      // vynecham
                }
                if (ret != null)
                {
                    ret.Add(m);
                }
                saved = true;
                b     = m;
                m     = e;
            }

            // zapisu posledni
            if (saved)
            {
                if (ret != null)
                {
                    ret.Add(len);                              // rovnou zapisu pokud predposledni bod prosel kontrolou
                }
            }
            else
            {
                //zapisu pouze pokud posledni a predposledni neni shodny
                if (!Funcs2D.IsEqual(pt[len - 1], pt[len], limit))
                {
                    if (ret != null)
                    {
                        ret.Add(len);
                    }
                }
            }

            return(true);
        }