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

📄 dv.java~1049~

📁 一个新的voronoi算法实现
💻 JAVA~1049~
📖 第 1 页 / 共 5 页
字号:
        ac.length = Math.sqrt(lac);

        dpoint maxleft = new dpoint();
        dpoint maxright = new dpoint();
        dpoint rest = new dpoint();
        double flag = 0;
        if (lab + lbc <= lac) {

            maxleft = a;
            maxright = c;
            rest = b;
            flag = 1;

            //        System.out.println("ac");
        } else if (lab + lac <= lbc) {
            maxleft = bc.a;
            maxright = bc.b;
            rest = a;
            flag = 1;
            //         System.out.println("bc");
        } else if (lbc + lac <= lab) {
            maxleft = ab.a;
            maxright = ab.b;
            rest = c;
            flag = 1;
            //         System.out.println("ab");
        } else if (lab + lbc > lac || lab + lac > lbc | lbc + lac > lab) {
            flag = -1; //锐角
        }
        if (flag == 1) {

            //the first edge
            double xk = (maxleft.x + rest.x) / 2;
            double yk = (maxleft.y + rest.y) / 2;
            double sk = -(maxleft.x - rest.x) / (maxleft.y - rest.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++);
            }

            edge t = new edge();
            if (xk > pre0.x & xk < v.x ||
                xk > v.x & xk < pre0.x) {
                t.a = v;
                t.b = pre0;
                t.op1 = maxleft;
                t.op2 = rest;

            } else {
                t.a = v;
                t.b = preunlimit;
                t.op1 = maxleft;
                t.op2 = rest;
            }
            edgelist.add(t);
            t.op1.dpointedges.add(t);
            t.op2.dpointedges.add(t);
            //the second edge
            xk = (maxright.x + rest.x) / 2;
            yk = (maxright.y + rest.y) / 2;
            sk = -(maxright.x - rest.x) / (maxright.y - rest.y);

            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++);
            }

            t = new edge();
            if (xk > pre0.x & xk < v.x ||
                xk > v.x & xk < pre0.x) {
                t.a = v;
                t.b = pre0;
                t.op1 = maxright;
                t.op2 = rest;

            } else {
                t.a = v;
                t.b = preunlimit;
                t.op1 = maxright;
                t.op2 = rest;
            }
            edgelist.add(t);
            t.op1.dpointedges.add(t);
            t.op2.dpointedges.add(t);
            //the thired edge
            xk = (maxright.x + maxleft.x) / 2;
            yk = (maxright.y + maxleft.y) / 2;
            sk = -(maxright.x - maxleft.x) / (maxright.y - maxleft.y);

            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++);
            }

            t = new edge();
            if (xk > pre0.x & xk < v.x ||
                xk > v.x & xk < pre0.x) {
                t.a = v;
                t.b = preunlimit;
                t.op1 = maxright;
                t.op2 = maxleft;

            } else {
                t.a = v;
                t.b = pre0;
                t.op1 = maxright;
                t.op2 = maxleft;
            }
            edgelist.add(t);
            t.op1.dpointedges.add(t);
            t.op2.dpointedges.add(t);

        } else {
            //     the first edge
            double xk = (a.x + b.x) / 2;
            double yk = (a.y + b.y) / 2;
            double sk = -(a.x - b.x) / (a.y - b.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++);
            }

            edge t = new edge();
            if (xk > v.x & xk < pre0.x ||
                xk > pre0.x & xk < v.x) {
                t.a = v;
                t.b = pre0;
                t.op1 = a;
                t.op2 = b;

            } else {
                t.a = v;
                t.b = preunlimit;
                t.op1 = a;
                t.op2 = b;
            }
            edgelist.add(t);
            t.op1.dpointedges.add(t);
            t.op2.dpointedges.add(t);
            //the second edge
            xk = (a.x + c.x) / 2;
            yk = (a.y + c.y) / 2;
            sk = -(a.x - c.x) / (a.y - c.y);

            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++);
            }
            t = new edge();
            if (xk > v.x & xk < pre0.x ||
                xk > pre0.x & xk < v.x) {
                t.a = v;
                t.b = pre0;
                t.op1 = a;
                t.op2 = c;

            } else {
                t.a = v;
                t.b = preunlimit;
                t.op1 = a;
                t.op2 = c;
            }
            edgelist.add(t);
            t.op1.dpointedges.add(t);
            t.op2.dpointedges.add(t);
            //the third edge
            xk = (c.x + b.x) / 2;
            yk = (c.y + b.y) / 2;
            sk = -(c.x - b.x) / (c.y - b.y);

            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++);
            }
            t = new edge();
            if (xk > v.x & xk < pre0.x ||
                xk > pre0.x & xk < v.x) {
                t.a = v;
                t.b = pre0;
                t.op1 = c;
                t.op2 = b;

            } else {
                t.a = v;
                t.b = preunlimit;
                t.op1 = c;
                t.op2 = b;
            }
            edgelist.add(t);
            t.op1.dpointedges.add(t);
            t.op2.dpointedges.add(t);

        }
//////////////////////////////////////////////////////////////


    }

    public void init0() {
        vpointlist.removeAllElements();
        vpointliststore.removeAllElements();
        edgelist.removeAllElements();
        dpointlist.removeAllElements();
        rchc.removeAllElements();
    }

    public void initexcdpoint() {
        vpointlist.removeAllElements();
        vpointliststore.removeAllElements();
        edgelist.removeAllElements();

        rchc.removeAllElements();

    }

    public void initdpoint() { //remove   except the dpointlist
        vpointlist.removeAllElements();
        vpointliststore.removeAllElements();
        edgelist.removeAllElements();
        for (int i = 0; i < dpointlist.size(); i++) {
            dpoint t = dpointlist.elementAt(i);
            t.dpointedges.removeAllElements();
        }

    }

    public void construct1(Vector<edge> edgelist,
            Vector<dpoint> dpointlist,
            Vector<vpoint> vpointlist, Vector<dpoint> rchc) {
        dpoint a = dpointlist.elementAt(0);
        dpoint b = dpointlist.elementAt(1);

        double ax = a.x;
        double ay = a.y;
        double bx = b.x;
        double by = b.y;
        double xk = (ax + bx) / 2;
        double yk = (ay + by) / 2;

        if (ay != by) {
            double sk = -(ax - bx) / (ay - by);
            edge t = new edge();

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

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

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

            if (yk + sk * (unlimit - xk) > max) {
                t.b = new vpoint(((max - yk) / sk) + xk, max, vpointkey++);
            } else if (yk + sk * (unlimit

⌨️ 快捷键说明

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