|
|
@ -1,4 +1,4 @@
|
|
|
|
import { Matrix4, Vector3 } from "three";
|
|
|
|
import { Box3, Matrix4, Vector3 } from "three";
|
|
|
|
import { MatrixPlanarizere } from "../../Common/Matrix4Utils";
|
|
|
|
import { MatrixPlanarizere } from "../../Common/Matrix4Utils";
|
|
|
|
import { Board } from "../../DatabaseServices/Entity/Board";
|
|
|
|
import { Board } from "../../DatabaseServices/Entity/Board";
|
|
|
|
import { Region } from "../../DatabaseServices/Entity/Region";
|
|
|
|
import { Region } from "../../DatabaseServices/Entity/Region";
|
|
|
@ -145,7 +145,7 @@ export class Face
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return newFaces;
|
|
|
|
return newFaces;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
IsIntersect(f: Face, fuzz = 1e-6): boolean
|
|
|
|
IsIntersect(f: Face, fuzz = 1e-6, currentCoverBoxes: Box3[] = []): { isInt: boolean, coverBoxesList?: Box3[]; }
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//获得侧面和非侧面
|
|
|
|
//获得侧面和非侧面
|
|
|
|
let [sideFace, noSideFace] = this.type === BoardFaceType.Side ? [this, f] : [f, this];
|
|
|
|
let [sideFace, noSideFace] = this.type === BoardFaceType.Side ? [this, f] : [f, this];
|
|
|
@ -169,19 +169,55 @@ export class Face
|
|
|
|
let size = box.getSize(new Vector3);
|
|
|
|
let size = box.getSize(new Vector3);
|
|
|
|
|
|
|
|
|
|
|
|
if (equaln(size.x * size.y, 0))
|
|
|
|
if (equaln(size.x * size.y, 0))
|
|
|
|
return false;
|
|
|
|
return { isInt: false, coverBoxesList: currentCoverBoxes };
|
|
|
|
|
|
|
|
|
|
|
|
let con1 = Contour.CreateContour(c1);
|
|
|
|
let con1 = Contour.CreateContour(c1);
|
|
|
|
let con2 = Contour.CreateContour(c2);
|
|
|
|
let con2 = Contour.CreateContour(c2);
|
|
|
|
let cs = con1.IntersectionBoolOperation(con2);
|
|
|
|
let cs = con1.IntersectionBoolOperation(con2);
|
|
|
|
|
|
|
|
let width = 0;
|
|
|
|
|
|
|
|
let boxList: Box3[] = [];
|
|
|
|
|
|
|
|
//当前碰撞区域如果遮光直接退出
|
|
|
|
for (let c of cs)
|
|
|
|
for (let c of cs)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
c.BoundingBox.getSize(size);
|
|
|
|
let b = c.BoundingBox;
|
|
|
|
if (size.x / sideFace.Length > fuzz)
|
|
|
|
b.getSize(size);
|
|
|
|
return true;
|
|
|
|
width += size.x;
|
|
|
|
|
|
|
|
if (width / sideFace.Length > fuzz)
|
|
|
|
|
|
|
|
return { isInt: true };
|
|
|
|
|
|
|
|
boxList.push(b);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (currentCoverBoxes.length === 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return { isInt: false, coverBoxesList: boxList };
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//与旧盒子合并后测试是否遮光
|
|
|
|
|
|
|
|
width = 0;
|
|
|
|
|
|
|
|
while (currentCoverBoxes.length > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let b = currentCoverBoxes.pop();
|
|
|
|
|
|
|
|
let isInt = false;
|
|
|
|
|
|
|
|
for (let box of boxList)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (box.intersectsBox(b))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
isInt = true;
|
|
|
|
|
|
|
|
box.union(b);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!isInt)
|
|
|
|
|
|
|
|
boxList.push(b);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (let b of boxList)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
b.getSize(size);
|
|
|
|
|
|
|
|
width += size.x;
|
|
|
|
|
|
|
|
if (width / sideFace.Length > fuzz)
|
|
|
|
|
|
|
|
return { isInt: true };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
return { isInt: false, coverBoxesList: boxList };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -195,10 +231,38 @@ export class Face
|
|
|
|
{
|
|
|
|
{
|
|
|
|
retBox.intersect(box3);
|
|
|
|
retBox.intersect(box3);
|
|
|
|
let size = retBox.getSize(new Vector3());
|
|
|
|
let size = retBox.getSize(new Vector3());
|
|
|
|
return !equaln(size.x * size.y, 0) && size.x / sideFace.Length > fuzz && size.y / sideFace.Width > fuzz;
|
|
|
|
if (equaln(size.x * size.y, 0) || size.y / sideFace.Width <= fuzz)
|
|
|
|
|
|
|
|
return { isInt: false, coverBoxesList: currentCoverBoxes };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (size.x / sideFace.Length > fuzz)
|
|
|
|
|
|
|
|
return { isInt: true };
|
|
|
|
|
|
|
|
if (currentCoverBoxes.length === 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return { isInt: false, coverBoxesList: [retBox] };
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let b of currentCoverBoxes)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (b.intersectsBox(retBox))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
b.union(retBox);
|
|
|
|
|
|
|
|
retBox = null;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (retBox)
|
|
|
|
|
|
|
|
currentCoverBoxes.push(retBox);
|
|
|
|
|
|
|
|
let width = 0;
|
|
|
|
|
|
|
|
for (let b of currentCoverBoxes)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
b.getSize(size);
|
|
|
|
|
|
|
|
width += size.x;
|
|
|
|
|
|
|
|
if (width / sideFace.Length > fuzz)
|
|
|
|
|
|
|
|
return { isInt: true };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
return { isInt: false, coverBoxesList: currentCoverBoxes };
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return { isInt: false, coverBoxesList: currentCoverBoxes };
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|