feat(view): turn the bearing blocks, pads and block rebar to the bearing row (삽도)
Each block takes the skew of its bearing row against the perpendicular of its stretch axis (rowSkewDeg, from the bearing azimuth). The blocks and pads are turned to that skew, and the S1/S2 bars are drawn in the block frame and turned with it, so their lengths and embedments do not change. ② shows the row skew (P1: front −4.42°, back −3.11°). Approved 2026-10-23 with the drawing as reference. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e8541b29cb
commit
61260413c6
5 files changed
+89
-10
No files matched your search
+23
-2
@@ -66,6 +66,25 @@ export interface BlockModel {
|
||||
bottom: number;
|
||||
top: number;
|
||||
padTop: number;
|
||||
/** Skew (deg, −90…90] of the bearing row against the perpendicular of the stretch axis; the block sides follow the row. */
|
||||
rowSkewDeg: number;
|
||||
}
|
||||
|
||||
/** Skew of a bearing row (deg) from the bearing azimuth and the stretch axis direction u (see {@link BlockModel.rowSkewDeg}). */
|
||||
export function rowSkewDeg(bearingAzimuthDeg: number, u: Vec2): number {
|
||||
if (Number.isNaN(bearingAzimuthDeg)) return 0;
|
||||
const axisAz = (Math.atan2(u.e, u.n) * 180) / Math.PI;
|
||||
const d = (((bearingAzimuthDeg - (axisAz + 90)) % 180) + 540) % 180; // 0…180
|
||||
return d > 90 ? d - 180 : d;
|
||||
}
|
||||
|
||||
/**
|
||||
* (s, n) of a point (a along the block's s side, c along its n side) measured from the block centre, after the block turns
|
||||
* by its row skew. Same turn as the 3D geometry (rotateY(−skew)).
|
||||
*/
|
||||
export function blockFramePoint(b: Pick<BlockModel, 's' | 'n' | 'rowSkewDeg'>, a: number, c: number): [number, number] {
|
||||
const d = (b.rowSkewDeg * Math.PI) / 180;
|
||||
return [b.s + a * Math.cos(d) - c * Math.sin(d), b.n + a * Math.sin(d) + c * Math.cos(d)];
|
||||
}
|
||||
|
||||
export interface ColumnModel {
|
||||
@@ -372,13 +391,15 @@ export function buildPier(input: PierInput): PierModel {
|
||||
}
|
||||
|
||||
const blocks: BlockModel[] = [];
|
||||
const bearingAz = new Map(input.bearings.map((r) => [r.no, r.azimuthDeg]));
|
||||
const skewOf = (no: number, k: number) => rowSkewDeg(bearingAz.get(no) ?? NaN, axis.segments[k].u);
|
||||
frontPlaced.forEach((b) => {
|
||||
const bottom = segmentTop(segments, b.g);
|
||||
blocks.push({ no: b.no, row: '전열', k: b.k, s: b.s, g: b.g, n: b.n, bottom, top: b.z - DIM.padThickness, padTop: b.z });
|
||||
blocks.push({ no: b.no, row: '전열', k: b.k, s: b.s, g: b.g, n: b.n, bottom, top: b.z - DIM.padThickness, padTop: b.z, rowSkewDeg: skewOf(b.no, b.k) });
|
||||
});
|
||||
backPlaced.forEach((b) => {
|
||||
const bottom = b.z - h2;
|
||||
blocks.push({ no: b.no, row: '후열', k: b.k, s: b.s, g: b.g, n: b.n, bottom, top: b.z - DIM.padThickness, padTop: b.z });
|
||||
blocks.push({ no: b.no, row: '후열', k: b.k, s: b.s, g: b.g, n: b.n, bottom, top: b.z - DIM.padThickness, padTop: b.z, rowSkewDeg: skewOf(b.no, b.k) });
|
||||
});
|
||||
|
||||
const blockHeightFront = blocks.find((b) => b.row === '전열')!.top - blocks.find((b) => b.row === '전열')!.bottom;
|
||||
|
||||
Reference in new issue
Block a user