Per bearing: L = A + margin along the 교축 (s), W = B + margin across it; the underside is the bearing top (block top EL.X + h3); the top tapers from T1 = T + L·|S|/200 at the 시점 side (−s) to T2 = T − L·|S|/200 at the 종점 side, so T1 + T2 = 2T and the volume is L·W·T. Corners follow the bearing row (rowSkew). Tests cover L, W, T1, T2, the underside, the volume and the centring. The model and the 3D do not use it yet. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
44 lines
1.8 KiB
TypeScript
44 lines
1.8 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
import { buildPier } from '../src/core/geometry';
|
||
import { solplateGeometry } from '../src/core/solplate';
|
||
import { loadP1 } from './helpers';
|
||
|
||
const model = buildPier(loadP1());
|
||
const front1 = model.blocks.filter((b) => b.row === '전열')[0];
|
||
const params = { A: 700, B: 640, margin: 100, T: 30, slopePct: -1.91 };
|
||
|
||
describe('솔플레이트 기하 (1단계, 승인 2026-10-23)', () => {
|
||
it('L = A + 100 and W = B + 100 along the 교축 and the 교각축 직각', () => {
|
||
const g = solplateGeometry(front1, 181, params);
|
||
expect(g.L).toBeCloseTo(0.8, 6);
|
||
expect(g.W).toBeCloseTo(0.74, 6);
|
||
});
|
||
|
||
it('the thick end T1 is on the 시점 side (−s): T1 ≈ 38, T2 ≈ 22 mm, and T1 + T2 = 2T', () => {
|
||
const g = solplateGeometry(front1, 181, params);
|
||
expect(g.T1 * 1000).toBeCloseTo(37.64, 1);
|
||
expect(g.T2 * 1000).toBeCloseTo(22.36, 1);
|
||
expect((g.T1 + g.T2) * 1000).toBeCloseTo(60, 6);
|
||
// The top at the 시점 corners is the thick side.
|
||
const topAtStart = g.corners.filter((c) => Math.abs(c[1] - (g.bottom + g.T1)) < 1e-9);
|
||
expect(topAtStart.length).toBe(2);
|
||
});
|
||
|
||
it('the underside is the bearing top: block top (EL.X) + h3', () => {
|
||
const g = solplateGeometry(front1, 181, params);
|
||
expect(g.bottom).toBeCloseTo(front1.padTop + 0.181, 6);
|
||
});
|
||
|
||
it('volume = L·W·T (the taper averages to the centre thickness)', () => {
|
||
const g = solplateGeometry(front1, 181, params);
|
||
expect(g.volume).toBeCloseTo(g.L * g.W * 0.03, 9);
|
||
});
|
||
|
||
it('the solplate is centred on the block and follows the row direction', () => {
|
||
const g = solplateGeometry(front1, 181, params);
|
||
const c = g.corners.reduce((acc, p) => [acc[0] + p[0] / 8, acc[1] + p[2] / 8] as [number, number], [0, 0]);
|
||
expect(c[0]).toBeCloseTo(front1.s, 6);
|
||
expect(c[1]).toBeCloseTo(front1.n, 6);
|
||
});
|
||
});
|