コード例 #1
0
 private void endpoint(EdgeF e, int lr, VertexKDTree s)
 {
     e.ep[lr] = s;
     if (e.ep[RE - lr] == null)
     {
         return;
     }
     clip_line(e);
 }
コード例 #2
0
 private void endpoint(EdgeF e, int lr, PointFortune s)
 {
     e.ep[lr] = s;
     if (e.ep[RE - lr] == null)
     {
         return;
     }
     clip_line(e);
 }
コード例 #3
0
        private Halfedge HEcreate(EdgeF e, int pm)
        {
            Halfedge answer = new Halfedge();

            answer.ELedge = e;
            answer.ELpm   = pm;
            answer.PQnext = null;
            answer.vertex = VertexKDTree.Zero;

            return(answer);
        }
コード例 #4
0
        private EdgeF bisect(VertexKDTree s1, VertexKDTree s2)
        {
            float dx, dy, adx, ady;
            EdgeF newedge;

            newedge = new EdgeF();

            newedge.reg[0] = s1;
            newedge.reg[1] = s2;

            newedge.ep[0] = VertexKDTree.Zero;
            newedge.ep[1] = VertexKDTree.Zero;

            dx = s2.Vector.X - s1.Vector.X;
            dy = s2.Vector.Y - s1.Vector.Y;

            adx       = dx > 0 ? dx : -dx;
            ady       = dy > 0 ? dy : -dy;
            newedge.c = (float)(s1.Vector.X * dx + s1.Vector.Y * dy + (dx * dx + dy * dy) * 0.5);

            if (adx > ady)
            {
                newedge.a  = 1.0f;
                newedge.b  = dy / dx;
                newedge.c /= dx;
            }
            else
            {
                newedge.a  = dx / dy;
                newedge.b  = 1.0f;
                newedge.c /= dy;
            }

            newedge.edgenbr = nedges;
            nedges++;

            return(newedge);
        }
コード例 #5
0
        private EdgeF bisect(PointFortune s1, PointFortune s2)
        {
            double dx, dy, adx, ady;
            EdgeF  newedge;

            newedge = new EdgeF();

            newedge.reg[0] = s1;
            newedge.reg[1] = s2;

            newedge.ep[0] = null;
            newedge.ep[1] = null;

            dx = s2.X - s1.X;
            dy = s2.Y - s1.Y;

            adx       = dx > 0 ? dx : -dx;
            ady       = dy > 0 ? dy : -dy;
            newedge.c = (double)(s1.X * dx + s1.Y * dy + (dx * dx + dy * dy) * 0.5);

            if (adx > ady)
            {
                newedge.a  = 1.0f;
                newedge.b  = dy / dx;
                newedge.c /= dx;
            }
            else
            {
                newedge.a  = dx / dy;
                newedge.b  = 1.0f;
                newedge.c /= dy;
            }

            newedge.edgenbr = nedges;
            nedges++;

            return(newedge);
        }
コード例 #6
0
        private void clip_line(EdgeF e)
        {
            double       pxmin, pxmax, pymin, pymax;
            VertexKDTree s1, s2;

            double x1 = e.reg[0].Vector.X;
            double y1 = e.reg[0].Vector.Y;
            double x2 = e.reg[1].Vector.X;
            double y2 = e.reg[1].Vector.Y;
            double x  = x2 - x1;
            double y  = y2 - y1;

            // if the distance between the two points this line was created from is
            // less than the square root of 2, then ignore it
            if (Math.Sqrt((x * x) + (y * y)) < minDistanceBetweenVectorWithIndexs)
            {
                return;
            }
            pxmin = borderMinX;
            pymin = borderMinY;
            pxmax = borderMaxX;
            pymax = borderMaxY;

            if (e.a == 1 && e.b >= 0)
            {
                s1 = e.ep[1];
                s2 = e.ep[0];
            }
            else
            {
                s1 = e.ep[0];
                s2 = e.ep[1];
            }

            if (e.a == 1)
            {
                y1 = pymin;

                if (s1 != null && s1.Vector.Y > pymin)
                {
                    y1 = s1.Vector.Y;
                }
                if (y1 > pymax)
                {
                    y1 = pymax;
                }
                x1 = e.c - e.b * y1;
                y2 = pymax;

                if (s2 != null && s2.Vector.Y < pymax)
                {
                    y2 = s2.Vector.Y;
                }
                if (y2 < pymin)
                {
                    y2 = pymin;
                }
                x2 = e.c - e.b * y2;
                if (((x1 > pxmax) & (x2 > pxmax)) | ((x1 < pxmin) & (x2 < pxmin)))
                {
                    return;
                }

                if (x1 > pxmax)
                {
                    x1 = pxmax;
                    y1 = (e.c - x1) / e.b;
                }
                if (x1 < pxmin)
                {
                    x1 = pxmin;
                    y1 = (e.c - x1) / e.b;
                }
                if (x2 > pxmax)
                {
                    x2 = pxmax;
                    y2 = (e.c - x2) / e.b;
                }
                if (x2 < pxmin)
                {
                    x2 = pxmin;
                    y2 = (e.c - x2) / e.b;
                }
            }
            else
            {
                x1 = pxmin;
                if (s1 != null && s1.Vector.X > pxmin)
                {
                    x1 = s1.Vector.X;
                }
                if (x1 > pxmax)
                {
                    x1 = pxmax;
                }
                y1 = e.c - e.a * x1;

                x2 = pxmax;
                if (s2 != null && s2.Vector.X < pxmax)
                {
                    x2 = s2.Vector.X;
                }
                if (x2 < pxmin)
                {
                    x2 = pxmin;
                }
                y2 = e.c - e.a * x2;

                if (((y1 > pymax) & (y2 > pymax)) | ((y1 < pymin) & (y2 < pymin)))
                {
                    return;
                }

                if (y1 > pymax)
                {
                    y1 = pymax;
                    x1 = (e.c - y1) / e.a;
                }
                if (y1 < pymin)
                {
                    y1 = pymin;
                    x1 = (e.c - y1) / e.a;
                }
                if (y2 > pymax)
                {
                    y2 = pymax;
                    x2 = (e.c - y2) / e.a;
                }
                if (y2 < pymin)
                {
                    y2 = pymin;
                    x2 = (e.c - y2) / e.a;
                }
            }

            pushGraphEdge(e.reg[0], e.reg[1], x1, y1, x2, y2);
        }