feat(bearing): 교대만 있을 때 A1 ↔ A2 현(chord) 짝 받침
교각 없이 A1 · A2만 불러온 다경간 곡선교(운곡교 광주·완도, 358 m, 방위각 8° 차)는 거더 짝 허용오차 (방위각 ≤ 0.1°)를 넘어 짝이 없었다. 교각이 0기일 때만, A1 받침과 A2 받침을 잇는 현의 방향이 두 방위각의 평균과 0.1° 이내인 받침을 짝으로 한다(원곡선이면 정확히 같다). 같은 노선·같은 번호가 117″, 다른 후보는 1176″ 이상이라 하나로 정해진다. - S = Δz / 현 길이 (교량 전체 평균 경사), S 근거 '계산', 짝 받침 표시 "A2-광주-① (현)" - 방위각 검사 칸은 "현 117″ (참고)": 한 거더용 10″ 규칙이 아니므로 WS01은 내지 않음 - 교각이 하나라도 있으면 쓰지 않음. 단경간 직선(A1·A2 방위각 같음)은 기존 거더 짝으로 처리 - 테스트: 곡선 두 노선 합성 10쌍(노선·번호 일치), 교대 카드 표시, 교각 있을 때 미적용 - 브라우저: 운곡교AA.xlsx A1-광주 ①–⑤ ↔ A2-광주 ①–⑤ (현), S −1.900 ~ −1.892 % Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3bd2340609
commit
7c5f129712
7 files changed
+88
-8
No files matched your search
@@ -134,3 +134,37 @@ describe('두 노선 (광주 · 완도) — 목록 순서와 무관하게 거더
|
||||
expect(pairs.every((p) => p.from.structure.slice(3) === p.to.structure.slice(3) && p.from.structure.startsWith('A1') && p.from.no === p.to.no)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('교대만 (교각 0기): A1 ↔ A2 현 짝 (검토 2026-11-06)', () => {
|
||||
// Circular arc: A2_i lies at chord azimuth θ_i − δ, 350 m away, with azimuth θ_i − 2δ (the chord is the mean azimuth).
|
||||
const curved = (rec: typeof a1, name: string, type: 'A1' | 'A2', de = 0) => ({ ...rec, name, type, bearings: rec.bearings.map((b) => {
|
||||
const delta = 4, t = ((b.azimuthDeg! - delta) * Math.PI) / 180;
|
||||
return type === 'A1' ? { ...b, pos: { e: b.pos.e + de, n: b.pos.n } }
|
||||
: { ...b, azimuthDeg: b.azimuthDeg! - 2 * delta, pos: { e: b.pos.e + de + 350 * Math.sin(t), n: b.pos.n + 350 * Math.cos(t) }, z: b.z - 6.65 };
|
||||
}) });
|
||||
const abuts = [curved(a1, 'A1-광주', 'A1', 13), curved(a1, 'A1-완도', 'A1'), curved(a1, 'A2-광주', 'A2', 13), curved(a1, 'A2-완도', 'A2')];
|
||||
|
||||
it('two curved lines without piers: each A1 bearing pairs with the same number on its own line\'s A2 (현), S = Δz / chord', async () => {
|
||||
const { bridgePairs } = await import('../src/core/bridge-pairs');
|
||||
const pairs = bridgePairs([], abuts);
|
||||
expect(pairs).toHaveLength(10);
|
||||
expect(pairs.every((p) => p.kind === 'chord' && p.from.structure.slice(3) === p.to.structure.slice(3) && p.from.no === p.to.no && p.warnings.length === 0)).toBe(true);
|
||||
expect(pairs.every((p) => p.fromCheckSec < 1 && Math.abs(p.slopePct + 1.9) < 1e-6)).toBe(true);
|
||||
});
|
||||
|
||||
it('the 교대 card shows the 현 pair: A1-광주 ① ↔ A2-광주-① (현), S 계산', async () => {
|
||||
const { bridgePairs } = await import('../src/core/bridge-pairs');
|
||||
const { abutSolplateRows, resolveBearingRule } = await import('../src/core/abut/bearing-table');
|
||||
const { buildAbut } = await import('../src/core/abut/geometry');
|
||||
const { toAbutInput } = await import('../src/core/abut/parse');
|
||||
const rec = abuts[0];
|
||||
const rows = abutSolplateRows(buildAbut(toAbutInput(rec)), resolveBearingRule(), rec.bearingHeightMm, { pairs: bridgePairs([], abuts), slopeI: rec.slopeI });
|
||||
expect(rows[0]).toMatchObject({ pair: 'A2-광주-① (현)', pairKind: 'chord', source: '계산' });
|
||||
expect(rows[0].S).toBeCloseTo(-1.9, 6);
|
||||
});
|
||||
|
||||
it('with a pier loaded the chord rule is not used', async () => {
|
||||
const { bridgePairs } = await import('../src/core/bridge-pairs');
|
||||
expect(bridgePairs([p1], [a1, abuts[3]]).some((p) => p.kind === 'chord')).toBe(false);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user