Sprint 29/30 — 지점부 격벽 + 거더 솟음

Sprint 29: Diaphragm (지점부 격벽).
- SceneParams.show_diaphragms 토글 (default true).
- 모든 지점(교대+교각) 에서 인접 거더 사이 RC 벽 배치:
  · 두께(span 방향): 300mm
  · 높이: girder_h (거더 soffit ~ top)
  · 폭: spacing - 250mm (web clearance 양쪽 125mm)
  · 지점 Z 기준 중앙 배치, skew 회전 동시 적용
- build_bridge_scene + build_selectable_scene 양쪽 구현.
- COL_DIAPHRAGM 색상 추가 (concrete 계열).
- UI: "격벽 (Diaphragm)" 체크박스.

Sprint 30: Camber (거더 솟음).
- SceneParams.camber_mid_mm (0~200mm, step 5mm) 추가.
- apply_camber_mesh(mesh, z0, z1, mid_mm) 헬퍼:
  u = z - z0 ∈ [0, span], y_off = 4·mid·u·(span-u)/span² (포물선).
  지점(u=0 또는 u=span) 에서는 0, 중앙 u=span/2 에서 최대 mid.
- 거더·데크에 경간마다 독립 적용. 다경간 교량도 경간별 정확한 solog.
- UI: "솟음 (mm)" 슬라이더.

ProjectFile: show_diaphragms + camber_mid_mm 필드 (default 값으로 v2 호환).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
minsung
2026-04-15 14:01:58 +09:00
parent a2c6e8ee1f
commit 0013182835
4 changed files with 118 additions and 10 deletions

View File

@@ -635,6 +635,8 @@ impl RenderState {
if p.pier_type != prev_pt { dirty = true; }
// Sprint 27: 경사각 (Skew)
ps!("경사각 (°)", &mut p.skew_deg, -30.0..=30.0, 1.0);
// Sprint 30: 솟음 (Camber) 중앙 솟음량 [mm]
ps!("솟음 (mm)", &mut p.camber_mid_mm, 0.0..=200.0, 5.0);
ui.label("단면 형식");
let prev_sec = p.section_type;
@@ -668,6 +670,11 @@ impl RenderState {
let prev_ej = p.show_expansion_joints;
ui.checkbox(&mut p.show_expansion_joints, "신축이음 (Exp. Joint)");
if prev_ej != p.show_expansion_joints { dirty = true; }
// Sprint 29: 격벽
let prev_d = p.show_diaphragms;
ui.checkbox(&mut p.show_diaphragms, "격벽 (Diaphragm)");
if prev_d != p.show_diaphragms { dirty = true; }
});
// ── 표시 옵션 ─────────────────────────────────────────