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); } }
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); }
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); }