コード例 #1
0
 public void ParamSwap(int pozStart)
 {
     for (int poz = pozStart; poz < this.linters.Count; poz++)
     {
         InfoInters inters = linters[poz] as InfoInters;
         inters.ParamSwap();
     }
 }
コード例 #2
0
ファイル: Intersect.cs プロジェクト: sjvudp/Font-Validator
        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;
        }
コード例 #3
0
ファイル: Intersect.cs プロジェクト: bitforks/Font-Validator
        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;
        }