|
|
|
@ -9,25 +9,27 @@ import { arrayPushArray, arraySortByNumber } from "../../Nest/Common/ArrayExt";
|
|
|
|
|
import { Max } from '../../Nest/Common/Util';
|
|
|
|
|
import { FuzzyFactory } from '../../csg/core/FuzzyFactory';
|
|
|
|
|
|
|
|
|
|
/** [area maxXIndex maxYIndex xCount yCount,width,height] */
|
|
|
|
|
export type RectData = [number, number, number, number, number, number, number];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取面积最大的矩形
|
|
|
|
|
* @param rects
|
|
|
|
|
* @returns
|
|
|
|
|
*/
|
|
|
|
|
function GetMaxAreaFn(rects: [number, number, number, number, number][]): number
|
|
|
|
|
function GetMaxAreaFn(rects: RectData[]): number
|
|
|
|
|
{
|
|
|
|
|
return Max(rects, (t1, t2) => t2[0] > t1[0]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetMaxWidthFn(rects: [number, number, number, number, number][]): number
|
|
|
|
|
function GetMaxWidthFn(rects: RectData[]): number
|
|
|
|
|
{
|
|
|
|
|
return Max(rects, (t1, t2) => t2[1] > t1[1]);
|
|
|
|
|
return Max(rects, (t1, t2) => t2[5] > t1[5]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetMaxHeightFn(rects: [number, number, number, number, number][]): number
|
|
|
|
|
function GetMaxHeightFn(rects: RectData[]): number
|
|
|
|
|
{
|
|
|
|
|
return Max(rects, (t1, t2) => t2[2] > t1[2]);
|
|
|
|
|
return Max(rects, (t1, t2) => t2[6] > t1[6]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -80,7 +82,7 @@ export class LargestInteriorRectangle
|
|
|
|
|
/** 可以自定义过滤函数,以便过滤掉某些不需要的矩形,当返回true时,我们会过滤它 */
|
|
|
|
|
FilterRectFn: (width: number, height: number) => boolean;
|
|
|
|
|
|
|
|
|
|
GetMaxRectIndexFn: (rects: [number, number, number, number, number][]) => number = GetMaxAreaFn;
|
|
|
|
|
GetMaxRectIndexFn: (rects: RectData[]) => number = GetMaxAreaFn;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static GetMaxAreaFn = GetMaxAreaFn;
|
|
|
|
@ -283,8 +285,8 @@ export class LargestInteriorRectangle
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//area maxXIndex maxYIndex xcount ycount
|
|
|
|
|
let rects: [number, number, number, number, number][] = [];
|
|
|
|
|
//area maxXIndex maxYIndex xcount ycount,width,height
|
|
|
|
|
let rects: RectData[] = [];
|
|
|
|
|
|
|
|
|
|
for (let j = 0; j < n; j++) // 对于每一列,使用基于柱状图的方法
|
|
|
|
|
{
|
|
|
|
@ -332,7 +334,7 @@ export class LargestInteriorRectangle
|
|
|
|
|
//面积小于最小允许面积
|
|
|
|
|
if (area < this.MinArea) continue;
|
|
|
|
|
|
|
|
|
|
rects.push([area, down[i], j, xCount, yCount]);
|
|
|
|
|
rects.push([area, down[i], j, xCount, yCount, width, height]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|