/// <summary> /// Calculates the intersection points of the two curves. /// </summary> /// <param name="curve1">First curve</param> /// <param name="curve2">Second curve</param> /// <param name="par1">Resulting parameters for the first curve</param> /// <param name="par2">Resulting parameters for the second curve</param> /// <param name="intersection">Three dimensional intersection points</param> /// <returns>Number of intersection points</returns> public static int Intersect(ICurve curve1, ICurve curve2, out double[] par1, out double[] par2, out GeoPoint[] intersection) { // wenn es eine gemeinsame Ebene gibt, dann in dieser Ebene schneiden if (GetCommonPlane(curve1, curve2, out Plane pln)) { ICurve2D c2d1 = curve1.GetProjectedCurve(pln); ICurve2D c2d2 = curve2.GetProjectedCurve(pln); GeoPoint2DWithParameter[] ips = c2d1.Intersect(c2d2); // geht die Parametrierung der projizierten Kurven analog zu den Originalen? // da wir ja nur in die Ebene Projizieren, in der sich duie Kurven ohnehin befinden, müsste das stimmen // das muss aber noch getestet werden par1 = new double[ips.Length]; par2 = new double[ips.Length]; intersection = new GeoPoint[ips.Length]; for (int i = 0; i < ips.Length; ++i) { par1[i] = ips[i].par1; par2[i] = ips[i].par2; intersection[i] = pln.ToGlobal(ips[i].p); } return(ips.Length); } // eine Linie und eine nichtebene Kurve noch gesondert prüfen if (curve1.GetPlanarState() == PlanarState.Planar) { double[] ips = curve2.GetPlaneIntersection(curve1.GetPlane()); List <double> lpar1 = new List <double>(); List <double> lpar2 = new List <double>(); List <GeoPoint> lip = new List <GeoPoint>(); for (int i = 0; i < ips.Length; ++i) { GeoPoint p = curve2.PointAt(ips[i]); double ppar1 = curve1.PositionOf(p); GeoPoint p1 = curve1.PointAt(ppar1); if (Precision.IsEqual(p, p1)) { lpar1.Add(ppar1); lpar2.Add(ips[i]); lip.Add(new GeoPoint(p, p1)); } } par1 = lpar1.ToArray(); par2 = lpar2.ToArray(); intersection = lip.ToArray(); return(par1.Length); } if (curve2.GetPlanarState() == PlanarState.Planar) { return(Intersect(curve2, curve1, out par2, out par1, out intersection)); } // Fehlt noch die Abfrage nach einer Linie, denn die ist ja nicht planar // allgemeiner Fall: zwei nicht ebene Kurven TetraederHull th1 = new TetraederHull(curve1); TetraederHull th2 = new TetraederHull(curve2); return(th1.Intersect(th2, out par1, out par2, out intersection)); }
/// <summary> /// Overrides <see cref="CADability.GeoObject.ISurfaceImpl.Intersect (ICurve, BoundingRect, out GeoPoint[], out GeoPoint2D[], out double[])"/> /// </summary> /// <param name="curve"></param> /// <param name="uvExtent"></param> /// <param name="ips"></param> /// <param name="uvOnFaces"></param> /// <param name="uOnCurve3Ds"></param> public override void Intersect(ICurve curve, BoundingRect uvExtent, out GeoPoint[] ips, out GeoPoint2D[] uvOnFaces, out double[] uOnCurve3Ds) { if (curve is Line) { GeoPoint ip; if (Plane.Intersect(curve.StartPoint, curve.StartDirection, out ip)) { ips = new GeoPoint[] { ip }; uvOnFaces = new GeoPoint2D[] { PositionOf(ip) }; uOnCurve3Ds = new double[] { curve.PositionOf(ip) }; } else { ips = new GeoPoint[0]; uvOnFaces = new GeoPoint2D[0]; uOnCurve3Ds = new double[0]; } #if DEBUG //GeoPoint[] ipsdbg; //GeoPoint2D[] uvOnFacesdbg; //double[] uOnCurve3Dsdbg; //base.Intersect(curve, out ipsdbg, out uvOnFacesdbg, out uOnCurve3Dsdbg); #endif return; } //else if (curve is IExplicitPCurve3D) //{ // ExplicitPCurve3D epc3d = (curve as IExplicitPCurve3D).GetExplicitPCurve3D(); // double [] res = epc3d.GetPlaneIntersection(Location, DirectionX, DirectionY); // for (int i = 0; i < res.Length; i++) // { // double d = Plane.Distance(epc3d.PointAt(res[i])); // if (i>0) d = Plane.Distance(epc3d.PointAt((res[i]+res[i-1])/2.0)); // } // double dd = Plane.Distance(epc3d.PointAt(epc3d.knots[epc3d.knots.Length - 1])); // for (int i = 0; i < res.Length; i++) // { // res[i] = (res[i] - epc3d.knots[0]) / (epc3d.knots[epc3d.knots.Length - 1] - epc3d.knots[0]); // } //} else { if (curve.GetPlanarState() == PlanarState.Planar) { GeoPoint loc; GeoVector dir; Plane pln = curve.GetPlane(); if (Plane.Intersect(curve.GetPlane(), out loc, out dir)) { ICurve2D c2d = curve.GetProjectedCurve(pln); BoundingRect ext = c2d.GetExtent(); ext.Inflate(ext.Height + ext.Width); // sonst entstehen null-Linien ICurve2D ll = new Line2D(pln.Project(loc), pln.Project(dir), ext); #if DEBUG DebuggerContainer dc = new DebuggerContainer(); dc.Add(c2d); dc.Add(ll); #endif GeoPoint2DWithParameter[] gpp = ll.Intersect(c2d); ips = new GeoPoint[gpp.Length]; uvOnFaces = new GeoPoint2D[gpp.Length]; uOnCurve3Ds = new double[gpp.Length]; for (int i = 0; i < gpp.Length; ++i) { ips[i] = pln.ToGlobal(gpp[i].p); uvOnFaces[i] = PositionOf(ips[i]); uOnCurve3Ds[i] = curve.PositionOf(ips[i]); } } else { ips = new GeoPoint[0]; uvOnFaces = new GeoPoint2D[0]; uOnCurve3Ds = new double[0]; } #if DEBUG //GeoPoint[] ipsdbg; //GeoPoint2D[] uvOnFacesdbg; //double[] uOnCurve3Dsdbg; //base.Intersect(curve, out ipsdbg, out uvOnFacesdbg, out uOnCurve3Dsdbg); #endif return; } } TetraederHull th = new TetraederHull(curve); // alle Kurven müssten eine gemeinsame basis habe, auf die man sich hier beziehen kann // damit die TetraederHull nicht mehrfach berechnet werden muss th.PlaneIntersection(this, out ips, out uvOnFaces, out uOnCurve3Ds); // base.Intersect(curve, out ips, out uvOnFaces, out uOnCurve3Ds); }