public BCurve SubCurve(Param parA, Param parB) { if ((!this.IsEvaluableStrict(parA)) || (!this.IsEvaluableStrict(parB))) { return(null); } Bez2D bezWork = new Bez2D(this); double valA = parA.Val; double valB = parB.Val; if (valA > valB) { bezWork.Reverse(); valA = 1 - valA; valB = 1 - valB; } /* * if ((valS==0)&&(valE==1)) * return new Bez2D(bezWork); * CurveD curveS, curveE; * if (valS==0) * { * bezWork.Subdivide(valB,out curveS, out curveE); * return curveS; * } * if (valE==1) * { * bezWork.Subdivide(valA,out curveS, out curveE); * return curveE; * } */ VecD a01, a12, b01, b12; a01 = (1 - valA) * bezWork.Cp(0) + valA * bezWork.Cp(1); a12 = (1 - valA) * bezWork.Cp(1) + valA * bezWork.Cp(2); b01 = (1 - valB) * bezWork.Cp(0) + valB * bezWork.Cp(1); b12 = (1 - valB) * bezWork.Cp(1) + valB * bezWork.Cp(2); VecD start, mid, end; start = (1 - valA) * a01 + valA * a12; end = (1 - valB) * b01 + valB * b12; mid = (1 - valB) * a01 + valB * a12; // mid=(1-valA)*(1-valB)*bezWork.Cp(0)+valA*valB*bezWork.Cp(2)+ // ((1-valB)*valA+(1-valA)*valB))*bezWork.Cp(1); return(new Bez2D(start, mid, end)); }
public bool ProjectGeneral(Bez2D bez, out Param[] pars, out VecD pnt) { /* * MEANING: parameter (or parameters) of the nearest point * in range [0,1] * * ASSUMPTIONS: bezier can be non-reduced * bezier can be self-intersecting * */ pars=null; pnt=null; Param parM; if (!bez.IsSelfInters(out parM)) { Param par; if (!this.Project(bez,out par,out pnt)) return false; if (par!=null) { pars=new Param[1]; pars[0]=par; } return true; } double valM=parM.Val; if (parM<0) { Bez2D bezRev=new Bez2D(bez); bezRev.Reverse(); if (!this.ProjectGeneral(bezRev,out pars,out pnt)) return false; if (pars!=null) { for (int iPar=0; iPar<pars.Length; iPar++) { pars[iPar].Reverse(1); } } return true; } SegD support=bez.SupportFlat(); Param parSupport; if (!this.Project(support,out parSupport, out pnt)) return false; if (!bez.ParamFromSupport(parSupport,out pars)) return false; return true; }
public BCurve SubCurve(Param parA, Param parB) { if ((!this.IsEvaluableStrict(parA))||(!this.IsEvaluableStrict(parB))) return null; Bez2D bezWork=new Bez2D(this); double valA=parA.Val; double valB=parB.Val; if (valA>valB) { bezWork.Reverse(); valA=1-valA; valB=1-valB; } /* if ((valS==0)&&(valE==1)) return new Bez2D(bezWork); CurveD curveS, curveE; if (valS==0) { bezWork.Subdivide(valB,out curveS, out curveE); return curveS; } if (valE==1) { bezWork.Subdivide(valA,out curveS, out curveE); return curveE; } */ VecD a01,a12,b01,b12; a01=(1-valA)*bezWork.Cp(0)+valA*bezWork.Cp(1); a12=(1-valA)*bezWork.Cp(1)+valA*bezWork.Cp(2); b01=(1-valB)*bezWork.Cp(0)+valB*bezWork.Cp(1); b12=(1-valB)*bezWork.Cp(1)+valB*bezWork.Cp(2); VecD start, mid, end; start=(1-valA)*a01+valA*a12; end=(1-valB)*b01+valB*b12; mid=(1-valB)*a01+valB*a12; // mid=(1-valA)*(1-valB)*bezWork.Cp(0)+valA*valB*bezWork.Cp(2)+ // ((1-valB)*valA+(1-valA)*valB))*bezWork.Cp(1); return new Bez2D(start,mid,end); }
public bool ProjectGeneral(Bez2D bez, out Param[] pars, out VecD pnt) { /* * MEANING: parameter (or parameters) of the nearest point * in range [0,1] * * ASSUMPTIONS: bezier can be non-reduced * bezier can be self-intersecting * */ pars = null; pnt = null; Param parM; if (!bez.IsSelfInters(out parM)) { Param par; if (!this.Project(bez, out par, out pnt)) { return(false); } if (par != null) { pars = new Param[1]; pars[0] = par; } return(true); } double valM = parM.Val; if (parM < 0) { Bez2D bezRev = new Bez2D(bez); bezRev.Reverse(); if (!this.ProjectGeneral(bezRev, out pars, out pnt)) { return(false); } if (pars != null) { for (int iPar = 0; iPar < pars.Length; iPar++) { pars[iPar].Reverse(1); } } return(true); } SegD support = bez.SupportFlat(); Param parSupport; if (!this.Project(support, out parSupport, out pnt)) { return(false); } if (!bez.ParamFromSupport(parSupport, out pars)) { return(false); } return(true); }