📄 dvr.java~282~
字号:
dedge bc = new dedge();
bc.a = b;
bc.b = c;
bc.length = Math.sqrt(lbc);
dedge ac = new dedge();
ac.a = a;
ac.b = c;
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 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 - xk) < -max) {
t.b = new vpoint((( -max - yk) / sk) + xk, -max, vpointkey++);
} else {
t.b = new vpoint(unlimit, yk + sk * (unlimit - xk),
vpointkey++);
}
t.op1 = a;
t.op2 = b;
edgelist.add(t);
a.dpointedges.add(t);
b.dpointedges.add(t);
if (a.y < b.y) {
rchc.add(b);
rchc.add(a);
} else {
rchc.add(a);
rchc.add(b);
}
} else {
edge t = new edge();
t.a = new vpoint(xk, unlimit, vpointkey++);
t.b = new vpoint(xk, -unlimit, vpointkey);
t.op1 = a;
t.op2 = b;
edgelist.add(t);
a.dpointedges.add(t);
b.dpointedges.add(t);
rchc.add(a);
rchc.add(b);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -