public void ParamSwap(int pozStart) { for (int poz = pozStart; poz < this.linters.Count; poz++) { InfoInters inters = linters[poz] as InfoInters; inters.ParamSwap(); } }
public static bool RefineIntersLLD1(LCurve lrsA, LCurve lrsB, out InfoInters inters) { inters = null; if ((lrsA is SegD) && (lrsB is SegD)) { BCurve curveA = lrsA as BCurve; BCurve curveB = lrsB as BCurve; return(Inters.RefineIntersBBD1(curveA, curveB, out inters)); } if (lrsA.LComplexity > lrsB.LComplexity) { bool res = Inters.RefineIntersLLD1(lrsB, lrsA, out inters); if (inters != null) { inters.ParamSwap(); } return(res); } VecD a0 = lrsA.Start; VecD a1 = lrsA.End; VecD b0 = lrsB.Start; VecD b1 = lrsB.End; Param paramBInvA0, paramBInvA1; bool isOn; if ((!a0.InverseOn(lrsB, out isOn, out paramBInvA0)) || (!isOn)) { return(false); } if ((!a1.InverseOn(lrsB, out isOn, out paramBInvA1)) || (!isOn)) { return(false); } Param paramAInvB0, paramAInvB1; if ((!b0.InverseOn(lrsA, out isOn, out paramAInvB0)) || (!isOn)) { return(false); } if ((!b1.InverseOn(lrsA, out isOn, out paramAInvB1)) || (!isOn)) { return(false); } bool areCoDirected = (paramBInvA1.Val >= paramBInvA0.Val); if (!areCoDirected) { if (lrsA is LineD) { if (lrsB is LineD) { paramAInvB0 = (areCoDirected)? -Param.Infinity: Param.Infinity; paramAInvB1 = (areCoDirected)? Param.Infinity: -Param.Infinity; inters = new IntersD1(paramAInvB0, -Param.Infinity, paramAInvB1, Param.Infinity, lrsB, false); return(true); } if (lrsB is RayD) { paramAInvB1 = (areCoDirected)? Param.Infinity: -Param.Infinity; inters = new IntersD1(paramAInvB0, 0, paramAInvB1, Param.Infinity, lrsB, false); return(true); } if (lrsB is SegD) { inters = new IntersD1(paramAInvB0, 0, paramAInvB1, 1, lrsB, false); return(true); } } if (lrsA is RayD) { if (lrsB is RayD) { if (areCoDirected) { if (paramAInvB0 > 0) { inters = new IntersD1(paramAInvB0, 0, Param.Infinity, Param.Infinity, lrsB, false); return(true); } else { inters = new IntersD1(0, paramBInvA0, Param.Infinity, Param.Infinity, lrsA, false); return(true); } } else { if (paramAInvB0 > 0) { inters = new IntersD1(0, paramBInvA0, paramAInvB0, 0, new SegD(a0, b0), false); return(true); } } } if (lrsB is SegD) { // intersection is known to have dimension D1 !!! if ((paramBInvA0 >= 1) || (paramBInvA0 <= 0)) { inters = new IntersD1(paramAInvB0, 0, paramAInvB1, 1, new SegD(b0, b1), false); return(true); } if ((0 < paramBInvA0) && (paramBInvA1 < 1)) { if (areCoDirected) { inters = new IntersD1(0, paramBInvA0, paramAInvB1, 1, new SegD(a0, b1), false); return(true); } else { inters = new IntersD1(0, paramBInvA0, paramAInvB0, 0, new SegD(a0, b0), false); return(true); } } } } } throw new ExceptionGMath("Intersect", "RefineIntersLLD1", null); //return false; }
public static bool RefineIntersLLD1(LCurve lrsA, LCurve lrsB, out InfoInters inters) { inters=null; if ((lrsA is SegD) && (lrsB is SegD)) { BCurve curveA=lrsA as BCurve; BCurve curveB=lrsB as BCurve; return Inters.RefineIntersBBD1(curveA, curveB, out inters); } if (lrsA.LComplexity>lrsB.LComplexity) { bool res=Inters.RefineIntersLLD1(lrsB,lrsA,out inters); if (inters!=null) { inters.ParamSwap(); } return res; } VecD a0=lrsA.Start; VecD a1=lrsA.End; VecD b0=lrsB.Start; VecD b1=lrsB.End; Param paramBInvA0, paramBInvA1; bool isOn; if ((!a0.InverseOn(lrsB, out isOn, out paramBInvA0))||(!isOn)) return false; if ((!a1.InverseOn(lrsB, out isOn, out paramBInvA1))||(!isOn)) return false; Param paramAInvB0, paramAInvB1; if ((!b0.InverseOn(lrsA, out isOn, out paramAInvB0))||(!isOn)) return false; if ((!b1.InverseOn(lrsA, out isOn, out paramAInvB1))||(!isOn)) return false; bool areCoDirected=(paramBInvA1.Val>=paramBInvA0.Val); if (!areCoDirected) { if (lrsA is LineD) { if (lrsB is LineD) { paramAInvB0=(areCoDirected)? -Param.Infinity: Param.Infinity; paramAInvB1=(areCoDirected)? Param.Infinity: -Param.Infinity; inters=new IntersD1(paramAInvB0,-Param.Infinity, paramAInvB1,Param.Infinity,lrsB,false); return true; } if (lrsB is RayD) { paramAInvB1=(areCoDirected)? Param.Infinity: -Param.Infinity; inters=new IntersD1(paramAInvB0,0, paramAInvB1,Param.Infinity,lrsB,false); return true; } if (lrsB is SegD) { inters=new IntersD1(paramAInvB0,0, paramAInvB1,1,lrsB,false); return true; } } if (lrsA is RayD) { if (lrsB is RayD) { if (areCoDirected) { if (paramAInvB0>0) { inters=new IntersD1(paramAInvB0,0, Param.Infinity,Param.Infinity,lrsB,false); return true; } else { inters=new IntersD1(0,paramBInvA0, Param.Infinity,Param.Infinity,lrsA,false); return true; } } else { if (paramAInvB0>0) { inters=new IntersD1(0,paramBInvA0, paramAInvB0,0,new SegD(a0,b0),false); return true; } } } if (lrsB is SegD) { // intersection is known to have dimension D1 !!! if ((paramBInvA0>=1)||(paramBInvA0<=0)) { inters=new IntersD1(paramAInvB0,0, paramAInvB1,1,new SegD(b0,b1),false); return true; } if ((0<paramBInvA0)&&(paramBInvA1<1)) { if (areCoDirected) { inters=new IntersD1(0,paramBInvA0, paramAInvB1,1,new SegD(a0,b1),false); return true; } else { inters=new IntersD1(0,paramBInvA0, paramAInvB0,0,new SegD(a0,b0),false); return true; } } } } } throw new ExceptionGMath("Intersect","RefineIntersLLD1",null); //return false; }