Files
cut-abstractions/tests/dev1/dataHandle/optimizeLayout/RectOptimizeWorker/bang.ts
2025-07-22 18:22:31 +08:00

1606 lines
54 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

export type Con = YH_bang[];//单块1220*2440的板结果 Container
export type Inv = Con[]; //个体:优化结果 包含多个大板 Individual
/**纹路类型 Positive=0正纹 Reverse=1反纹 CanReversal=2可翻转 */
export enum LineType
{
/**正纹 */
Positive = 0,
/**反纹 */
Reverse = 1,
/**可翻转 */
CanReversal = 2,
}
/**优化的大板 */
export interface YH_bang
{
/**板ID */
bangid: number;
/**纹路 */
line: LineType;
x: number;
y: number;
/**排版高 */
pbg: number;
/**排版宽 */
pbk: number;
ishb?: boolean;//是否参与合并的板
hb?: number[]; //合在并的板
isgr?: boolean; //是否关连
gr?: number[];//关联的板的集合
grid?: number; //跟别的板关联的ID
isbig?: boolean;//是否为合并的大板
isqg?: boolean;//是否被切掉的板
}
/**版面类型: Positive=0正面 Reverse=1反面 Arbitrary=2任意面 */
export enum ComposingType
{
/**正面 */
Positive = 0,
/**反面 */
Reverse = 1,
/**任意面 */
Arbitrary = 2
}
/**孔类型 None=0无 Positive=1正面 Reverse=2反面 Two=3正反 */
export enum HoleType
{
/**无 */
None = 0,
/**正面 */
Positive = 1,
/**反面 */
Reverse = 2,
/**正反 */
Two = 3
}
/** 小板 */
export interface xbang
{
/**长 */
l: number;
/**宽 */
w: number;
/**纹路 */
line: LineType;
/**排版面 */
face: ComposingType;
/**小板ID */
id: number;
/**小板编号 */
bno: string;
/**孔面: 0无孔 1正面有孔 2反面有孔 3正反面都有孔 */
holeFaceCount: HoleType;
/**是矩形 */
isRect?: boolean;
/**有孔 */
hasHole?: boolean;
/**false单面 true双面 */
isdtwosided?: boolean;
}
/** 大板 */
export class Big_bang //待优化的板
{
l: number; //长
w: number; //宽
x: number; //x
y: number; //y
}
export enum BlockRegion
{
/** 左下 = 0 */
LEFT_BOTTOM = 0,
/** 右下 = 1 */
RIGHT_BOTTOM = 1,
/** 右上 = 2 */
RIGHT_TOP = 2,
/** 左上 = 3 */
LEFT_TOP = 3,
}
export class WorkerItemType {
w?: Worker
goodsId?: string | number
pm?: any
status?: 'start' | 'stop'
}
//开料生产
export class KLSC
{
xbang: YH_bang[]; //小板集合
Bakbang: YH_bang[]; //备份小板集合
HB_bang: number[] = []; //合并的板
HB: number[][] = []; //合并板的数组
B_k: number; //大板宽
B_g: number; //大板高
dt: number; //刀头大小(含修边)
wzx: number; //临时用于打印
wzy: number; //临时用于打印
jl_mz: number; //用于测试距离或者面积优选
SCid: number[] = []; //用于存化顺序的板的bangid
//f = () => 5;
constructor(xbang: YH_bang[], Bang_k: number, Bang_g: number, dt: number, wzx: number, wzy: number, JL_MZ: number) //false JL ture MZ
{
this.xbang = JSON.parse(JSON.stringify(xbang));
//this.xbang = [...xbang];
this.Bakbang = JSON.parse(JSON.stringify(xbang));
this.B_g = Bang_g;
this.B_k = Bang_k;
this.dt = dt;
this.wzx = wzx;
this.wzy = wzy;
this.jl_mz = JL_MZ;
this.XDscjs();
};
//查找距离中心最近,且跟最大的板相差不大于容差面积 rcmz 的板 返加YH_bang[].bangid
MaxMZ = (rcmz: number): number =>
{
let tmepckb: number;
let tmepckb1: number;
let tempxbang: YH_bang[] = [];
this.xbang.sort((b, a) => a.pbg * a.pbk - b.pbg * b.pbk);
let maxmz = this.xbang[0].pbg * this.xbang[0].pbk / 1000000;
let maxbangid = this.xbang[0].bangid;
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].pbg > this.xbang[i].pbk)
{
tmepckb = this.xbang[i].pbg / this.xbang[i].pbk;
}
else
{
tmepckb = this.xbang[i].pbk / this.xbang[i].pbg;
}
if (this.xbang[0].pbg > this.xbang[0].pbk)
{
tmepckb1 = this.xbang[0].pbg / this.xbang[0].pbk;
}
else
{
tmepckb1 = this.xbang[0].pbk / this.xbang[0].pbg;
}
if (equaln(this.xbang[i].pbg * this.xbang[i].pbk / 1000000, maxmz, rcmz) && equaln(tmepckb, tmepckb1, 2))
{
tempxbang.push(this.xbang[i]);
}
}
if (tempxbang.length > 0)
{
return this.minJL(tempxbang);
}
else
{
return maxbangid;
}
};
//查找指定Bangid的板 返回在数组中的位置ID f = () => 5;
getID = (bangid: number): number => this.xbang.findIndex((n) => n.bangid == bangid);
//查找备份板Bangid的板 返回在数组中的位置ID f = () => 5;
getID_Bkb = (bangid: number): number => this.Bakbang.findIndex((n) => n.bangid == bangid);
//查找距离最近的板 返加YH_bang[].bangid
minJL = (xbang: YH_bang[]): number => { xbang.sort((b, a) => Math.hypot(this.B_k / 2 - b.x - b.pbk / 2, this.B_g / 2 - b.y - b.pbg / 2) - Math.hypot(this.B_k / 2 - a.x - a.pbk / 2, this.B_g / 2 - a.y - a.pbg / 2)); return xbang[0].bangid; };
//查找左边且Y位置一样的板 返加YH_bang[].bangid
F_Left = (bangid: number): number =>
{
let a = this.xbang.find((n) => equaln(n.x + n.pbk + this.dt, this.xbang[this.getID(bangid)].x, 0.001)
&& equaln(n.y, this.xbang[this.getID(bangid)].y, 0.001) && n.ishb == false);
if (a == undefined) { return; } return a.bangid;
};
//查找左边关连的板,并写入
F_GL_LR = () =>
{
let temp: number;
let bangIndex: number;
let maxkd: number = 0;
let maxid: number; //bangid
if (this.xbang.length > 1)
{
for (let i = 0; i < this.xbang.length; i++)
{
bangIndex = i;
while (1) //左边
{
if (this.xbang[bangIndex].pbg > this.xbang[bangIndex].pbk && this.xbang[bangIndex].pbk < 200 && this.xbang[bangIndex].ishb == false)
{
temp = this.xbang.findIndex(n => n.x + n.pbk < this.xbang[bangIndex].x && n.y <= this.xbang[bangIndex].y && this.XJcd(n.bangid, this.xbang[bangIndex].bangid)[1] > this.xbang[bangIndex].pbk);
if (temp != -1)
{
if (this.xbang[temp].pbk > maxkd)
{
maxkd = this.xbang[temp].pbk;
maxid = this.xbang[temp].bangid;
}
if (this.xbang[temp].pbk > 200)
{
this.xbang[temp].isgr = true;
this.xbang[temp].gr.push(this.xbang[bangIndex].bangid);
this.xbang[bangIndex].grid = this.xbang[temp].bangid;
break;
}
else
{
bangIndex = temp;
}
}
else
{
break;
}
}
else
{
break;
}
}
bangIndex = i;
while (1) //右边
{
if (this.xbang[bangIndex].pbg > this.xbang[bangIndex].pbk && this.xbang[bangIndex].pbk < 200 && this.xbang[bangIndex].ishb == false)
{
temp = this.xbang.findIndex(n => n.x > this.xbang[bangIndex].x + this.xbang[bangIndex].pbk
&& this.LR_is(this.xbang[bangIndex].bangid, n.bangid) == false
&& n.pbg > 300
&& this.XJcd(n.bangid, this.xbang[bangIndex].bangid)[1] > this.xbang[bangIndex].pbk);
if (temp != -1)
{
if (this.xbang[temp].pbk > maxkd)
{
maxkd = this.xbang[temp].pbk;
maxid = this.xbang[temp].bangid;
}
if (this.xbang[temp].pbk > 200)
{
this.xbang[temp].isgr = true;
this.xbang[temp].gr.push(this.xbang[bangIndex].bangid);
this.xbang[bangIndex].grid = this.xbang[temp].bangid;
break;
}
else
{
bangIndex = temp;
}
}
else
{
break;
}
}
else
{
break;
}
}
}
};
};
//查找上下边关连的板,并写入
F_GL_TD = () =>
{
let temp: number;
let bangIndex: number;
let maxkd: number = 0;
let maxid: number; //bangid
if (this.xbang.length > 1)
{
for (let i = 0; i < this.xbang.length; i++)
{
bangIndex = i;
while (1) //上面
{
if (this.xbang[bangIndex].pbg < this.xbang[bangIndex].pbk && this.xbang[bangIndex].pbg < 200 && this.xbang[bangIndex].ishb == false)
{
temp = this.xbang.findIndex(n => n.y > this.xbang[bangIndex].y + this.xbang[bangIndex].pbg && n.x + 0.01 <= this.xbang[bangIndex].x
&& this.XJcd(n.bangid, this.xbang[bangIndex].bangid)[0] > this.xbang[bangIndex].pbg);
if (temp != -1)
{
if (this.xbang[temp].pbg > maxkd)
{
maxkd = this.xbang[temp].pbg;
maxid = this.xbang[temp].bangid;
}
if (this.xbang[temp].pbg > 200)
{
this.xbang[temp].isgr = true;
this.xbang[temp].gr.push(this.xbang[bangIndex].bangid);
this.xbang[bangIndex].grid = this.xbang[temp].bangid;
break;
}
else
{
bangIndex = temp;
}
}
else
{
break;
}
}
else
{
break;
}
}
bangIndex = i;
while (1) //下面
{
if (this.xbang[bangIndex].pbg < this.xbang[bangIndex].pbk && this.xbang[bangIndex].pbg < 200 && this.xbang[bangIndex].ishb == false)
{
temp = this.xbang.findIndex(n => n.y + n.pbg < this.xbang[bangIndex].y + this.xbang[bangIndex].pbg && n.x - 0.01 <= this.xbang[bangIndex].x
&& this.XJcd(n.bangid, this.xbang[bangIndex].bangid)[0] > this.xbang[bangIndex].pbg);
if (temp != -1)
{
if (this.xbang[temp].pbg > maxkd)
{
maxkd = this.xbang[temp].pbg;
maxid = this.xbang[temp].bangid;
}
if (this.xbang[temp].pbg > 200)
{
this.xbang[temp].isgr = true;
this.xbang[temp].gr.push(this.xbang[bangIndex].bangid);
this.xbang[bangIndex].grid = this.xbang[temp].bangid;
break;
}
else
{
bangIndex = temp;
}
}
else
{
break;
}
}
else
{
break;
}
}
}
};
};
//查找有异形交集关连的板,并写入
F_GL_JJB = () =>
{
let temp: number;
if (this.xbang.length > 1)
{
for (let i = 0; i < this.xbang.length; i++)
{
temp = this.xbang.findIndex(n => this.XJcd(n.bangid, this.xbang[i].bangid)[0] > 50
&& this.XJcd(n.bangid, this.xbang[i].bangid)[1] > 50 && n.bangid != this.xbang[i].bangid);
if (temp != -1)
{
if (this.xbang[i].pbg * this.xbang[i].pbk > this.xbang[temp].pbg * this.xbang[temp].pbk)
{
this.xbang[i].isgr = true;
this.xbang[i].gr.push(this.xbang[temp].bangid);
this.xbang[temp].grid = this.xbang[i].bangid;
}
else if (equaln(this.xbang[i].pbg * this.xbang[i].pbk, this.xbang[temp].pbg * this.xbang[temp].pbk, 0.01))
{
if (this.xbang[temp].x > this.xbang[i].x)
{
this.xbang[i].isgr = true;
this.xbang[i].gr.push(this.xbang[temp].bangid);
this.xbang[temp].grid = this.xbang[i].bangid;
}
else
{
this.xbang[temp].isgr = true;
this.xbang[temp].gr.push(this.xbang[i].bangid);
this.xbang[i].grid = this.xbang[temp].bangid;
}
}
else
{
this.xbang[temp].isgr = true;
this.xbang[temp].gr.push(this.xbang[i].bangid);
this.xbang[i].grid = this.xbang[temp].bangid;
}
}
}
};
for (let k = 0; k < this.xbang.length; k++)
{
let newgr = [... new Set(this.xbang[k].gr)];
this.xbang[k].gr = newgr;
}
};
//判断有关联的板跟大板之间是否有交集,如果有取消这块板的关联
Is_big_gr = () =>
{
for (let k = 0; k < this.xbang.length; k++)
{
let newgr = [... new Set(this.xbang[k].gr)];
this.xbang[k].gr = newgr;
}
let tempx: number;
let tempy: number;
let bangIndex1 = this.xbang[this.getID(this.HB[0][0])];
let bangIndex2: number;
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].isgr == true)
{
tempx = 0;
tempy = 0;
for (let j = 0; j < this.xbang[i].gr.length; j++)
{
bangIndex2 = this.getID(this.xbang[i].gr[j]);
if (this.xbang[i].bangid == 10)////////////////////用于调试
{
console.log(this.xbang[i].bangid);
}
if (this.xbang[bangIndex2].pbg > this.xbang[bangIndex2].pbk)
{
tempy = this.Jcxj(bangIndex1.y, bangIndex1.pbg, this.xbang[bangIndex2].y, this.xbang[bangIndex2].pbg);
}
else
{
tempx = this.Jcxj(bangIndex1.x, bangIndex1.pbk, this.xbang[bangIndex2].x, this.xbang[bangIndex2].pbk);
}
}
if (tempx > 50 || tempy > 50)
{
this.xbang[i].isgr = false;
}
}
}
};
//检测两块板之间的右上角是否有板 false 没有 true 有
LR_is = (bangid1: number, bangid2: number): boolean =>
{
let tb: YH_bang[] = [];
tb.push(this.xbang[this.getID(bangid1)]);
tb.push(this.xbang[this.getID(bangid2)]);
if (tb[0].pbg + tb[0].y > tb[1].pbg + tb[1].y)//右上空间 左边高
{
return this.JCQY_is_bang(tb[1].x, tb[1].y + tb[1].pbg + this.dt, tb[1].pbk, tb[0].pbg - tb[1].pbg - this.dt);
}
else
{
return false;
}
};
//检测两块板之间的右上角是否有板 false 没有 true 有
TD_is = (bangid1: number, bangid2: number): boolean =>
{
let tb: YH_bang[] = [];
tb.push(this.xbang[this.getID(bangid1)]);
tb.push(this.xbang[this.getID(bangid2)]);
if (tb[0].pbk + tb[0].x > tb[1].pbk + tb[1].x)//右下空间 左边高
{
return this.JCQY_is_bang(tb[1].x, tb[1].y + tb[1].pbg + this.dt, tb[1].pbk, tb[0].pbg - tb[1].pbg - this.dt);
}
else
{
return false;
}
};
//查找左边且Y位置一样的板 返加YH_bang[].bangid
F_Left_Big = (bangid: number, gbcd: number): number =>
{
let tempjh: YH_bang[] = [];
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].x + this.xbang[i].pbk < this.xbang[this.getID(bangid)].x && this.XJcd(this.xbang[i].bangid, this.xbang[this.getID(bangid)].bangid)[1] > gbcd)
{
tempjh.push(this.xbang[i]);
}
}
if (tempjh.length > 0)
{
tempjh.sort((a, b) => a.x - b.x);
return tempjh[0].bangid;
}
else
{
return -1;
}
};
//找到左右靠边最长的高度 返回 [0]长度 [1] y位置 [2] 0左边 1 右边
L_R_kbcd = (bangid: number): [number, number, number] =>
{
let l_b: YH_bang[] = [];
let cd_l = 0; let cd_r: number = 0; let wzl: number; let wzr: number;
let tb = [...this.xbang];
let tempx: number = this.xbang[this.getID(bangid)].x;
let tempy: number = this.xbang[this.getID(bangid)].y;
let tempk: number = this.xbang[this.getID(bangid)].pbk;
let tempid: number;
let isend: boolean = true;
for (let i = 0; i < 2; i++)
{
l_b = [];
tb = [...this.xbang];
isend = true;
while (isend == true)
{
if (i == 0) { tempid = tb.findIndex((n) => equaln(n.x + n.pbk + this.dt, tempx, 0.001) && (n.y <= tempy)); }
else { tempid = tb.findIndex((n) => equaln(n.x, tempx + tempk + this.dt, 0.001) && (n.y <= tempy)); }
if (tempid != -1)
{
l_b.push(tb[tempid]);
tb.splice(tempid, 1);
}
else
{
isend = false;
}
}
if (l_b.length > 0)
{
l_b.sort((a, b) => b.pbg - a.pbg);
if (i == 0) { cd_l = l_b[0].pbg; wzl = l_b[0].y; } else { cd_r = l_b[0].pbg; wzr = l_b[0].y; }
}
}
if (cd_l > cd_r || cd_l == cd_r && cd_l > 0)
{
return [cd_l, wzl, 0];
}
else if (cd_l < cd_r)
{
return [cd_r, wzr, 1];
}
else
{
return [0, 0, 0];
}
};
//查找右边且Y位置一样的板 返加YH_bang[].bangid
F_Right = (bangid: number): number =>
{
let a = this.xbang.find((n) => equaln(n.x, this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk + this.dt, 0.001)
&& equaln(n.y, this.xbang[this.getID(bangid)].y, 0.001) && n.ishb == false);
if (a == undefined) { return; } return a.bangid;
};
//查找右边且Y位置一样的板 返加YH_bang[].bangid
F_Right_Big = (bangid: number, gbcd: number): number =>
{
let tempjh: YH_bang[] = [];
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].x > this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk && this.XJcd(this.xbang[i].bangid, this.xbang[this.getID(bangid)].bangid)[1] > gbcd)
{
tempjh.push(this.xbang[i]);
}
}
if (tempjh.length > 0)
{
tempjh.sort((a, b) => a.x - b.x);
return tempjh[0].bangid;
}
else
{
return -1;
}
};
//查找下边且X位置一样的板 返加YH_bang[].bangid
F_Down = (bangid: number): number =>
{
let a = this.xbang.find((n) => equaln(n.y + n.pbg + this.dt, this.xbang[this.getID(bangid)].y, 0.001)
// && n.x > 10
&& equaln(n.x, this.xbang[this.getID(bangid)].x, 0.001) && n.ishb == false);
if (a == undefined) { return; } return a.bangid;
};
//查找上边且X位置一样的板 返加YH_bang[].bangid
F_TOP = (bangid: number): number =>
{
let a = this.xbang.find((n) => equaln(n.y, this.xbang[this.getID(bangid)].y + this.xbang[this.getID(bangid)].pbg + this.dt, 0.001)
//&& n.x > 10
&& equaln(n.x, this.xbang[this.getID(bangid)].x, 0.001) && n.ishb == false);
if (a == undefined) { return; } return a.bangid;
};
//查找上边且X位置一样的板 返加YH_bang[].bangid hbcd为大于共边的长度
F_Top_Big = (bangid: number, gbcd: number): number =>
{
let tempjh: YH_bang[] = [];
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].y > this.xbang[this.getID(bangid)].y + this.xbang[this.getID(bangid)].pbg
&& this.xbang[i].x + this.xbang[i].pbk <= this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk + 0.1
&& this.XJcd(this.xbang[i].bangid, this.xbang[this.getID(bangid)].bangid)[0] > gbcd)
{
tempjh.push(this.xbang[i]);
}
}
if (tempjh.length > 0)
{
tempjh.sort((a, b) => a.x - b.x);
return tempjh[0].bangid;
}
else
{
return -1;
}
};
//查找下边且X位置一样的板 返加YH_bang[].bangid
F_Down_Big = (bangid: number, gbcd: number): number =>
{
let tempjh: YH_bang[] = [];
for (let i = 0; i < this.xbang.length; i++)
{
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].y + this.xbang[i].pbg < this.xbang[this.getID(bangid)].y
&& this.xbang[i].x >= this.xbang[this.getID(bangid)].x && this.xbang[i].pbg > 300
&& this.XJcd(this.xbang[i].bangid, this.xbang[this.getID(bangid)].bangid)[0] > gbcd)
{
tempjh.push(this.xbang[i]);
}
}
}
if (tempjh.length > 0)
{
tempjh.sort((a, b) => a.x - b.x);
return tempjh[0].bangid;
}
else
{
return -1;
}
};
//合并同高相邻的板 isbig: true 为第一回合并的大板 wz为方位 L 左 R右 T上 D下 返回是否有合并过 false 为没有合并过 true 有合并过
HB_LR = (bangid: number, isbig: boolean): boolean =>
{
let isend: boolean = true;
let tempbangid: number;
let ishb: boolean = false;
while (isend == true)
{
tempbangid = this.F_Left(bangid);
if (tempbangid != undefined)
{
let temp = this.JC_is_bang(bangid, tempbangid); //[f/t,1:x,2:y,3:k,4:g]
if (temp[0] == false)
{
this.addbang(bangid, tempbangid, temp[1], temp[2], temp[3], temp[4], isbig);
ishb = true;
}
else
{
isend = false;
}
}
else
{
isend = false;
}
}
isend = true;
while (isend == true)
{
tempbangid = this.F_Right(bangid);
if (tempbangid != undefined)
{
let temp = this.JC_is_bang(bangid, tempbangid); //[f/t,1:x,2:y,3:k,4:g]
if (temp[0] == false)
{
this.addbang(bangid, tempbangid, temp[1], temp[2], temp[3], temp[4], isbig);
ishb = true;
}
else
{
isend = false;
}
}
else
{
isend = false;
}
}
return ishb;
};
//合并同宽相邻的板 isbig: true 为第一回合并的大板 wz为方位 L 左 R右 T上 D下 返回是否有合并过 false 为没有合并过 true 有合并过
HB_TD = (bangid: number, isbig: boolean): boolean =>
{
let isend: boolean = true;
let tempbangid: number;
let ishb: boolean = false;
while (isend == true)
{
tempbangid = this.F_Down(bangid);
if (tempbangid != undefined)
{
let temp = this.JC_is_bang(bangid, tempbangid); //[f/t,1:x,2:y,3:k,4:g]
if (temp[0] == false)
{
this.addbang(bangid, tempbangid, temp[1], temp[2], temp[3], temp[4], isbig);
ishb = true;
}
else
{
isend = false;
}
}
else
{
isend = false;
}
}
isend = true;
while (isend == true)
{
tempbangid = this.F_TOP(bangid);
if (tempbangid != undefined)
{
let temp = this.JC_is_bang(bangid, tempbangid); //[f/t,1:x,2:y,3:k,4:g]
if (temp[0] == false)
{
this.addbang(bangid, tempbangid, temp[1], temp[2], temp[3], temp[4], isbig);
ishb = true;
}
else
{
isend = false;
}
}
else
{
isend = false;
}
}
return ishb;
};
addbang = (id1: number, id2: number, x: number, y: number, k: number, g: number, isbig: boolean) => //把合并的板写入,并改板的大小
{
let tempid1 = this.getID(id1);
let tempid2 = this.getID(id2);
if (this.xbang[tempid1].ishb == false)
{
this.HB_bang.push(id1);
}
this.HB_bang.push(id2);
this.xbang[tempid1].x = x;
this.xbang[tempid1].y = y;
this.xbang[tempid1].pbk = k;
this.xbang[tempid1].pbg = g;
this.xbang[tempid1].ishb = true;
this.xbang[tempid2].ishb = true;
if (isbig == true) { this.xbang[tempid1].isbig = true; this.xbang[tempid2].isbig = true; }
};
//计算相邻两块板中有空位的地方是否有其它小板 返回 false 为没有其它板true 有其它板 x,y,k,g
JC_is_bang = (bangid1: number, bangid2: number): [boolean, number, number, number, number] =>
{
let tb: YH_bang[] = [];
tb.push(this.xbang[this.getID(bangid1)]);
tb.push(this.xbang[this.getID(bangid2)]);
if (equaln(tb[0].y, tb[1].y, 0.01)) //左右相邻
{
tb.sort((a, b) => a.x - b.x);
if (tb[0].pbg < tb[1].pbg)//左上空间 右边高
{
return [this.JCQY_is_bang(tb[0].x, tb[0].y + tb[0].pbg + this.dt, tb[0].pbk, tb[1].pbg - tb[0].pbg - this.dt),
tb[0].x, tb[0].y, tb[0].pbk + tb[1].pbk + this.dt, tb[1].pbg];
}
else if (tb[0].pbg > tb[1].pbg)//右上空间 左边高
{
return [this.JCQY_is_bang(tb[1].x, tb[1].y + tb[1].pbg + this.dt, tb[1].pbk, tb[0].pbg - tb[1].pbg - this.dt),
tb[0].x, tb[0].y, tb[0].pbk + tb[1].pbk + this.dt, tb[0].pbg];
}
else //一样高
{
return [false, tb[0].x, tb[0].y, tb[0].pbk + tb[1].pbk + this.dt, tb[0].pbg];
}
}
else //上下空间
{
tb.sort((b, a) => a.y - b.y);
if (tb[0].pbk < tb[1].pbk)//右上空间 上边短
{
return [this.JCQY_is_bang(tb[0].x + tb[0].pbk + this.dt, tb[0].y, tb[1].pbk - tb[0].pbk - this.dt, tb[0].pbg),
tb[1].x, tb[1].y, tb[1].pbk, tb[0].pbg + tb[1].pbg + this.dt];
}
else if (tb[0].pbk > tb[1].pbk)//右下空间 下边短
{
return [this.JCQY_is_bang(tb[1].x + tb[1].pbk + this.dt, tb[1].y, tb[0].pbk - tb[1].pbk - this.dt, tb[1].pbg),
tb[1].x, tb[1].y, tb[0].pbk, tb[0].pbg + tb[1].pbg + this.dt];
}
else //一样高
{
return [false, tb[1].x, tb[1].y, tb[0].pbk, tb[0].pbg + tb[1].pbg + this.dt];
}
}
};
//检测两块板之间相交的长度且两块板之间没有其它板 返回长度第一个为X相交长度 第二个为Y相交长度
XJcd = (bangid1: number, bangid2: number): [number, number] =>
{
let tempbang: YH_bang[] = [];
tempbang.push(this.xbang[this.getID(bangid1)]);
tempbang.push(this.xbang[this.getID(bangid2)]);
let tempx = this.Jcxj(tempbang[0].x, tempbang[0].pbk, tempbang[1].x, tempbang[1].pbk);
let tempy = this.Jcxj(tempbang[0].y, tempbang[0].pbg, tempbang[1].y, tempbang[1].pbg);
if (tempx > 0 && tempy > 0)
{
return [tempx, tempy];
}
else if (tempx > 0)
{
tempbang.sort((a, b) => a.x - b.x);
if (tempbang[0].y > tempbang[1].y)
{
if (this.JCQY_is_bang(tempbang[1].x, tempbang[1].y + tempbang[1].pbg, tempx, tempbang[0].y - tempbang[1].y - tempbang[1].pbg) == false)
{
return [tempx, 0];
}
else
{
return [0, 0];
}
}
else
{
if (this.JCQY_is_bang(tempbang[1].x, tempbang[0].y + tempbang[0].pbg, tempx, tempbang[1].y - tempbang[0].y - tempbang[0].pbg) == false)
{
return [tempx, 0];
}
else
{
return [0, 0];
}
}
}
else if (tempy > 0)
{
tempbang.sort((a, b) => a.x - b.x);
if (tempbang[0].y > tempbang[1].y)
{
if (this.JCQY_is_bang(tempbang[0].x + tempbang[0].pbk, tempbang[0].y, tempbang[1].x - tempbang[0].x - tempbang[0].pbk, tempy) == false)
{
return [0, tempy];
}
else
{
return [0, 0];
}
}
else
{
if (this.JCQY_is_bang(tempbang[0].x + tempbang[0].pbk, tempbang[1].y, tempbang[1].x - tempbang[0].x - tempbang[0].pbk, tempy) == false)
{
return [0, tempy];
}
else
{
return [0, 0];
}
}
}
else
{
return [0, 0];
}
};
//检测指定区域内否有其它小板 返回 false 为没有其它板true 有其它板
JCQY_is_bang = (x: number, y: number, k: number, g: number): boolean =>
{
let result = this.xbang.findIndex((n) => (k + n.pbk - Math.abs(x - n.x) - Math.abs(x - n.x + k - n.pbk)) / 2 > 0.01 &&
(g + n.pbg - Math.abs(y - n.y) - Math.abs(y - n.y + g - n.pbg)) / 2 > 0.01);
if (result == -1) { return false; } else { return true; }
};
//计算两边相交长度/
Jcxj = (wz1: number, l1: number, wz2: number, l2: number): number => { return (l1 + l2 - Math.abs(wz1 - wz2) - Math.abs(wz1 - wz2 + l1 - l2)) / 2; };
Find_BS = (): number[] =>
{
let temp = this.Find_BS_gr();
if (temp[0] > 2)
{
return this.Find_BS_wgr()[1];
}
else
{
if (temp[1][0] == 0)
{
return this.Find_BS_wgr()[1];
}
else
{
return temp[1];
}
}
};
//找到共边最少的板的集合 订算有关系的板
Find_BS_gr = (): [number, number[]] =>
{
let bs: number = 6;
let id: number[] = [];
let tempsl: number[];
if (this.xbang.length == 1)
{
return [0, [0]];
}
else
{
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].isgr == false && this.xbang[i].ishb == false && this.xbang[i].isqg == false)
{
tempsl = this.JSgbsl(this.xbang[i].bangid);
if (bs == tempsl[0])
{
id.push(this.xbang[i].bangid);
}
else if (bs > tempsl[0])
{
bs = tempsl[0];
id = [];
id.push(this.xbang[i].bangid);
}
}
}
if (id.length > 0)
{ return [bs, id]; }
else
{
//console.log("没找到最少边");
return [0, [0]];
}
}
};
//找到共边最少的板的集合 订算没有算关系的板
Find_BS_wgr = (): [number, number[]] =>
{
let bs: number = 6;
let id: number[] = [];
let tempsl: number[];
if (this.xbang.length == 1)
{
return [0, [0]];
}
else
{
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].ishb == false && this.xbang[i].isqg == false)
{
tempsl = this.JSgbsl(this.xbang[i].bangid);
if (bs == tempsl[0])
{
id.push(this.xbang[i].bangid);
}
else if (bs > tempsl[0])
{
bs = tempsl[0];
id = [];
id.push(this.xbang[i].bangid);
}
}
}
if (id.length > 0) { return [bs, id]; } else { return [0, [0]]; }
}
};
//计算这块板的与其它板的相交的边数,及每条边数跟权重 0数量 1左 2右 3上 4下 5权重
JSgbsl = (bangid: number): [number, number, number, number, number, number] =>
{
let left = 0, right = 0, top = 0, down = 0, qz = 0;
let bangIndex = this.getID(bangid);
for (let j = 0; j < this.xbang.length; j++)
{
if (bangIndex != j && this.xbang[j].isqg == false)
{
let jjy = this.Jcxj(this.xbang[bangIndex].y, this.xbang[bangIndex].pbg, this.xbang[j].y, this.xbang[j].pbg);
let jjx = this.Jcxj(this.xbang[bangIndex].x, this.xbang[bangIndex].pbk, this.xbang[j].x, this.xbang[j].pbk);
if (this.xbang[bangIndex].pbg > this.xbang[bangIndex].pbk)
{
if (jjy < this.xbang[bangIndex].pbk && jjy < 50) { jjy = 0; }
}
if (this.xbang[bangIndex].pbk > this.xbang[bangIndex].pbg)
{
if (jjx < this.xbang[bangIndex].pbg && jjx < 50) { jjx = 0; }
}
if (jjy > 0 && this.xbang[bangIndex].x > this.xbang[j].x + this.xbang[j].pbk) { left = 1; }
if (jjy > 0 && this.xbang[j].x > this.xbang[bangIndex].x + this.xbang[bangIndex].pbk) { right = 1; }
if (jjx > 0 && this.xbang[bangIndex].y > this.xbang[j].y + this.xbang[j].pbg) { down = 1; }
if (jjx > 0 && this.xbang[j].y > this.xbang[bangIndex].y + this.xbang[bangIndex].pbg) { top = 1; }
if ((left == 1 && right == 1) || (down == 1 && top == 1)) { qz = 1; }
}
}
return [left + right + top + down + qz, left, right, top, down, qz];
};
Jcsb = (bangid1: number, bangid2: number): boolean => // 把bang1 要去掉, bang2 是否少边 返加True 有少边 False 没有少边
{
let xj = this.XJcd(bangid1, bangid2);
let jjx = xj[0]; let jjy = xj[1];
if (jjx > 0 && this.xbang[this.getID(bangid1)].pbg < this.xbang[this.getID(bangid2)].pbg)
{
return true;
}
else if (jjx > 0 && jjx > 0 && this.xbang[this.getID(bangid1)].pbk * this.xbang[this.getID(bangid1)].pbg < this.xbang[this.getID(bangid2)].pbk * this.xbang[this.getID(bangid2)].pbg)
{
return false;
}
else if (jjy > 0 && this.xbang[this.getID(bangid1)].pbg < this.xbang[this.getID(bangid2)].pbg)
{
return false;
}
else if (jjy > 0 && this.xbang[this.getID(bangid1)].pbg > this.xbang[this.getID(bangid2)].pbg)
{
return true;
}
// else if (jjy > 0 && this.xbang[this.getID(bangid2)].pbk > this.xbang[this.getID(bangid2)].pbg
// && this.xbang[this.getID(bangid2)].pbk * this.xbang[this.getID(bangid2)].pbg < this.xbang[this.getID(bangid1)].pbk * this.xbang[this.getID(bangid1)].pbg)
// {
// return true;
// }
else
{
return false;
}
// if (bangid1 == 2 && bangid2 == 10)
// {
// console.log(bangid1);
// }
// let bs1 = this.JSgbsl(bangid1)[0];
// let bs2 = this.JSgbsl(bangid2)[0];
// let sb2 = this.is_sb(bangid1, bangid2)[0];
// let sb1 = this.is_sb(bangid2, bangid1)[0];
// if (sb2 < bs1 && sb1 < bs2)
// {
// return true;
// }
// else
// {
// return false;
// }
};
//检测所有会让其它板少条且最小的的板
JS_sb_minmz = (): number =>
{
let Bangidzh = this.Find_BS();
if (Bangidzh[0] != 0)
{
let tempbang: YH_bang[] = [];
for (let m = 0; m < Bangidzh.length; m++)
{
tempbang.push(this.xbang[this.getID(Bangidzh[m])]);
}
if (tempbang.length > 0)
{
tempbang.sort((a, b) => a.pbg * a.pbk - b.pbg * b.pbk);
return tempbang[0].bangid;
}
else if (tempbang.length == 1)
{
return tempbang[0].bangid;
}
else
{
return -1;
}
}
else
{
return -1;
}
};
//合并所有的板
HB_b = () =>
{
let jshb_lr: boolean = true;
let jshb_td: boolean = true;
let jshb: boolean;
for (let i = 0; i < this.xbang.length; i++)
{
if (this.xbang[i].ishb == false) { jshb = true; } else { jshb = false; }
while (jshb == true)
{
if (this.xbang[i].pbg > this.xbang[i].pbk && this.xbang[i].pbk > 100) //左右
{
jshb_lr = this.HB_LR(this.xbang[i].bangid, false);
}
else
{
jshb_lr = false;
}
if ((this.xbang[i].pbg < this.xbang[i].pbk && this.xbang[i].pbg > 100)) //上下合并
{
jshb_td = this.HB_TD(this.xbang[i].bangid, false);
}
else
{
jshb_td = false;
}
if (jshb_lr == true || jshb_td == true)
{
jshb = true;
}
else if (jshb_lr == false || jshb_td == false)
{
if ((this.xbang[i].pbg > 100 && this.xbang[i].pbk > 100)) //上下合并
{
jshb_lr = this.HB_LR(this.xbang[i].bangid, false);
jshb_td = this.HB_TD(this.xbang[i].bangid, false);
if (jshb_lr == true || jshb_td == true) { jshb = true; } else { jshb = false; }
}
else
{
jshb = false;
}
}
else
{
jshb = true;
}
}
if (this.HB_bang.length > 0)
{
this.HB.push(this.HB_bang);
this.HB_bang = [];
}
}
};
//合并指定的板 第一步
HB_Max_bang = (Bangid: number) =>
{
if (Bangid > 0)
{
let jshb_lr: boolean = true;
let jshb_td: boolean = true;
let jshb: boolean;
let bangid = this.getID(Bangid);
if (this.xbang[bangid].ishb == false) { jshb = true; } else { jshb = false; }
while (jshb == true)
{
if (this.xbang[bangid].pbg > this.xbang[bangid].pbk && this.xbang[bangid].pbk > 100) //左右
{
jshb_lr = this.HB_LR(this.xbang[bangid].bangid, false);
}
else
{
jshb_lr = false;
}
if ((this.xbang[bangid].pbg < this.xbang[bangid].pbk && this.xbang[bangid].pbg > 100)) //上下合并
{
jshb_td = this.HB_TD(this.xbang[bangid].bangid, false);
}
else
{
jshb_td = false;
}
if (jshb_lr == true || jshb_td == true)
{
jshb = true;
}
else if (jshb_lr == false || jshb_td == false)
{
if ((this.xbang[bangid].pbg > 100 && this.xbang[bangid].pbk > 100)) //上下合并
{
jshb_lr = this.HB_LR(this.xbang[bangid].bangid, false);
jshb_td = this.HB_TD(this.xbang[bangid].bangid, false);
if (jshb_lr == true || jshb_td == true) { jshb = true; } else { jshb = false; }
}
else
{
jshb = false;
}
}
else
{
jshb = true;
}
}
if (this.HB_bang.length > 0)
{
this.HB.push(this.HB_bang);
this.HB_bang = [];
}
else
{
this.HB.push([Bangid]);
this.xbang[bangid].ishb = true;
}
}
};
//合并上面的大板 cd为共边长度
HB_top = (bangid: number, cd: number) =>
{
let hbbang: number[] = [];
let fid: number = bangid;
while (fid > -1)
{
fid = this.F_Top_Big(fid, cd);
if (fid > -1)
{
this.xbang[this.getID(fid)].ishb = true;
hbbang.push(fid);
//this.printstr(fid, 1, "大合", -30, 80, 50);
}
}
if (hbbang.length > 0) { this.HB.push(hbbang); }
};
//合并下面的大板 cd为共边长度
HB_down = (bangid: number, cd: number) =>
{
let hbbang: number[] = [];
let fid: number = bangid;
while (fid > -1)
{
fid = this.F_Down_Big(fid, cd);
if (fid > -1)
{
this.xbang[this.getID(fid)].ishb = true;
hbbang.push(fid);
// this.printstr(fid, 1, "大合", 10, 80, 50);
}
}
if (hbbang.length > 0) { this.HB.push(hbbang); }
};
//寻找最后一块要切割的板
F_last_mz = (jlID: number): number =>
{
let bangid: number;
let temp: number[];
let index: number = 1;
let lastId: number;
if (jlID == 0) { lastId = this.F_minMZ(); } else { lastId = jlID; }
while (true)
{
if (lastId == -1) { break; }
bangid = this.JS_sb_Bxl(lastId); //检测所有会让其它板少条且有两块或者多块边相邻的板
if (bangid > -1)
{ this.add_last(bangid, index); index++; lastId = bangid; }
else
{
bangid = this.JS_sb_minmz(); //检测所有会让其它板少条且最小的的板
if (bangid > -1)
{ this.add_last(bangid, index); index++; lastId = bangid; }
else
{
if (lastId == -1) { break; }
bangid = this.F_minJL(lastId);
if (bangid > -1) { this.add_last(bangid, index); index++; lastId = bangid; }
else
{
bangid = this.F_minMZ(); //找到面积最小的板
this.add_last(bangid, index);
index++;
lastId = bangid;
}
}
}
// bangid = this.F_minJL(bangid);
//if (bangid > -1) { this.add_last(bangid, index); index++; }
temp = this.Find_BS();
if (temp[0] == 0)
{
break;
}
}
return index;
};
//寻找最后一块要切割的板
F_last_jl = (jlID: number): number =>
{
let bangid: number;
let temp: number[];
let index: number = 1;
let lastId: number;
if (jlID == 0) { lastId = this.F_minMZ(); } else { lastId = jlID; }
let tempend: boolean = false;
while (true)
{
if (lastId == -1) { break; }
bangid = this.JS_sb_Bxl(lastId); //检测所有会让其它板少条且有两块或者多块边相邻的板
if (bangid > -1)
{ this.add_last(bangid, index); index++; lastId = bangid; }
else
{
if (lastId == -1) { break; }
bangid = this.F_minJL(lastId);
if (bangid > -1)
{ this.add_last(bangid, index); index++; lastId = bangid; }
else
{
//bangid = this.F_minMZ(); //找到面积最小的板
// if (lastId == -1) { break; }
// bangid = this.F_minJL(lastId);
bangid = this.JS_sb_minmz(); //检测所有会让其它板少条且最小的的板
if (bangid > -1) { this.add_last(bangid, index); index++; lastId = bangid; }
else
{
bangid = this.F_minMZ(); //找到面积最小的板
this.add_last(bangid, index);
index++;
lastId = bangid;
}
}
}
// bangid = this.F_minJL(bangid);
//if (bangid > -1) { this.add_last(bangid, index); index++; }
temp = this.Find_BS();
if (temp[0] == 0)
{
break;
}
}
return index;
};
//打印并添加最后一块
add_last = (bangid: number, index: number) =>
{
let tempx: number;
//if (index > 9) { tempx = 27; } else { tempx = 10; } 这两行用于测试打印
//this.printstr(bangid, 1, index.toString(), this.xbang[this.getID(bangid)].pbk / 2 - tempx, this.xbang[this.getID(bangid)].pbg / 2 - 20, 50);
this.SCid.push(bangid);
this.xbang[this.getID(bangid)].isqg = true;
let tempid = this.xbang[this.getID(bangid)].grid;
if (this.xbang[this.getID(bangid)].grid > -1)
{
let tempin = this.xbang[this.getID(tempid)].gr.findIndex((n) => n == bangid);
if (tempin > -1)
{
this.xbang[this.getID(tempid)].gr.splice(tempin, 1);
if (this.xbang[this.getID(tempid)].gr.length == 0) { this.xbang[this.getID(tempid)].isgr = false; }
}
}
};
//找到面积最小的板
F_minMZ = (): number =>
{
let jhb = this.Find_BS();
if (jhb[0] != 0)
{
let tempBang: YH_bang[] = [];
if (jhb.length == 1)
{
return jhb[0];
}
else
{
for (let i = 0; i < jhb.length; i++)
{
tempBang.push(this.xbang[this.getID(jhb[i])]);
}
tempBang = tempBang.sort((a, b) =>
{
if (a.pbg * a.pbk == b.pbg * b.pbk)
{
return Math.hypot(this.B_k - a.x - a.pbk / 2, this.B_g - a.y - a.pbg / 2) - Math.hypot(this.B_k - b.x - b.pbk / 2, this.B_g - b.y - b.pbg / 2);
}
else
{
return a.pbg * a.pbk - b.pbg * b.pbk ? -1 : 1;
}
});
return tempBang[0].bangid;
}
}
else
{
return -1;
}
};
//按位置最近排序
F_minJL = (bangid: number): number =>
{
let jhb = this.Find_BS();
if (jhb.length[0] != 0)
{
let tempBang: YH_bang[] = [];
if (jhb.length > 0)
{
for (let i = 0; i < jhb.length; i++)
{
tempBang.push(this.xbang[this.getID(jhb[i])]);
}
let wzx = this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk / 2;
let wzy = this.xbang[this.getID(bangid)].y + this.xbang[this.getID(bangid)].pbg / 2;
tempBang.sort((a, b) => a.pbk * a.pbg - b.pbk * b.pbg);
if (tempBang[tempBang.length - 1].pbg * tempBang[tempBang.length - 1].pbk / 1000000 - tempBang[0].pbg * tempBang[0].pbk / 1000000 > 0.2)
{
return tempBang[0].bangid;
}
else
{
tempBang.sort((a, b) => Math.hypot(wzx - a.x - a.pbk / 2, wzy - a.y - a.pbg / 2) - Math.hypot(wzx - b.x - b.pbk / 2, wzy - b.y - b.pbg / 2));
return tempBang[0].bangid;
}
}
else if (jhb.length == 1)
{
return jhb[0];
}
else
{
return -1;
}
}
else
{
return -1;
}
};
//检测所有会让其它板少条且有两块或者多块边相邻的板
JS_sb_Bxl = (bangid: number): number =>
{
let Bangidzh = this.Find_BS();
if (Bangidzh[0] != 0)
{
let tempbang: YH_bang[] = [];
let tempxj: YH_bang[] = [];
let temp: YH_bang;
for (let m = 0; m < Bangidzh.length; m++)
{
for (let n = 0; n < Bangidzh.length; n++)
{
if (m != n)
{
if (this.Jcsb(Bangidzh[m], Bangidzh[n]) == true)
{
tempbang.push(this.xbang[this.getID(Bangidzh[m])]);
}
}
}
}
if (tempbang.length == 1)
{
return tempbang[0].bangid;
}
else if (tempbang.length == 0)
{
return -1;
}
else //(tempbang.length > 1);
{
let wzx = this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk / 2;
let wzy = this.xbang[this.getID(bangid)].y + this.xbang[this.getID(bangid)].pbg / 2;
tempbang.sort((a, b) => Math.hypot(wzx - a.x - a.pbk / 2, wzy - a.y - a.pbg / 2) - Math.hypot(wzx - b.x - b.pbk / 2, wzy - b.y - b.pbg / 2));
return tempbang[0].bangid;
}
}
else
{
return -1;
}
};
//用于计算下刀顺序
XDscjs = () =>
{
let bangid = this.MaxMZ(0.05);
this.HB_Max_bang(bangid);
this.HB_top(bangid, 200);
this.HB_down(bangid, 200);
this.F_GL_LR();
this.F_GL_TD();
this.Is_big_gr();
this.F_GL_JJB();
let index: number;
if (this.jl_mz == 1)
{
index = this.F_last_jl(0);
} else
{
index = this.F_last_mz(0);
}
this.printHBCS(index);
};
printHBCS = (index: number) =>
{
for (let m = this.HB.length - 1; m >= 0; m--)
{
for (let n = this.HB[m].length - 1; n >= 0; n--)
{
//this.printstr(this.HB[m][n], 1, index.toString(), this.Bakbang[this.getID_Bkb(this.HB[m][n])].pbk / 2, this.Bakbang[this.getID_Bkb(this.HB[m][n])].pbg / 2, 50);
this.SCid.push(this.HB[m][n]);
index++;
};
}
};
};
function equaln(v1: number, v2: number, fuzz = 1e-5)
{
return Math.abs(v1 - v2) <= fuzz;
}