override public void ClearRelease() { this.ipis[0].ClearRelease(); this.ipis[0] = null; this.ipis[1].ClearRelease(); this.ipis[1] = null; this.ipis = null; // TODO: try curveInters.ClearRelease this.curveInters = null; }
/* * CONSTRUCTORS */ public IntersD1(Param parInA, Param parInB, Param parOutA, Param parOutB, Curve curveInters, bool includeBezSI) { this.ipis = new InfoParamInters[2]; this.ipis[0] = new InfoParamInters(parInA, parInB); this.ipis[1] = new InfoParamInters(parOutA, parOutB); this.curveInters = (curveInters == null)? null: curveInters.Copy(); this.includeBezSI = includeBezSI; }
public bool Inverse(Curve curve, out Param par) { par = null; if (curve is LCurve) { return(this.Inverse(curve as LCurve, out par)); } if (curve is Bez2D) { return(this.Inverse(curve as Bez2D, out par)); } throw new ExceptionGMath("VecD", "Inverse(curve)", "NOT IMPLEMENTED"); //return false; }
override public void ClearRelease() { this.ipis[0].ClearRelease(); this.ipis[0]=null; this.ipis[1].ClearRelease(); this.ipis[1]=null; this.ipis=null; // TODO: try curveInters.ClearRelease this.curveInters=null; }
/* * CONSTRUCTORS */ public IntersD1(Param parInA, Param parInB, Param parOutA, Param parOutB, Curve curveInters, bool includeBezSI) { this.ipis=new InfoParamInters[2]; this.ipis[0]=new InfoParamInters(parInA, parInB); this.ipis[1]=new InfoParamInters(parOutA, parOutB); this.curveInters=(curveInters==null)? null: curveInters.Copy(); this.includeBezSI=includeBezSI; }
/* * REFINE INTERSECTION D1 */ public static bool RefineIntersBBD1(BCurve curveA, BCurve curveB, out InfoInters inters) { /* * ASSUMPTIONS: * - curveA & curveB are MAXIMALLY REDUCED * - intersection is KNOWN to have dimension D1 * - does not work in case of SI beziers * => OR: both curveA & curveB are SEGMENTS * OR: both curveA & curveB are BEZIER */ inters = null; InfoInters selfinters; if (curveA.IsSelfInters(out selfinters) || curveB.IsSelfInters(out selfinters)) { throw new ExceptionGMath("Intersect", "RefineIntersBBD1", null); //return false; } VecD a0 = curveA.Start; VecD a1 = curveA.End; Param paramBInvA0, paramBInvA1; bool isOn; if (!a0.InverseOn(curveB, out isOn, out paramBInvA0) || (!isOn)) { return(false); } if (!a1.InverseOn(curveB, out isOn, out paramBInvA1) || (!isOn)) { return(false); } paramBInvA0.Round(0, 1); paramBInvA1.Round(0, 1); bool areCoDirected = (paramBInvA1 >= paramBInvA0); if (!areCoDirected) { BCurve revB = curveB.Reversed as BCurve; if (!Inters.RefineIntersBBD1(curveA, revB, out inters)) { return(false); } if (inters != null) { inters.ParamReverse(1, 1); } return(true); } VecD b0 = curveB.Start; VecD b1 = curveB.End; Param paramAInvB0, paramAInvB1; if (!b0.InverseOn(curveA, out isOn, out paramAInvB0) || (!isOn)) { return(false); } if (!b1.InverseOn(curveA, out isOn, out paramAInvB1) || (!isOn)) { return(false); } paramAInvB0.Round(0, 1); paramAInvB1.Round(0, 1); Param paramInA = null, paramInB = null, paramOutA = null, paramOutB = null; VecD pntIn = null, pntOut = null; if (paramBInvA0 <= 0) // before or start { paramInA = paramAInvB0; paramInB = 0; pntIn = b0; } else if (paramBInvA0 < 1) // inner { paramInA = 0; paramInB = paramBInvA0; pntIn = a0; } if ((paramBInvA1 >= 0) && (paramBInvA1 <= 1)) // inner or end { paramOutA = 1; paramOutB = paramBInvA1; pntOut = a1; } else if (paramBInvA1 > 1) // after { paramOutA = paramAInvB1; paramOutB = 1; pntOut = b1; } if ((pntIn == null) || (pntOut == null)) { throw new ExceptionGMath("Intersect", "RefineIntersBBD1", null); //return false; } Curve curveInters = curveA.SubCurve(paramInA, paramOutA); inters = new IntersD1(paramInA, paramInB, paramOutA, paramOutB, curveInters, false); return(true); }
public bool Inverse(Curve curve, out Param par) { par=null; if (curve is LCurve) { return (this.Inverse(curve as LCurve,out par)); } if (curve is Bez2D) { return (this.Inverse(curve as Bez2D,out par)); } throw new ExceptionGMath("VecD","Inverse(curve)","NOT IMPLEMENTED"); //return false; }
public bool InverseOn(Curve curve, out bool isOn, out Param par) { isOn=false; par=null; if (curve is LCurve) { return this.InverseOn(curve as LCurve, out isOn, out par); } if (curve is Bez2D) { return this.InverseOn(curve as Bez2D, out isOn, out par); } throw new ExceptionGMath("VecD","InverseOn","NOT IMPLEMENTED"); //return false; }