Пример #1
0
 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;
 }
Пример #2
0
 /*
  *        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;
 }
Пример #3
0
 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;
 }
Пример #4
0
 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;
 }
Пример #5
0
 /*
  *        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;
 }
Пример #6
0
        /*
         *        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);
        }
Пример #7
0
 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;
 }
Пример #8
0
 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;
 }