⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dv.java~1042~

📁 一个新的voronoi算法实现
💻 JAVA~1042~
📖 第 1 页 / 共 5 页
字号:
                    dtemp.dpointedges.add(temp);
                    removeedge(edgelist, xop, temp.a, temp.b);

                } else if (vpointstore.size() == 2) {
/////////////////////////////////////
                    temp.op1 = dtemp;
                    temp.op2 = xop;
                    kernerl5(edgestore, vpointstore, temp, edgelist, dop, xop,
                             dtemp, vop, t, index);
                }

            }

        }
    }

    public void kernerl7(Vector<edge> edgelist, dpoint dop, dpoint xop,
            dpoint dtemp, vpoint vop, edge t) { //mend one old edge
        vpoint a = t.a;
        vpoint b = t.b;
        if (a.x < b.x) {

        } else {
            vpoint exchange = new vpoint();
            exchange = a;
            a = b;
            b = a;

        }
        t.a = a;
        t.b = vop;

    }


    public void forbackxopdop(dpoint dop, dpoint xop, dpoint dtemp, edge t,
                              vpoint vop) {
        //此方法直接处理t// 处理的是xopdop
        double flag = 0; //if 是钝角三角行那么flag=1 否则为-1;
        vpoint a = t.a;
        vpoint b = t.b;
        double lxopdtemp = Math.pow(dtemp.x - xop.x, 2) +
                           Math.pow(dtemp.y - xop.y, 2);
        double ldopdtemp = Math.pow(dop.x - dtemp.x, 2) +
                           Math.pow(dop.y - dtemp.y, 2);
        double lxopdop = Math.pow(xop.x - dop.x, 2) + Math.pow(dop.y - xop.y, 2);
        double xk = (dop.x + xop.x) / 2;
        double yk = (dop.y + xop.y) / 2;
        double sk = (dop.y - xop.y) / (dop.x - xop.x);
        double flaga = a.y - yk - sk * (a.x - xk);
        double flagb = b.y - yk - sk * (b.x - xk);
        double flagvop = vop.y - yk - sk * (vop.x - xk);

        if (lxopdtemp >= (ldopdtemp + lxopdop) ||
            ldopdtemp >= (lxopdtemp + lxopdop) ||
            (lxopdop >= ldopdtemp + lxopdtemp)) {
            flag = 1;

        } else {
            flag = -1;
        }
        if (flag == 1) {
            if (lxopdop >= (ldopdtemp + lxopdtemp)) {
                if (flagb * flaga < 0) {
                    if (flagvop * flaga > 0) {
                        t.a = a;
                        t.b = vop;
                    } else {
                        t.a = vop;
                        t.b = b;
                    }
                } else {
                    if (flaga > 0) {
                        if (a.x < b.x) {
                            t.a = a;
                            t.b = vop;
                        } else {
                            t.a = vop;
                            t.b = b;
                        }
                    } else {
                        if (a.x < b.x) {
                            t.a = a;
                            t.b = vop;
                        } else {
                            t.b = vop;
                            t.a = b;
                        }
                    }

                }

            } else {
                /*xk >= a.x & xk <= vop.x || xk >= vop.x & xk <= a.x*/
                /*
                                || dis(xop, dop, a) < dis(xop, dop, b)
                 */
                if (inter(a, vop, xop, dop)) {
                    t.a = a;
                    t.b = vop;
                } else {
                    if (dis(xop, dop, a) < dis(xop, dop, b)) {
                        t.a = a;
                        t.b = vop;
                    } else {
                        t.a = b;
                        t.b = vop;
                    }
                }
                /*
                 if (xk >= a.x & xk <= vop.x || xk >= vop.x & xk <= a.x) {
                 t.a = a;
                 t.b = vop;
                                 } else {
                 t.a = b;
                 t.b = vop;
                                 }
                 */

            }

        } else if (flag == -1) {
            if (inter(a, vop, dop, xop)) {
                t.a = a;
                t.b = vop;
            } else {
                t.a = b;
                t.b = vop;
            }

        }
    }


    public void kernerl6(Vector<edge> edgelist, dpoint dop, dpoint xop,
            dpoint dtemp, vpoint vop, edge t, int index, dpoint down) {
        //处理一条旧边生成一条新边
        //mend the old edge

        forbackxopdop(dop, xop, dtemp, t, vop);
        vpoint a = t.a;
        vpoint b = t.b;

        edge ext = new edge();
        ext = t;
        vpoint exvop = new vpoint();
        exvop = vop;
        //create one new edge
        kernerl6create(dop, xop, dtemp, vop);
        //处理继续产生的其他的边
        double xk = (xop.x + dtemp.x) / 2;
        double yk = (xop.y + dtemp.y) / 2;
        double sk = -(xop.x - dtemp.x) / (xop.y - dtemp.y);
        Vector<vpoint> vpointstore = new Vector<vpoint>();
        Vector<edge> edgestore = new Vector<edge>();
        t = null;
        t = new edge();

        for (int i = 0; i < xop.dpointedges.size(); i++) {
            t = xop.dpointedges.elementAt(i);

            a = t.a;
            b = t.b;
            double sks = (b.y - a.y) / (b.x - a.x);

            double x = (yk + sks * a.x - a.y - sk * xk) / (sks - sk);

            if (x >= a.x - det & x <= b.x + det ||
                x >= b.x - det & x <= a.x + det) {
                double y = a.y + sks * (x - a.x);
                vop = new vpoint(x, y, vpointkey++);
                //              System.out.println(" x y : "+x+ "  "+y);
                vpointstore.add(vop);
                edgestore.add(t);

            }

        }
        vpoint pre0;
        vpoint preunlimit;
        edge temp = new edge();
        if (vpointstore.size() == 1) {

            temp = new edge();

            if (yk + sk * ( -unlimit - xk) > max) {

                pre0 = new vpoint(((max - yk) / sk) + xk, max, vpointkey++);
            } else if (yk + sk * ( -unlimit - xk) < -max) {
                pre0 = new vpoint((( -max - yk) / sk) + xk, -max, vpointkey++);
            }

            else {
                pre0 = new vpoint( -unlimit, yk + sk * ( -unlimit - xk),
                                  vpointkey++);
            }

            if (yk + sk * (unlimit - xk) > max) {
                preunlimit = new vpoint(((max - yk) / sk) + xk, max,
                                        vpointkey++);
            } else if (yk + sk * (unlimit - xk) < -max) {
                preunlimit = new vpoint((( -max - yk) / sk) + xk, -max,
                                        vpointkey++);
            } else {
                preunlimit = new vpoint(unlimit, yk + sk * (unlimit - xk),
                                        vpointkey++);
            }
            if (xk > vop.x & xk < pre0.x || xk > pre0.x & xk < vop.x) {
                temp.a = pre0;
                temp.b = vop;
            } else {
                temp.a = preunlimit;
                temp.b = vop;
            }
            temp.op1 = dtemp;
            temp.op2 = xop;
            edgelist.add(temp);
            dtemp.dpointedges.add(temp);
            xop.dpointedges.add(temp);
            removeedge(edgelist, xop, temp.a, temp.b);

        } else if (vpointstore.size() == 2) {
            temp = null;
            temp = new edge();
            temp.op1 = xop;
            temp.op2 = dtemp; //temp的 op1 op2 是需要处理的!
            t = null;
            vop = null;
            t = ext;
            vop = exvop;
            kernerlshdow5(edgestore, vpointstore, temp, edgelist, dop, xop,
                          dtemp, vop, t, index, down);
        }
        //此处才是处理down点的



    }

    public void kernerlshdow5(Vector<edge> edgestore,
            Vector<vpoint> vpointstore, edge temp, Vector<edge> edgelist,
            dpoint dop, dpoint xop, dpoint dtemp,
            vpoint vop, edge t, int index, dpoint down) {
        int hero = 0;
        vpoint exvop = new vpoint();
        edge ext = new edge();

        if ((temp.op1 == xop & temp.op2 == dtemp) ||
            (temp.op1 == dtemp & temp.op2 == xop)) {
            hero = 2;
        } else if ((temp.op1 == dop & temp.op2 == dtemp) ||
                   (temp.op1 == dtemp & temp.op2 == dop)) {
            hero = 1;
        }
        if (hero == 1) {

        } else if (hero == 2) {
            temp.a = vpointstore.elementAt(0);
            temp.b = vpointstore.elementAt(1);

            temp.op1 = xop; //处理半成品边为dop 和dtemp的
            temp.op2 = dtemp;
            edgelist.add(temp);
            dtemp.dpointedges.add(temp);
            xop.dpointedges.add(temp); //remove edges??

            removeedge(edgelist, xop, temp.a, temp.b);
            if (vop.brother(vpointstore.elementAt(0), det)) {
                vop = vpointstore.elementAt(1);
                t = edgestore.elementAt(1);
                exvop = vpointstore.elementAt(1);
                ext = edgestore.elementAt(1);
            } else {
                vop = vpointstore.elementAt(0);
                t = edgestore.elementAt(0);
                exvop = vpointstore.elementAt(0);
                ext = edgestore.elementAt(0);
            }

            if (t.op1 == xop) {
                dop = xop;
                xop = t.op2;
            } else {
                dop = xop;
                xop = t.op1;
            }
            double ldopxop = Math.pow(xop.x - dop.x, 2) +
                             Math.pow(xop.y - dop.y, 2);
            double ldopdtemp = Math.pow(dop.x - dtemp.x, 2) +
                               Math.pow(dop.y - dtemp.y, 2);
            double lxopdtemp = Math.pow(xop.x - dtemp.x, 2) +
                               Math.pow(xop.y - dtemp.y, 2);
            double xk = (xop.x + dtemp.x) / 2;
            double yk = (xop.y + dtemp.y) / 2;
            double sk = -(xop.x - dtemp.x) / (xop.y - dtemp.y);
            vpoint pre0;
            if (yk + sk * ( -unlimit - xk) > max) {

                pre0 = new vpoint(((max - yk) / sk) + xk, max, vpointkey++);
            } else if (yk + sk * ( -unlimit - xk) < -max) {
                pre0 = new vpoint((( -max - yk) / sk) + xk, -max, vpointkey++);
            }

            else {
                pre0 = new vpoint( -unlimit, yk + sk * ( -unlimit - xk),
                                  vpointkey++);
            }
            vpoint preunlimit;
            if (yk + sk * (unlimit - xk) > max) {
                preunlimit = new vpoint(((max - yk) / sk) + xk, max, vpointkey++);
            } else if (yk + sk * (unlimit - xk) < -max) {
                preunlimit = new vpoint((( -max - yk) / sk) + xk, -max,
                                        vpointkey++);
            } else {
                preunlimit = new vpoint(unlimit, yk + sk * (unlimit - xk),
                                        vpointkey++);
            }

            temp = null;
            temp = new edge();

            if (lxopdtemp >= (ldopxop + ldopdtemp)) {

                if (xk > pre0.x & xk < vop.x || xk > vop.x & xk < pre0.x) {
                    temp.a = preunlimit;
                    temp.b = vop;
                    temp.op1 = dtemp;
                    temp.op2 = xop;

                } else {
                    temp.a = pre0;
                    temp.b = vop;
                    temp.op1 = dtemp;
                    temp.op2 = xop;
                }

            } else {
                if (xk > pre0.x & xk < vop.x || xk > vop.x & xk < pre0.x) {
                    temp.a = pre0;
                    temp.b = vop;
                    temp.op1 = dtemp;
                    temp.op2 = xop;

                } else {
                    temp.a = preunlimit;
                    temp.b = vop;
                    temp.op1 = dtemp;
                    temp.op2 = xop;
                }

            }

            vpointstore.removeAllElements();
            edgestore.removeAllElements();
            vpoint a = new vpoint();
            vpoint b = new vpoint();
            for (int i = 0; i < xop.dpointedges.size(); i++) {
                edge tk = xop.dpointedges.elementAt(i);
                a = tk.a;
                b = tk.b;
                double sks = (b.y - a.y) / (b.x - a.x);
                double x = (yk - a.y - sk * xk + sks * a.x) / (sks - sk);
                if (x >= a.x - det & x <= b.x + det ||
                    x >= b.x - det & x <= a.x + det) {
                    double y = yk + sk * (x - xk);
                    vpoint vopk = new vpoint(x, y, vpointkey++);
                    vpointstore.add(vopk);
                    edgestore.add(tk);
                }

            }

            if (vpointstore.size() == 1) { //注意et

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -