public InfoParamInters(Param parA, Param parB) : this() { if (parA == null) { this.param[0] = null; } else { this.param[0] = parA.Copy(); } if (parB == null) { this.param[1] = null; } else { this.param[1] = parB.Copy(); } }
public InfoParamInters(Param parA, Param parB): this() { if (parA==null) { this.param[0]=null; } else { this.param[0]=parA.Copy(); } if (parB==null) { this.param[1]=null; } else { this.param[1]=parB.Copy(); } }
public bool ParamFromSupport(Param parSupport, out Param[] parsBez) { parsBez = null; parSupport.Round(0, 1); if ((parSupport.Val < 0) || (parSupport.Val > 1)) { throw new ExceptionGMath("Bez2D", "ParamFromSupport", "Outside [0,1]"); //return false; } Param parM; if (!this.IsSelfInters(out parM)) { parsBez = new Param[1]; parsBez[0] = parSupport.Copy(); this.ParamFromSeg(parsBez[0]); return(true); } // self-intersecting Bezier double valM = parM.Val; if (valM == Param.Infinity) { double tau = 0.5 * parSupport.Val; // parameter with respect to [Cp(0),Cp(1)] parsBez = new Param[2]; parsBez[0] = new Param(0.5 * (1 - Math.Sqrt(1 - 2 * tau))); parsBez[1] = new Param(0.5 * (1 + Math.Sqrt(1 - 2 * tau))); return(true); } else if (valM > 1) { double tau = ((valM * valM) / (1 - 2 * valM)) * parSupport.Val; double D = valM * valM + tau * (1 - 2 * valM); if (Math.Abs(D) < MConsts.EPS_DEC) { D = 0; } if (D < 0) { throw new ExceptionGMath("BezD", "ParamFromSegGeneral", null); //return false; } if (tau < 1) { parsBez = new Param[1]; parsBez[0] = new Param((valM - Math.Sqrt(D)) / (1 - 2 * valM)); } else // 1<=tau<=(valM*valM)/(1-2*valM) { parsBez = new Param[2]; parsBez[0] = new Param((valM - Math.Sqrt(D)) / (1 - 2 * valM)); parsBez[1] = new Param((valM + Math.Sqrt(D)) / (1 - 2 * valM)); } return(true); } else { // valM<=1 Bez2D bezRev = this.Reversed as Bez2D; if (!bezRev.ParamFromSupport(1 - parSupport.Val, out parsBez)) { return(false); } if (parsBez == null) { return(true); } for (int iParBez = 0; iParBez < parsBez.Length; iParBez++) { parsBez[iParBez].Reverse(1); } return(true); } throw new ExceptionGMath("Bez2D", "ParamFromSupport", "NOT IMPLEMENTED"); //return false; }
public bool ParamFromSupport(Param parSupport, out Param[] parsBez) { parsBez=null; parSupport.Round(0,1); if ((parSupport.Val<0)||(parSupport.Val>1)) { throw new ExceptionGMath("Bez2D","ParamFromSupport",null); //return false; } Param parM; if (!this.IsSelfInters(out parM)) { parsBez=new Param[1]; parsBez[0]=parSupport.Copy(); this.ParamFromSeg(parsBez[0]); } // self-intersecting Bezier double valM=parM.Val; if (valM==Param.Infinity) { double tau=0.5*parSupport.Val; // parameter with respect to [Cp(0),Cp(1)] parsBez=new Param[2]; parsBez[0]=new Param(0.5*(1-Math.Sqrt(1-2*tau))); parsBez[1]=new Param(0.5*(1+Math.Sqrt(1-2*tau))); } else if (valM>1) { double tau=((valM*valM)/(1-2*valM))*parSupport.Val; double D=valM*valM+tau*(1-2*valM); if (Math.Abs(D)<MConsts.EPS_DEC) { D=0; } if (D<0) { throw new ExceptionGMath("BezD","ParamFromSegGeneral",null); //return false; } if (tau<1) { parsBez=new Param[1]; parsBez[0]=new Param((valM-Math.Sqrt(D))/(1-2*valM)); } else // 1<=tau<=(valM*valM)/(1-2*valM) { parsBez=new Param[2]; parsBez[0]=new Param((valM-Math.Sqrt(D))/(1-2*valM)); parsBez[1]=new Param((valM+Math.Sqrt(D))/(1-2*valM)); } return true; } else { // valM<0 Bez2D bezRev=this.Reversed as Bez2D; if (!bezRev.ParamFromSupport(1-parSupport.Val, out parsBez)) return false; if (parsBez==null) return true; for (int iParBez=0; iParBez<parsBez.Length; iParBez++) { parsBez[iParBez].Reverse(1); } return true; } throw new ExceptionGMath("Bez2D","ParamFromSupport","NOT IMPLEMENTED"); //return false; }