示例#1
0
 public void Copy(BoundingBox2D src)
 {
     MinX      = src.MinX;
     MaxX      = src.MaxX;
     MinY      = src.MinY;
     MaxY      = src.MaxY;
     IsntEmpty = src.IsntEmpty;
 }
示例#2
0
 public bool IsIntersect(BoundingBox2D bb, double clearance)
 {
     if (bb.MinX > MaxX + clearance || bb.MaxX < MinX - clearance)
     {
         return(false);
     }
     if (bb.MinY > MaxY + clearance || bb.MaxY < MinY - clearance)
     {
         return(false);
     }
     return(true);
 }
示例#3
0
        public static BoundingBox2D operator +(BoundingBox2D bb1, BoundingBox2D bb2)
        {
            BoundingBox2D result;

            if (!bb2.IsntEmpty)
            {
                result = new BoundingBox2D(bb1);
                return(result);
            }
            if (!bb1.IsntEmpty)
            {
                result = new BoundingBox2D(bb2);
                return(result);
            }

            double xMax = (bb1.MaxX > bb2.MaxX) ? bb1.MaxX : bb2.MaxX;
            double xMin = (bb1.MinX < bb2.MinX) ? bb1.MinX : bb2.MinX;
            double yMax = (bb1.MaxY > bb2.MaxY) ? bb1.MaxY : bb2.MaxY;
            double yMin = (bb1.MinY < bb2.MinY) ? bb1.MinY : bb2.MinY;

            result = new BoundingBox2D(xMin, xMax, yMin, yMax);
            return(result);
        }
示例#4
0
        public static int CheckEdgeIntersection(IList <Edge2D> edges)
        {
            uint edgeCnt = (uint)edges.Count;

            for (int iedge = 0; iedge < edgeCnt; iedge++)
            {
                Edge2D iE = edges[iedge];
                if (iE.IsCrossEdgeSelf())
                {
                    return(1);
                }
                uint          iPt0 = iE.GetVertexId(true);
                uint          iPt1 = iE.GetVertexId(false);
                BoundingBox2D iBB  = iE.GetBoundingBox();
                for (int jedge = iedge + 1; jedge < edgeCnt; jedge++)
                {
                    Edge2D jE   = edges[jedge];
                    uint   jPt0 = jE.GetVertexId(true);
                    uint   jPt1 = jE.GetVertexId(false);
                    if ((iPt0 - jPt0) * (iPt0 - jPt1) * (iPt1 - jPt0) * (iPt1 - jPt1) != 0)
                    {
                        BoundingBox2D jBB = jE.GetBoundingBox();
                        if (jBB.MinX > iBB.MaxX || jBB.MaxX < iBB.MinX)
                        {
                            continue;
                        }
                        if (jBB.MinY > iBB.MaxY || jBB.MaxY < iBB.MinY)
                        {
                            continue;
                        }
                        if (!iE.IsCrossEdge(jE))
                        {
                            continue;
                        }
                        return(1);
                    }
                    if (iPt0 == jPt0 && iPt1 == jPt1)
                    {
                        if (iE.IsCrossEdgeShareBothPoints(jE, true))
                        {
                            return(1);
                        }
                    }
                    else if (iPt0 == jPt1 && iPt1 == jPt0)
                    {
                        if (iE.IsCrossEdgeShareBothPoints(jE, false))
                        {
                            return(1);
                        }
                    }
                    else if (iPt0 == jPt0)
                    {
                        if (iE.IsCrossEdgeShareOnePoint(jE, true, true))
                        {
                            return(1);
                        }
                    }
                    else if (iPt0 == jPt1)
                    {
                        if (iE.IsCrossEdgeShareOnePoint(jE, true, false))
                        {
                            return(1);
                        }
                    }
                    else if (iPt1 == jPt0)
                    {
                        if (iE.IsCrossEdgeShareOnePoint(jE, false, true))
                        {
                            return(1);
                        }
                    }
                    else if (iPt1 == jPt1)
                    {
                        if (iE.IsCrossEdgeShareOnePoint(jE, false, false))
                        {
                            return(1);
                        }
                    }
                    continue;
                }
            }
            return(0);
        }