Files
2026-03-19 20:35:54 +08:00

168 lines
4.7 KiB
TypeScript

import paper from "paper"
const scaleFlatPoint = (point: any, scale: number): [number, number] => {
return [point[0] * scale, point[1] * scale]
}
const scaleSegmentToPoint = (seg: any, scale: number): any => {
if (seg instanceof paper.Point) {
return [seg.x * scale, seg.y * scale]
}
if (seg instanceof paper.Segment) {
return [seg.point.x * scale, seg.point.y * scale]
}
if (
Array.isArray(seg) &&
seg.length >= 2 &&
typeof seg[0] === "number" &&
typeof seg[1] === "number"
) {
return scaleFlatPoint(seg, scale)
}
if (
Array.isArray(seg) &&
Array.isArray(seg[0]) &&
seg[0].length >= 2 &&
typeof seg[0][0] === "number" &&
typeof seg[0][1] === "number"
) {
// Support paper JSON segment format: [[x,y], [handleInX, handleInY], [handleOutX, handleOutY]]
return scaleFlatPoint(seg[0], scale)
}
if (
seg?.point &&
typeof seg.point.x === "number" &&
typeof seg.point.y === "number"
) {
return [seg.point.x * scale, seg.point.y * scale]
}
if (
seg?.point &&
Array.isArray(seg.point) &&
seg.point.length >= 2 &&
typeof seg.point[0] === "number" &&
typeof seg.point[1] === "number"
) {
return [seg.point[0] * scale, seg.point[1] * scale]
}
return seg
}
// 调整原始比例点位到当前图片的缩放比例
export const adjustPoints: (
id: string,
nestedMap: Map<string, Map<string, [number, any[], any, any[]][]>>,
scale: number
) => Map<string, Map<string, [number, any[], any, any[]][]>> = (
id,
nestedMap,
scale
) => {
const adjustedMap = new Map<
string,
Map<string, [number, any[], any, any[]][]>
>()
nestedMap.forEach((innerMap, outerKey) => {
if (id === outerKey) {
const adjustedInnerMap = new Map<
string,
Array<[number, any[], any, any[]]>
>()
innerMap.forEach((array, innerKey) => {
const adjustedArray = array.map(
([id, points, detail, hollowPoints]) => {
// let adjustedPoints = points.map((point) => {
// let flag = point instanceof paper.Point;
// if (flag) {
// return [point.x * scale, point.y * scale];
// } else {
// return point.map((item: any) => item * scale);
// }
// });
let adjustedPoints = points.map((child) => {
return child.map((seg: any) => {
return scaleSegmentToPoint(seg, scale)
})
})
let adjustedHollowPoints = hollowPoints.map((child) => {
return child.map((seg: any) => {
return scaleSegmentToPoint(seg, scale)
})
})
return [id, adjustedPoints, detail, adjustedHollowPoints]
}
)
adjustedInnerMap.set(innerKey, adjustedArray as any)
})
adjustedMap.set(outerKey, adjustedInnerMap)
} else {
adjustedMap.set(outerKey, innerMap)
}
})
return adjustedMap
}
// 根据比例调整不同图片的点位数据
export const adjustAllPoints: (
nestedMap: Map<string, Map<string, [number, any[], any, any[]][]>>,
allScale: { [x: string]: number }
) => Map<string, Map<string, [number, any[], any, any[]][]>> = (
nestedMap,
allScale
) => {
const adjustedMap = new Map<
string,
Map<string, [number, any[], any, any[]][]>
>()
if (!(nestedMap instanceof Map)) {
return adjustedMap
}
nestedMap.forEach((innerMap, outerKey) => {
const scale = allScale[outerKey]
if (scale) {
const adjustedInnerMap = new Map<
string,
Array<[number, any[], any, any[]]>
>()
innerMap.forEach((array, innerKey) => {
const adjustedArray = array.map(
([id, points, detail, hollowPoints]) => {
// let adjustedPoints = points.map((point) => {
// let flag = point instanceof paper.Point;
// if (flag) {
// return [point.x * scale, point.y * scale];
// } else {
// return point.map((item: any) => item * scale);
// }
// });
let adjustedPoints = points.map((child) => {
return child.map((seg: any) => {
return scaleSegmentToPoint(seg, scale)
})
})
let adjustedHollowPoints = hollowPoints.map((child) => {
return child.map((seg: any) => {
return scaleSegmentToPoint(seg, scale)
})
})
return [id, adjustedPoints, detail, adjustedHollowPoints]
}
)
adjustedInnerMap.set(innerKey, adjustedArray as any)
})
adjustedMap.set(outerKey, adjustedInnerMap)
} else {
adjustedMap.set(outerKey, innerMap)
}
})
return adjustedMap
}