//always return one valid point.
        public bool GetIntersection(sLine ln, double tolerance, out sGeometryBase intGeo)
        {
            double t0;
            double t1;
            double dis = this.GetClosestDistanceBetween(ln, out t0, out t1);

            sLine  rl = this.Reversed();
            double rt0;
            double rt1;
            double rdis = rl.GetClosestDistanceBetween(ln, out rt0, out rt1);


            if (dis < tolerance && rdis < tolerance)
            {
                if (this.PointAt(t0).DistanceTo(rl.PointAt(rt0)) > tolerance)
                {
                    //line
                    intGeo = new sLine(this.PointAt(t0), rl.PointAt(rt0));
                    return(true);
                }
                else
                {
                    //point
                    intGeo = this.PointAt(t0);
                    return(true);
                }
            }
            else
            {
                //none
                intGeo = null;
                return(false);
            }
        }
Beispiel #2
0
        public void ComputeFaceNormal(sMesh m)
        {
            sLine l0 = new sLine(m.vertices[this.A].location, m.vertices[this.B].location);
            sLine l1 = new sLine(m.vertices[this.A].location, m.vertices[this.C].location);

            this.normal = sXYZ.CrossProduct(l0.direction, l1.direction);
        }
        public sLine DuplicatesLine()
        {
            sLine nl = new sLine(this.startPoint.DuplicatesXYZ(), this.endPoint.DuplicatesXYZ());

            nl.objectGUID = this.objectGUID;
            return(nl);
        }
Beispiel #4
0
        public double ParameterOn(sLine ln)
        {
            double t;

            ln.GetClosestDistanceTo(this, out t);
            return(t);
        }
        public double GetClosestDistanceTo(sXYZ p, out double t)
        {
            sXYZ  minuteVec = new sXYZ(0.00001, 0, 0);
            sLine ln        = new sLine(p, p + minuteVec);

            double t0;
            double t1;
            double dis = this.GetClosestDistanceBetween(ln, out t0, out t1);

            t = t0;
            return(dis);
        }
        public bool Intersect(sCurve c, double tol, out List <sXYZ> intPts, out List <sCurve> intCrvs)
        {
            bool          doesIntersect = false;
            List <sXYZ>   ips           = new List <sXYZ>();
            List <sCurve> ics           = new List <sCurve>();

            if (this.curveType == eCurveType.LINE && c.curveType == eCurveType.LINE)
            {
                sLine         l1 = this as sLine;
                sLine         l2 = c as sLine;
                sGeometryBase igeo;
                doesIntersect = l1.GetIntersection(l2, tol, out igeo);
                if (igeo is sLine)
                {
                    ics.Add(igeo as sCurve);
                }
                else if (igeo is sXYZ)
                {
                    ips.Add(igeo as sXYZ);
                }
            }
            else if (this.curveType == eCurveType.LINE && c.curveType == eCurveType.POLYLINE)
            {
                sPolyLine pl = c as sPolyLine;
                pl.GetIntersection(this, tol, out ips, out ics);
            }
            else if (this.curveType == eCurveType.POLYLINE && c.curveType == eCurveType.LINE)
            {
                sPolyLine pl = this as sPolyLine;
                pl.GetIntersection(c, tol, out ips, out ics);
            }
            else if (this.curveType == eCurveType.POLYLINE && c.curveType == eCurveType.POLYLINE)
            {
                sPolyLine pl = this as sPolyLine;
                pl.GetIntersection(c, tol, out ips, out ics);
            }
            intCrvs = ics;
            intPts  = ips;
            return(doesIntersect);
        }
 public sCurve DuplicatesCurve()
 {
     if (this.curveType == eCurveType.LINE)
     {
         sLine sc = this as sLine;
         return(sc.DuplicatesLine());
     }
     else if (this.curveType == eCurveType.POLYLINE)
     {
         sPolyLine thispl = this as sPolyLine;
         return(thispl.DuplicatesPolyline());
     }
     else if (this.curveType == eCurveType.NURBSCURVE)
     {
         sNurbsCurve nc = this as sNurbsCurve;
         return(nc.DuplicatesNurbsCurve());
     }
     else
     {
         return(null);
     }
 }
        public sLine Reversed()
        {
            sLine rl = new sLine(this.endPoint, this.startPoint);

            return(rl);
        }
        public double GetClosestDistanceBetween(sLine ln, out double t0, out double t1)
        {
            sXYZ u = this.endPoint - this.startPoint;
            sXYZ v = ln.endPoint - ln.startPoint;
            sXYZ w = this.startPoint - ln.startPoint;

            double a = u * u; // sXYZ.Dot(u, u);
            double b = u * v; // sXYZ.Dot(u, v);
            double c = v * v; // sXYZ.Dot(v, v);
            double d = u * w; // sXYZ.Dot(u, w);
            double e = v * w; // sXYZ.Dot(v, w);

            double D  = (a * c) - (b * b);
            double sc = 0.0;
            double sN = 0.0;
            double sD = D;
            double tc = 0.0;
            double tN = 0.0;
            double tD = D;


            if (D < 0.00001)
            {
                //parallel
                sN = 0.0;
                sD = 1.0;
                tN = e;
                tD = c;
            }
            else
            {
                sN = (b * e - c * d);
                tN = (a * e - b * d);
                if (sN < 0.0)
                {
                    sN = 0.0;
                    tN = e;
                    tD = c;
                }
                else if (sN > sD)
                {
                    sN = sD;
                    tN = e + b;
                    tD = c;
                }
            }

            if (tN < 0.0)
            {
                tN = 0.0;
                if (-d < 0.0)
                {
                    sN = 0.0;
                }
                else if (-d > a)
                {
                    sN = sD;
                }
                else
                {
                    sN = -d;
                    sD = a;
                }
            }
            else if (tN > tD)
            {
                tN = tD;
                if ((-d + b) < 0.0)
                {
                    sN = 0;
                }
                else if ((-d + b) > a)
                {
                    sN = sD;
                }
                else
                {
                    sN = (-d + b);
                    sD = a;
                }
            }

            if (Math.Abs(sN) < 0.0001)
            {
                sc = 0.0;
            }
            else
            {
                sc = (sN / sD);
            }
            if (Math.Abs(tN) < 0.0001)
            {
                tc = 0.0;
            }
            else
            {
                tc = (tN / tD);
            }


            sXYZ cp = w + (sc * u) - (tc * v);

            t0 = sc;
            t1 = tc;
            return(cp.GetLength());
        }