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