📄 dv.java~1042~
字号:
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 + -