refactor: various improvements

This commit is contained in:
2026-04-01 21:44:20 +08:00
parent 033fb6c894
commit dbe567ea1d
6 changed files with 65 additions and 103 deletions
+9 -9
View File
@@ -28,36 +28,36 @@ export type RegionAxis = {
export function applyAlign(region: Region){
if (region.children.length === 0) return;
// 对每个 axis 分别处理,但保持空间关系
// Process each axis independently while preserving spatial relationships
for (let axisIndex = 0; axisIndex < region.axes.length; axisIndex++) {
const axis = region.axes[axisIndex];
if (!axis.align) continue;
// 收集当前轴上的所有唯一位置值,保持原有顺序
// Collect all unique position values on this axis, preserving original order
const positionValues = new Set<number>();
for (const accessor of region.children) {
positionValues.add(accessor.value.position[axisIndex] ?? 0);
}
// 排序位置值
// Sort position values
const sortedPositions = Array.from(positionValues).sort((a, b) => a - b);
// 创建位置映射:原位置 -> 新位置
// Create position mapping: old position -> new position
const positionMap = new Map<number, number>();
if (axis.align === 'start' && axis.min !== undefined) {
// 从 min 开始紧凑排列,保持相对顺序
// Compact from min, preserving relative order
sortedPositions.forEach((pos, index) => {
positionMap.set(pos, axis.min! + index);
});
} else if (axis.align === 'end' && axis.max !== undefined) {
// 从 max 开始向前紧凑排列
// Compact towards max
const count = sortedPositions.length;
sortedPositions.forEach((pos, index) => {
positionMap.set(pos, axis.max! - (count - 1 - index));
});
} else if (axis.align === 'center') {
// 居中排列
// Center alignment
const count = sortedPositions.length;
const min = axis.min ?? 0;
const max = axis.max ?? count - 1;
@@ -70,14 +70,14 @@ export function applyAlign(region: Region){
});
}
// 应用位置映射到所有 part
// Apply position mapping to all parts
for (const accessor of region.children) {
const currentPos = accessor.value.position[axisIndex] ?? 0;
accessor.value.position[axisIndex] = positionMap.get(currentPos) ?? currentPos;
}
}
// 最后按所有轴排序 children
// Sort children by all axes at the end
region.children.sort((a, b) => {
for (let i = 0; i < region.axes.length; i++) {
const diff = (a.value.position[i] ?? 0) - (b.value.position[i] ?? 0);