<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>단면2차모멘트 &#8211; MyEngNote</title>
	<atom:link href="https://myengnote.com/tag/%eb%8b%a8%eb%a9%b42%ec%b0%a8%eb%aa%a8%eb%a9%98%ed%8a%b8/feed/" rel="self" type="application/rss+xml" />
	<link>https://myengnote.com</link>
	<description></description>
	<lastBuildDate>Wed, 08 Jul 2026 04:42:38 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>
	<item>
		<title>단면 2차 모멘트 계산기 &#038; 시뮬레이터</title>
		<link>https://myengnote.com/moment-of-inertia-cross-sections-calculator/</link>
					<comments>https://myengnote.com/moment-of-inertia-cross-sections-calculator/#respond</comments>
		
		<dc:creator><![CDATA[동동]]></dc:creator>
		<pubDate>Fri, 05 Jun 2026 22:50:07 +0000</pubDate>
				<category><![CDATA[공학계산기]]></category>
		<category><![CDATA[단면2차모멘트]]></category>
		<category><![CDATA[단면계수]]></category>
		<category><![CDATA[도형면적]]></category>
		<category><![CDATA[재료역학]]></category>
		<guid isPermaLink="false">https://myengnote.com/moment-of-inertia-cross-sections-calculator/</guid>

					<description><![CDATA[사각형, 중공 사각형, I형강, 원형 단면의 폭, 높이, 두께를 실시간 설정하여 단면적, 도심축, 단면 2차 모멘트(Ix, Iy) 및 단면회전반경을 실시간 유도 분석하는 시뮬레이터입니다.]]></description>
										<content:encoded><![CDATA[
<h2 style="font-size: 1.6em; font-weight: 800; color: #0c0e25; border-bottom: 2px solid #00f2fe; padding-bottom: 8px; margin-bottom: 20px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 단면 2차 모멘트 계산기 &#038; 시뮬레이터</h2>


<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&#038;family=Outfit:wght@400;500;600;700;800&#038;display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
/* Scoped & Isolated Styles for moment-of-inertia-calculator-wrapper-v2 */
        /* Modern Reset and Design Tokens */
        .moment-of-inertia-calculator-wrapper-v2 *, .moment-of-inertia-calculator-wrapper-v2 *::before, .moment-of-inertia-calculator-wrapper-v2 *::after {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        .moment-of-inertia-calculator-wrapper-v2 {
            --color-bg-dark: #f8f9fd;
            --color-bg-deep: #ffffff;
            --color-panel-bg: rgba(255, 255, 255, 0.85);
            --color-border: rgba(0, 0, 0, 0.06);
            --color-border-hover: rgba(0, 0, 0, 0.12);
            --color-text-main: #1e293b;
            --color-text-muted: #475569;
            --color-text-dark: #94a3b8;
            --color-cyan: #0284c7; /* Cobalt blue */
            --color-cyan-glow: rgba(2, 132, 199, 0.15);
            --color-magenta: #db2777; /* Pink/magenta */
            --color-magenta-glow: rgba(219, 39, 119, 0.15);
            --color-purple: #7c3aed;
            --color-purple-glow: rgba(124, 58, 237, 0.12);
            --color-success: #10b981;
            --gradient-primary: linear-gradient(135deg, var(--color-cyan) 0%, var(--color-purple) 100%);
            --gradient-accent: linear-gradient(135deg, var(--color-magenta) 0%, var(--color-purple) 100%);
            --gradient-panel: linear-gradient(180deg, rgba(255, 255, 255, 0.9) 0%, rgba(248, 250, 252, 0.95) 100%);
            --font-heading: 'Outfit', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
            --font-body: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
            --shadow-neon-cyan: 0 0 15px var(--color-cyan-glow);
            --shadow-neon-magenta: 0 0 15px var(--color-magenta-glow);
            --shadow-card: 0 8px 32px 0 rgba(15, 23, 42, 0.05);
            --blur-glass: blur(16px);
        }
        .moment-of-inertia-calculator-wrapper-v2 {
            background-color: var(--color-bg-dark);
            color: var(--color-text-main);
            font-family: var(--font-body);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            overflow-x: hidden;
            position: relative;
        }
        .app-background-glow {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: -1;
            overflow: hidden;
            pointer-events: none;
        }
        .app-background-glow::before, 
        .app-background-glow::after {
            content: '';
            position: absolute;
            width: 600px;
            height: 600px;
            border-radius: 50%;
            filter: blur(140px);
            opacity: 0.12;
        }
        .app-background-glow::before {
            background: var(--color-cyan);
            top: -10%;
            right: -5%;
        }
        .app-background-glow::after {
            background: var(--color-purple);
            bottom: -10%;
            left: -5%;
        }
        .app-container {
            width: 100%;
            max-width: 1440px;
            padding: 24px;
            display: flex;
            flex-direction: column;
            gap: 24px;
        }
        .app-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 20px 24px;
            background: var(--color-panel-bg);
            backdrop-filter: var(--blur-glass);
            border: 1px solid var(--color-border);
            border-radius: 16px;
            box-shadow: var(--shadow-card);
        }
        .logo-area {
            display: flex;
            align-items: center;
            gap: 16px;
        }
        .logo-icon {
            font-size: 32px;
            background: linear-gradient(135deg, var(--color-cyan), var(--color-magenta));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .logo-area h1 {
            font-family: var(--font-heading);
            font-weight: 800;
            font-size: 24px;
            letter-spacing: 1.5px;
            background: linear-gradient(90deg, var(--color-text-main), var(--color-text-muted));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        .logo-area .subtitle {
            font-size: 12px;
            color: var(--color-text-muted);
            font-weight: 500;
            letter-spacing: 0.5px;
        }
        .header-badge {
            display: flex;
            align-items: center;
            gap: 10px;
            background: rgba(16, 185, 129, 0.1);
            border: 1px solid rgba(16, 185, 129, 0.2);
            padding: 6px 14px;
            border-radius: 20px;
        }
        .pulse-dot {
            width: 8px;
            height: 8px;
            background-color: var(--color-success);
            border-radius: 50%;
            box-shadow: 0 0 10px var(--color-success);
            animation: pulse-dot-anim 1.5s infinite;
        }
        @keyframes pulse-dot-anim {
            0% { transform: scale(0.9); opacity: 0.6; }
            50% { transform: scale(1.2); opacity: 1; }
            100% { transform: scale(0.9); opacity: 0.6; }
        }
        .badge-text {
            font-size: 11px;
            font-weight: 600;
            color: var(--color-success);
            letter-spacing: 0.5px;
        }
        .app-main-grid {
            display: grid;
            grid-template-columns: 340px 1fr 340px;
            gap: 24px;
            align-items: start;
        }
        /* Container Query */
        @container inertia-container (max-width: 1100px) {
            .app-main-grid {
                grid-template-columns: 1fr 1fr;
                gap: 20px;
            }
            .control-panel {
                grid-column: 1;
            }
            .simulation-panel {
                grid-column: 2;
                align-self: start;
            }
            .results-panel {
                grid-column: 1 / span 2;
                display: grid;
                grid-template-columns: 1fr 1.2fr;
                gap: 20px;
            }
            .results-panel .panel-header {
                grid-column: 1 / span 2;
            }
            .ratio-readout-box {
                grid-column: 1;
                grid-row: 2;
            }
            .formula-card {
                grid-column: 1;
                grid-row: 3;
            }
            .results-grid {
                grid-column: 2;
                grid-row: 2 / span 2;
            }
        }
        @container inertia-container (max-width: 768px) {
            .app-main-grid {
                grid-template-columns: 1fr;
            }
            .control-panel, .simulation-panel, .results-panel {
                grid-column: 1;
            }
            .simulation-panel {
                order: -1;
            }
            .results-panel {
                display: flex;
                flex-direction: column;
                gap: 16px;
            }
            .ratio-readout-box, .results-grid, .formula-card {
                grid-column: auto;
                grid-row: auto;
            }
            .panel-header h2 {
                white-space: normal !important;
                font-size: 15px !important;
            }
            .app-header {
                flex-direction: column;
                gap: 16px;
                text-align: center;
            }
            .logo-area {
                flex-direction: column;
                gap: 8px;
            }
        }
        .panel {
            background: var(--gradient-panel);
            backdrop-filter: var(--blur-glass);
            border: 1px solid var(--color-border);
            border-radius: 20px;
            padding: 24px;
            box-shadow: var(--shadow-card);
            display: flex;
            flex-direction: column;
            gap: 20px;
        }
        .panel-header {
            display: flex;
            align-items: center;
            gap: 12px;
            border-bottom: 1px solid var(--color-border);
            padding-bottom: 14px;
        }
        .panel-header i {
            font-size: 18px;
        }
        .panel-header h2 {
            font-family: var(--font-heading);
            font-size: 18px;
            font-weight: 600;
            letter-spacing: 0.5px;
        }
        .text-cyan { color: var(--color-cyan); }
        .text-magenta { color: var(--color-magenta); }
        .text-purple { color: var(--color-purple); }
        .control-panel {
            grid-column: 1;
        }
        .tab-group {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 6px;
            background: rgba(0, 0, 0, 0.02);
            padding: 4px;
            border-radius: 10px;
            border: 1px solid var(--color-border);
        }
        .tab-btn {
            background: transparent !important;
            border: none !important;
            padding: 8px 6px !important;
            font-size: 11px !important;
            font-weight: 700 !important;
            color: var(--color-text-muted) !important;
            border-radius: 6px !important;
            cursor: pointer !important;
            transition: all 0.2s ease !important;
            display: flex !important;
            align-items: center !important;
            justify-content: center !important;
            gap: 4px !important;
            box-shadow: none !important;
        }
        .tab-btn.active {
            background: #ffffff !important;
            color: var(--color-cyan) !important;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05) !important;
        }
        .input-group {
            display: flex;
            flex-direction: column;
            gap: 8px;
        }
        .input-label-row {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .input-label-row label {
            font-size: 13px;
            font-weight: 600;
            color: var(--color-text-main);
            display: flex;
            align-items: center;
            gap: 8px;
        }
        .helper-text {
            font-size: 10px;
            color: var(--color-text-muted);
            font-weight: 500;
        }
                .number-input-wrapper {
            display: flex;
            position: relative;
            border-radius: 8px;
            overflow: hidden;
            border: 1px solid var(--color-border);
            background: #ffffff;
            transition: all 0.2s ease;
        }
        .number-input-wrapper:focus-within {
            border-color: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan-glow);
        }
                .custom-number-input {
            flex: 1;
            width: 0;
            min-width: 0;
            background: #f8fafc !important;
            border: none !important;
            outline: none !important;
            color: #0f172a !important;
            padding: 10px 14px !important;
            font-family: var(--font-body) !important;
            font-size: 15px !important;
            font-weight: 700 !important;
            text-align: right !important;
            box-shadow: none !important;
            -webkit-appearance: none !important;
            -moz-appearance: textfield !important;
        }
        .custom-number-input::-webkit-outer-spin-button,
        .custom-number-input::-webkit-inner-spin-button {
            -webkit-appearance: none;
            margin: 0;
        }
                .unit-badge {
            background: rgba(0, 0, 0, 0.03);
            color: var(--color-text-muted);
            font-size: 11px;
            font-weight: 700;
            padding: 0 14px;
            display: flex;
            align-items: center;
            justify-content: center;
            border-left: 1px solid var(--color-border);
            pointer-events: none;
            flex-shrink: 0;
        }
        .custom-slider {
            -webkit-appearance: none;
            width: 100%;
            height: 6px;
            border-radius: 3px;
            background: rgba(0, 0, 0, 0.05);
            outline: none;
            margin: 8px 0;
        }
        .custom-slider::-webkit-slider-thumb {
            -webkit-appearance: none;
            appearance: none;
            width: 18px;
            height: 18px;
            border-radius: 50%;
            cursor: pointer;
            transition: transform 0.1s ease;
            background: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan-glow);
        }
        .custom-slider::-webkit-slider-thumb:hover {
            transform: scale(1.2);
        }
        .simulation-panel {
            grid-column: 2;
            align-self: start;
            justify-content: flex-start;
        }
        .canvas-wrapper {
            position: relative;
            width: 100%;
            background: radial-gradient(circle at center, #ffffff 0%, #f1f5f9 100%);
            border: 1px solid rgba(0, 0, 0, 0.06);
            border-radius: 16px;
            overflow: hidden;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        #physics-canvas {
            display: block;
            width: 100%;
            height: auto;
            aspect-ratio: 16 / 10;
        }
        .canvas-overlay-data {
            position: absolute;
            top: 16px;
            left: 16px;
            pointer-events: none;
            display: flex;
            flex-direction: column;
            gap: 6px;
        }
        .overlay-item {
            background: rgba(255, 255, 255, 0.9);
            border: 1px solid var(--color-border);
            padding: 6px 12px;
            border-radius: 8px;
            display: flex;
            align-items: center;
            gap: 8px;
            font-size: 11px;
        }
        .overlay-item .label {
            color: var(--color-text-muted);
            font-weight: 500;
        }
        .overlay-item .value {
            font-weight: 700;
        }
        .simulation-metrics-strip {
            display: flex;
            background: rgba(0, 0, 0, 0.01);
            border: 1px solid var(--color-border);
            border-radius: 12px;
            padding: 12px 20px;
            justify-content: space-around;
            align-items: center;
            gap: 10px;
            margin-top: 10px;
        }
        .mini-metric {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 4px;
        }
        .mini-metric .label {
            font-size: 10px;
            font-weight: 600;
            color: var(--color-text-muted);
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }
        .mini-metric .value {
            font-size: 14px;
            font-weight: 700;
            color: var(--color-text-main);
            font-family: var(--font-heading);
        }
        .mini-divider {
            width: 1px;
            height: 24px;
            background: rgba(0, 0, 0, 0.03);
        }
        .results-panel {
            grid-column: 3;
        }
        .ratio-readout-box {
            background: linear-gradient(135deg, rgba(2, 132, 199, 0.08) 0%, rgba(124, 58, 237, 0.03) 100%);
            border: 1px solid rgba(2, 132, 199, 0.25);
            border-radius: 16px;
            padding: 20px;
            text-align: center;
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 6px;
        }
        .ratio-title {
            font-size: 11px;
            font-weight: 700;
            color: var(--color-cyan);
            letter-spacing: 1px;
            text-transform: uppercase;
        }
        .ratio-value {
            font-family: var(--font-heading);
            font-weight: 800;
            font-size: 26px;
            background: linear-gradient(90deg, var(--color-text-main), var(--color-cyan));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        .ratio-type {
            font-size: 11px;
            font-weight: 600;
            color: var(--color-text-muted);
        }
        .results-grid {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }
        .result-card {
            background: rgba(255, 255, 255, 0.85);
            border: 1px solid var(--color-border);
            border-radius: 12px;
            padding: 12px 16px;
            display: flex;
            align-items: center;
            gap: 16px;
            transition: all 0.2s ease;
        }
        .result-card:hover {
            transform: translateY(-2px);
            background: rgba(2, 132, 199, 0.02);
            border-color: rgba(2, 132, 199, 0.15);
        }
        .card-icon {
            width: 38px;
            height: 38px;
            background: rgba(0, 0, 0, 0.015);
            border: 1px solid var(--color-border);
            border-radius: 10px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 14px;
            color: var(--color-text-muted);
        }
        .result-card:hover .card-icon {
            color: var(--color-cyan);
            border-color: rgba(2, 132, 199, 0.2);
            background: rgba(2, 132, 199, 0.05);
        }
        .card-content {
            display: flex;
            flex-direction: column;
            gap: 2px;
        }
        .card-unit {
            font-size: 11px;
            font-weight: 600;
            color: var(--color-text-muted);
        }
        .card-value {
            font-family: var(--font-heading);
            font-weight: 700;
            font-size: 17px;
            color: var(--color-text-main);
        }
        .formula-card {
            background: rgba(0, 0, 0, 0.01);
            border: 1px solid var(--color-border);
            border-radius: 12px;
            padding: 16px;
            display: flex;
            flex-direction: column;
            gap: 8px;
            font-size: 12px;
        }
        .formula-card h4 {
            font-weight: 700;
            color: var(--color-text-main);
        }
        .formula-equation {
            font-family: monospace;
            color: var(--color-cyan);
            font-size: 13px;
            background: #f8fafc;
            padding: 6px 10px;
            border-radius: 6px;
            border: 1px solid var(--color-border);
            text-align: center;
        }
/* ━━ WordPress 레이아웃 Override: 디자인 1 (2열 컴팩트 대칭 레이아웃) ━━ */
.moment-of-inertia-calculator-wrapper-v2 .app-main-grid,
.moment-of-inertia-calculator-wrapper-v2 .main-grid,
.moment-of-inertia-calculator-wrapper-v2 .sim-grid {
    display: grid !important;
    grid-template-columns: 340px 1fr !important;
    gap: 24px !important;
    align-items: start !important;
}
/* 3열 레이아웃을 2열 레이아웃으로 변경하는 특화 스타일 */
.moment-of-inertia-calculator-wrapper-v2 .right-column {
    display: flex !important;
    flex-direction: column !important;
    gap: 24px !important;
    min-width: 0 !important;
    grid-column: 2 !important;
}
.moment-of-inertia-calculator-wrapper-v2 .simulation-panel,
.moment-of-inertia-calculator-wrapper-v2 .canvas-panel,
.moment-of-inertia-calculator-wrapper-v2 .sim-panel {
    grid-column: auto !important;
    order: 1 !important;
    align-self: stretch !important;
}
.moment-of-inertia-calculator-wrapper-v2 .control-panel {
    grid-column: 1 !important;
}
/* 2열 통합 결과 분석 영역 레이아웃 */
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section {
    display: grid !important;
    grid-template-columns: 1.1fr 1.3fr !important;
    gap: 20px !important;
    border-top: 1px solid var(--color-border) !important;
    padding-top: 20px !important;
    margin-top: 10px !important;
    align-items: stretch !important;
}
/* Readout Box 스타일 */
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .ratio-readout-box,
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .re-readout-box,
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .status-readout-box,
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .gauge-container {
    grid-column: 1 !important;
    grid-row: 1 !important;
    margin: 0 !important;
    height: auto !important;
    display: flex !important;
    flex-direction: column !important;
    justify-content: center !important;
}
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .results-grid {
    grid-column: 2 !important;
    grid-row: 1 / span 2 !important;
    display: flex !important;
    flex-direction: column !important;
    gap: 12px !important;
    justify-content: flex-start !important;
}
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .results-grid .result-card {
    flex: none !important;
    display: flex !important;
    align-items: center !important;
    min-height: 72px !important;
    height: auto !important;
    padding: 12px 16px !important;
}
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .formula-card {
    grid-column: 1 !important;
    grid-row: 2 !important;
}
/* 모바일/반응형 (800px 이하) ── 항상 세로형(1열) 정렬 및 시뮬레이터 캔버스 최상단 배치 */
@media (max-width: 800px) {
    .moment-of-inertia-calculator-wrapper-v2 .app-main-grid,
    .moment-of-inertia-calculator-wrapper-v2 .main-grid,
    .moment-of-inertia-calculator-wrapper-v2 .sim-grid {
        grid-template-columns: 1fr !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .moment-of-inertia-calculator-wrapper-v2 .control-panel {
        order: 2 !important;
        width: 100% !important;
    }
    .moment-of-inertia-calculator-wrapper-v2 .right-column {
        order: 1 !important;
        width: 100% !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .moment-of-inertia-calculator-wrapper-v2 .simulation-panel,
    .moment-of-inertia-calculator-wrapper-v2 .canvas-panel,
    .moment-of-inertia-calculator-wrapper-v2 .sim-panel,
    .moment-of-inertia-calculator-wrapper-v2 .canvas-section {
        order: -1 !important;
    }
    .moment-of-inertia-calculator-wrapper-v2 .simulation-results-section {
        grid-template-columns: 1fr !important;
    }
    .moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .ratio-readout-box,
    .moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .re-readout-box,
    .moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .status-readout-box,
    .moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .gauge-container {
        grid-column: 1 !important;
        grid-row: auto !important;
        height: auto !important;
    }
    .moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .results-grid {
        grid-column: 1 !important;
        grid-row: auto !important;
    }
    .moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .formula-card {
        grid-column: 1 !important;
        grid-row: auto !important;
    }
}
.moment-of-inertia-calculator-wrapper-v2 .app-container,
.moment-of-inertia-calculator-wrapper-v2 .main-container {
    max-width: 100% !important;
    padding: 12px !important;
}
/* Premium Advice/Formula Card & Typography Overrides */
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .formula-card,
.moment-of-inertia-calculator-wrapper-v2 .results-panel .formula-card {
    background: #ffffff !important;
    border: 1px solid var(--color-border) !important;
    border-radius: 12px !important;
    padding: 16px !important;
    box-shadow: var(--shadow-card) !important;
    transition: all 0.2s ease !important;
    display: flex !important;
    flex-direction: column !important;
    gap: 8px !important;
}
.moment-of-inertia-calculator-wrapper-v2 .simulation-results-section .formula-card h4,
.moment-of-inertia-calculator-wrapper-v2 .results-panel .formula-card h4 {
    font-weight: 700 !important;
    color: var(--color-text-main) !important;
}
.moment-of-inertia-calculator-wrapper-v2 #text-judgment {
    font-size: 12px !important;
    font-weight: 500 !important;
    color: var(--color-text-muted) !important;
    line-height: 1.6 !important;
    word-break: keep-all !important;
}
</style>
<div class="moment-of-inertia-calculator-wrapper-v2" style="position: relative; width: 100%; box-sizing: border-box; overflow: hidden; margin: 30px auto; border-radius: 20px;">
    <div class="app-background-glow" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; pointer-events: none; overflow: hidden;"></div>
    <div style="position: relative; z-index: 2; width: 100%;">
    <div class="app-container">
        <!-- Header -->
        <header class="app-header">
            <div class="logo-area">
                <div class="logo-icon"><i class="fa-solid fa-shapes"></i></div>
                <div>
                    <h1>MOMENT OF INERTIA</h1>
                    <div class="subtitle">단면 2차 모멘트 계산기 &#038; 2D 기하 시뮬레이터</div>
                </div>
            </div>
            <div class="header-badge">
                <div class="pulse-dot"></div>
                <div class="badge-text">GEOMETRIC ENGINE ACTIVE</div>
            </div>
        </header>
        <!-- Main Layout Grid -->
        <main class="app-main-grid">
            <!-- Left Panel: Controls -->
            <section class="panel control-panel">
                <div class="panel-header">
                    <i class="fa-solid fa-sliders text-cyan"></i>
                    <h2>시뮬레이션 제어 변수</h2>
                </div>
                <!-- Unit Selector Group -->
                <div class="input-group" style="margin-bottom: 8px;">
                    <div class="input-label-row">
                        <label><i class="fa-solid fa-ruler text-cyan"></i> 해석/입력 단위 (Unit)</label>
                    </div>
                    <div class="number-input-wrapper">
                        <select id="select-unit" style="width: 100%; border: none; outline: none; padding: 10px 14px; font-family: var(--font-body); font-size: 13px; font-weight: 700; background: #f8fafc; color: #0f172a; cursor: pointer;">
                            <option value="mm" selected>Milimeter (mm)</option>
                            <option value="cm">Centimeter (cm)</option>
                            <option value="m">Meter (m)</option>
                            <option value="in">Inch (in)</option>
                        </select>
                    </div>
                </div>
                <!-- Shape Selector Tabs -->
                <div class="tab-group" style="grid-template-columns: 1fr 1fr 1fr 1fr;">
                    <button id="tab-rect" class="tab-btn active">사각형</button>
                    <button id="tab-hollow" class="tab-btn">중공형</button>
                    <button id="tab-ibeam" class="tab-btn">I형강</button>
                    <button id="tab-circle" class="tab-btn">원형</button>
                </div>
                <!-- Dimension Input Groups (Dynamically displayed) -->
                <!-- Width b -->
                <div class="input-group" id="group-b">
                    <div class="input-label-row">
                        <label><i class="fa-solid fa-arrows-left-right text-cyan"></i> 단면 폭 (b)</label>
                        <span class="helper-text">가로 폭 (10 ~ 250 mm)</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-b" class="custom-number-input" min="10" max="250" value="120">
                        <div class="unit-badge">mm</div>
                    </div>
                    <input type="range" id="slider-b" class="custom-slider" min="10" max="250" value="120">
                </div>
                <!-- Height h -->
                <div class="input-group" id="group-h">
                    <div class="input-label-row">
                        <label><i class="fa-solid fa-arrows-up-down text-magenta"></i> 단면 높이 (h)</label>
                        <span class="helper-text">세로 높이 (10 ~ 250 mm)</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-h" class="custom-number-input" min="10" max="250" value="160">
                        <div class="unit-badge">mm</div>
                    </div>
                    <input type="range" id="slider-h" class="custom-slider" min="10" max="250" value="160">
                </div>
                <!-- Thickness t (Hollow Box) -->
                <div class="input-group" id="group-t" style="display:none;">
                    <div class="input-label-row">
                        <label><i class="fa-solid fa-border-all text-purple"></i> 벽면 두께 (t)</label>
                        <span class="helper-text">외벽 (2 ~ 35 mm)</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-t" class="custom-number-input" min="2" max="35" value="12">
                        <div class="unit-badge">mm</div>
                    </div>
                    <input type="range" id="slider-t" class="custom-slider" min="2" max="35" value="12">
                </div>
                <!-- Flange Thickness tf (I-Beam) -->
                <div class="input-group" id="group-tf" style="display:none;">
                    <div class="input-label-row">
                        <label><i class="fa-solid fa-grip-lines text-purple"></i> 플랜지 두께 (tf)</label>
                        <span class="helper-text">상하 두께 (2 ~ 30 mm)</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-tf" class="custom-number-input" min="2" max="30" value="15">
                        <div class="unit-badge">mm</div>
                    </div>
                    <input type="range" id="slider-tf" class="custom-slider" min="2" max="30" value="15">
                </div>
                <!-- Web Thickness tw (I-Beam) -->
                <div class="input-group" id="group-tw" style="display:none;">
                    <div class="input-label-row">
                        <label><i class="fa-solid fa-grip-lines-vertical text-success"></i> 웨브 두께 (tw)</label>
                        <span class="helper-text">수직 두께 (2 ~ 30 mm)</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-tw" class="custom-number-input" min="2" max="30" value="10">
                        <div class="unit-badge">mm</div>
                    </div>
                    <input type="range" id="slider-tw" class="custom-slider" min="2" max="30" value="10">
                </div>
                <!-- Outer Diameter D (Circle) -->
                <div class="input-group" id="group-D" style="display:none;">
                    <div class="input-label-row">
                        <label><i class="fa-solid fa-circle text-cyan"></i> 외경 지름 (D)</label>
                        <span class="helper-text">외곽 원 지름 (20 ~ 250 mm)</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-D-val" class="custom-number-input" min="20" max="250" value="180">
                        <div class="unit-badge">mm</div>
                    </div>
                    <input type="range" id="slider-D-val" class="custom-slider" min="20" max="250" value="180">
                </div>
                <!-- Inner Diameter d (Circle) -->
                <div class="input-group" id="group-d-val" style="display:none;">
                    <div class="input-label-row">
                        <label><i class="fa-solid fa-circle-notch text-magenta"></i> 내경 지름 (d)</label>
                        <span class="helper-text">내부 홀 지름 (0 ~ 220 mm)</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-d-val" class="custom-number-input" min="0" max="220" value="100">
                        <div class="unit-badge">mm</div>
                    </div>
                    <input type="range" id="slider-d-val" class="custom-slider" min="0" max="220" value="100">
                </div>
            </section>
            <!-- Auto Injected Right Column wrapper for Design 1 -->
            <div class="right-column">
                <section class="panel simulation-panel">
                                <div class="panel-header">
                                    <div style="display: flex; align-items: center; gap: 12px;">
                                        <i class="fa-solid fa-drafting-compass text-cyan"></i>
                                        <h2>실시간 단면 도면 &#038; 도심 축 맵</h2>
                                    </div>
                                    <div id="txt-centroid" class="canvas-scale-indicator">도심 좌표: X=0, Y=0</div>
                                </div>
                                <div class="canvas-wrapper">
                                    <canvas id="physics-canvas"></canvas>
                                    <!-- Overlay Floating Data -->
                                    <div class="canvas-overlay-data">
                                        <div class="overlay-item">
                                            <span class="label">도형 면적 (A):</span>
                                            <span class="value text-cyan" id="txt-area-overlay">0.0 mm²</span>
                                        </div>
                                    </div>
                                </div>
                                <!-- Mini Metrics -->
                                <div class="simulation-metrics-strip">
                                    <div class="mini-metric">
                                        <div class="label">단면회전반경 (rx)</div>
                                        <div id="txt-rx" class="value">0.0 mm</div>
                                    </div>
                                    <div class="mini-divider"></div>
                                    <div class="mini-metric">
                                        <div class="label">단면회전반경 (ry)</div>
                                        <div id="txt-ry" class="value">0.0 mm</div>
                                    </div>
                                </div>
                            <div class="simulation-results-section">
                                <div class="ratio-readout-box">
                                    <div class="ratio-title">강성축 단면2차모멘트 (Ix)</div>
                                    <div id="txt-ix" class="ratio-value">0.0 cm⁴</div>
                                    <div id="txt-ix-mm" class="ratio-type">0.0 mm⁴</div>
                                </div>
                                <div class="results-grid">
                                    <div class="result-card">
                                        <div class="card-icon"><i class="fa-solid fa-ruler-combined text-cyan"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">약축 단면2차모멘트 (Iy)</span>
                                            <span id="txt-iy" class="card-value">0.0 cm⁴</span>
                                        </div>
                                    </div>
                                    <div class="result-card">
                                        <div class="card-icon"><i class="fa-solid fa-border-top-left text-magenta"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">전체 단면적 (A)</span>
                                            <span id="txt-area" class="card-value">0.0 mm²</span>
                                        </div>
                                    </div>
                                    <div class="result-card">
                                        <div class="card-icon"><i class="fa-solid fa-gauge-simple-high text-purple"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">단면 계수 (Zx = Ix / (h/2))</span>
                                            <span id="txt-zx" class="card-value">0.0 cm³</span>
                                        </div>
                                    </div>
                                    <div class="result-card">
                                        <div class="card-icon"><i class="fa-solid fa-percentage text-success"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">단면 효율비 (Ix / Area)</span>
                                            <span id="txt-ratio" class="card-value">0.00 mm²</span>
                                        </div>
                                    </div>
                                </div>
                                <div class="formula-card">
                                    <h4>단면 관성모멘트 공식</h4>
                                    <div class="formula-equation" id="formula-txt">Ix = bh³ / 12 <br> Iy = hb³ / 12</div>
                                </div>
                            </div>
                </section>
            </div>
        </main>
        <!-- Disclaimer Footer -->
        <footer class="app-disclaimer" style="margin-top: 20px; padding: 12px 16px; background: rgba(0, 0, 0, 0.015); border: 1px solid var(--color-border); border-radius: 12px; font-size: 11px; color: var(--color-text-muted); line-height: 1.5; text-align: left; display: flex; gap: 10px; align-items: flex-start; clear: both;">
            <i class="fa-solid fa-circle-info" style="color: var(--color-cyan); font-size: 14px; margin-top: 2px; flex-shrink: 0;"></i>
            <span><strong>면책 조항 (Disclaimer):</strong> 본 시뮬레이터의 계산 결과는 교육 및 참고용으로만 제공되며, 실제 제품 설계나 제작 시에는 반드시 최신 공학 규격 및 공식 표준 설계 기준을 재확인하시기 바랍니다. 계산 값의 무결성을 보장하지 않으며, 이로 인해 발생하는 직접적/간접적 손해에 대해 제작자 및 본 블로그는 어떠한 책임을 지지 않습니다.</span>
        </footer>
</div>
    <!-- Physics & Animation Engine -->
    </div>
</div>
<script>
        (function() {
        let isInit = false;
        function initSimulator() {
            if (isInit) return;
            const canvas = document.getElementById('physics-canvas');
            if (!canvas) return;
            const ctx = canvas.getContext('2d');
            if (!ctx) return;
            isInit = true;
            window.__moment_initialized = true;
            // DOM Elements
            const tabRect = document.getElementById('tab-rect');
            const tabHollow = document.getElementById('tab-hollow');
            const tabIbeam = document.getElementById('tab-ibeam');
            const tabCircle = document.getElementById('tab-circle');
            const groupB = document.getElementById('group-b');
            const groupH = document.getElementById('group-h');
            const groupT = document.getElementById('group-t');
            const groupTf = document.getElementById('group-tf');
            const groupTw = document.getElementById('group-tw');
            const groupD = document.getElementById('group-D');
            const groupDval = document.getElementById('group-d-val');
            const sliderB = document.getElementById('slider-b');
            const inputB = document.getElementById('input-b');
            const sliderH = document.getElementById('slider-h');
            const inputH = document.getElementById('input-h');
            const sliderT = document.getElementById('slider-t');
            const inputT = document.getElementById('input-t');
            const sliderTf = document.getElementById('slider-tf');
            const inputTf = document.getElementById('input-tf');
            const sliderTw = document.getElementById('slider-tw');
            const inputTw = document.getElementById('input-tw');
            const sliderD = document.getElementById('slider-D-val');
            const inputD = document.getElementById('input-D-val');
            const sliderDval = document.getElementById('slider-d-val');
            const inputDval = document.getElementById('input-d-val');
            const txtCentroid = document.getElementById('txt-centroid');
            const txtAreaOverlay = document.getElementById('txt-area-overlay');
            const txtRx = document.getElementById('txt-rx');
            const txtRy = document.getElementById('txt-ry');
            const txtIx = document.getElementById('txt-ix');
            const txtIxMm = document.getElementById('txt-ix-mm');
            const txtIy = document.getElementById('txt-iy');
            const txtArea = document.getElementById('txt-area');
            const txtZx = document.getElementById('txt-zx');
            const txtRatio = document.getElementById('txt-ratio');
            const formulaTxt = document.getElementById('formula-txt');
            // State variables
            const state = {
                type: 'rect', // rect, hollow, ibeam, circle
                unit: 'mm',
                b: 120,
                h: 160,
                t: 12,
                tf: 15,
                tw: 10,
                D: 180,
                d: 100,
                time: 0
            };
            const unitScales = {
                mm: { factor: 1.0, label: 'mm', label2: 'mm²', label3: 'mm³', label4: 'mm⁴', decimals: 0, step: 1, range: { b: [10, 250], h: [10, 250], t: [2, 35], tf: [2, 30], tw: [2, 30], D: [20, 250], d: [0, 220] } },
                cm: { factor: 10.0, label: 'cm', label2: 'cm²', label3: 'cm³', label4: 'cm⁴', decimals: 1, step: 0.1, range: { b: [1.0, 25.0], h: [1.0, 25.0], t: [0.2, 3.5], tf: [0.2, 3.0], tw: [0.2, 3.0], D: [2.0, 25.0], d: [0.0, 22.0] } },
                m: { factor: 1000.0, label: 'm', label2: 'm²', label3: 'm³', label4: 'm⁴', decimals: 3, step: 0.001, range: { b: [0.01, 0.25], h: [0.01, 0.25], t: [0.002, 0.035], tf: [0.002, 0.030], tw: [0.002, 0.030], D: [0.02, 0.25], d: [0.0, 0.22] } },
                in: { factor: 25.4, label: 'in', label2: 'in²', label3: 'in³', label4: 'in⁴', decimals: 2, step: 0.05, range: { b: [0.4, 10.0], h: [0.4, 10.0], t: [0.08, 1.4], tf: [0.08, 1.2], tw: [0.08, 1.2], D: [0.8, 10.0], d: [0.0, 8.8] } }
            };
            const selectUnit = document.getElementById('select-unit');
            // Canvas Resizing
            function resizeCanvas() {
                const rect = canvas.getBoundingClientRect();
                const dpr = window.devicePixelRatio || 1;
                canvas.width = rect.width * dpr;
                canvas.height = rect.height * dpr;
                ctx.scale(dpr, dpr);
            }
            resizeCanvas();
            window.addEventListener('resize', resizeCanvas);
            setTimeout(resizeCanvas, 300);
            // Unit change handler
            function onUnitChange(newUnit, prevUnit) {
                const prevScale = unitScales[prevUnit];
                const newScale = unitScales[newUnit];
                const ratio = prevScale.factor / newScale.factor;
                // 1. Convert state values
                const keys = ['b', 'h', 't', 'tf', 'tw', 'D', 'd'];
                keys.forEach(k => {
                    state[k] = state[k] * ratio;
                });
                // 2. Refresh input min/max/step/value properties
                const updateInputProps = (slider, input, key) => {
                    const range = newScale.range[key];
                    slider.min = range[0];
                    slider.max = range[1];
                    slider.step = newScale.step;
                    input.min = range[0];
                    input.max = range[1];
                    input.step = newScale.step;
                    slider.value = state[key];
                    input.value = state[key].toFixed(newScale.decimals);
                };
                updateInputProps(sliderB, inputB, 'b');
                updateInputProps(sliderH, inputH, 'h');
                updateInputProps(sliderT, inputT, 't');
                updateInputProps(sliderTf, inputTf, 'tf');
                updateInputProps(sliderTw, inputTw, 'tw');
                updateInputProps(sliderD, inputD, 'D');
                updateInputProps(sliderDval, inputDval, 'd');
                // 3. Update input unit badges
                document.querySelectorAll('.unit-badge').forEach(badge => {
                    badge.innerText = newScale.label;
                });
                // 4. Update slider helper text descriptions
                const helperB = groupB.querySelector('.helper-text');
                if (helperB) helperB.innerText = `가로 폭 (${newScale.range.b[0]} ~ ${newScale.range.b[1]} ${newScale.label})`;
                const helperH = groupH.querySelector('.helper-text');
                if (helperH) helperH.innerText = `세로 높이 (${newScale.range.h[0]} ~ ${newScale.range.h[1]} ${newScale.label})`;
                const helperT = groupT.querySelector('.helper-text');
                if (helperT) helperT.innerText = `외벽 (${newScale.range.t[0]} ~ ${newScale.range.t[1]} ${newScale.label})`;
                const helperTf = groupTf.querySelector('.helper-text');
                if (helperTf) helperTf.innerText = `상하 두께 (${newScale.range.tf[0]} ~ ${newScale.range.tf[1]} ${newScale.label})`;
                const helperTw = groupTw.querySelector('.helper-text');
                if (helperTw) helperTw.innerText = `수직 두께 (${newScale.range.tw[0]} ~ ${newScale.range.tw[1]} ${newScale.label})`;
                const helperD = groupD.querySelector('.helper-text');
                if (helperD) helperD.innerText = `외곽 원 지름 (${newScale.range.D[0]} ~ ${newScale.range.D[1]} ${newScale.label})`;
                const helperd = groupDval.querySelector('.helper-text');
                if (helperd) helperd.innerText = `내부 홀 지름 (${newScale.range.d[0]} ~ ${newScale.range.d[1]} ${newScale.label})`;
                state.unit = newUnit;
                updateCalculations();
            }
            selectUnit.addEventListener('change', function() {
                const prevUnit = state.unit;
                const newUnit = selectUnit.value;
                if (prevUnit !== newUnit) {
                    onUnitChange(newUnit, prevUnit);
                }
            });
            // Sync methods
            function makeSync(slider, input, key, callback) {
                slider.addEventListener('input', function() {
                    let val = parseFloat(slider.value);
                    const scale = unitScales[state.unit];
                    input.value = val.toFixed(scale.decimals);
                    state[key] = val;
                    if (callback) callback();
                    updateCalculations();
                });
                input.addEventListener('change', function() {
                    let val = parseFloat(input.value);
                    const min = parseFloat(input.min);
                    const max = parseFloat(input.max);
                    if (isNaN(val)) { val = min; }
                    if (val < min) { val = min; }
                    if (val > max) { val = max; }
                    const scale = unitScales[state.unit];
                    slider.value = val;
                    input.value = val.toFixed(scale.decimals);
                    state[key] = val;
                    if (callback) callback();
                    updateCalculations();
                });
            }
            // Sync all inputs
            makeSync(sliderB, inputB, 'b');
            makeSync(sliderH, inputH, 'h');
            makeSync(sliderT, inputT, 't', validateHollow);
            makeSync(sliderTf, inputTf, 'tf', validateIBeam);
            makeSync(sliderTw, inputTw, 'tw', validateIBeam);
            makeSync(sliderD, inputD, 'D', validateCircle);
            makeSync(sliderDval, inputDval, 'd', validateCircle);
            function validateHollow() {
                // Ensure 2t < b and 2t < h to avoid overlap
                const maxT = Math.min(state.b, state.h) / 2 - 2;
                if (state.t > maxT) {
                    state.t = Math.floor(maxT);
                    sliderT.value = state.t;
                    inputT.value = state.t;
                }
            }
            function validateIBeam() {
                // Ensure 2tf < h
                const maxTf = state.h / 2 - 5;
                if (state.tf > maxTf) {
                    state.tf = Math.floor(maxTf);
                    sliderTf.value = state.tf;
                    inputTf.value = state.tf;
                }
                // Ensure tw < b
                const maxTw = state.b - 10;
                if (state.tw > maxTw) {
                    state.tw = Math.floor(maxTw);
                    sliderTw.value = state.tw;
                    inputTw.value = state.tw;
                }
            }
            function validateCircle() {
                // Ensure d < D
                const maxD = state.D - 10;
                sliderDval.max = maxD;
                inputDval.max = maxD;
                if (state.d > maxD) {
                    state.d = maxD;
                    sliderDval.value = state.d;
                    inputDval.value = state.d;
                }
            }
            // Tab Handlers
            function hideAllControls() {
                groupB.style.display = 'none';
                groupH.style.display = 'none';
                groupT.style.display = 'none';
                groupTf.style.display = 'none';
                groupTw.style.display = 'none';
                groupD.style.display = 'none';
                groupDval.style.display = 'none';
            }
            tabRect.addEventListener('click', function() {
                hideAllControls();
                tabRect.classList.add('active');
                tabHollow.classList.remove('active');
                tabIbeam.classList.remove('active');
                tabCircle.classList.remove('active');
                groupB.style.display = 'flex';
                groupH.style.display = 'flex';
                state.type = 'rect';
                updateCalculations();
            });
            tabHollow.addEventListener('click', function() {
                hideAllControls();
                tabHollow.classList.add('active');
                tabRect.classList.remove('active');
                tabIbeam.classList.remove('active');
                tabCircle.classList.remove('active');
                groupB.style.display = 'flex';
                groupH.style.display = 'flex';
                groupT.style.display = 'flex';
                state.type = 'hollow';
                validateHollow();
                updateCalculations();
            });
            tabIbeam.addEventListener('click', function() {
                hideAllControls();
                tabIbeam.classList.add('active');
                tabRect.classList.remove('active');
                tabHollow.classList.remove('active');
                tabCircle.classList.remove('active');
                groupB.style.display = 'flex';
                groupH.style.display = 'flex';
                groupTf.style.display = 'flex';
                groupTw.style.display = 'flex';
                state.type = 'ibeam';
                validateIBeam();
                updateCalculations();
            });
            tabCircle.addEventListener('click', function() {
                hideAllControls();
                tabCircle.classList.add('active');
                tabRect.classList.remove('active');
                tabHollow.classList.remove('active');
                tabIbeam.classList.remove('active');
                groupD.style.display = 'flex';
                groupDval.style.display = 'flex';
                state.type = 'circle';
                validateCircle();
                updateCalculations();
            });
            // Calculations
            function updateCalculations() {
                const scale = unitScales[state.unit];
                const factor = scale.factor; // 1 selected unit = factor mm
                // Convert inputs to base mm for physical equations
                const b_mm = state.b * factor;
                const h_mm = state.h * factor;
                const t_mm = state.t * factor;
                const tf_mm = state.tf * factor;
                const tw_mm = state.tw * factor;
                const D_mm = state.D * factor;
                const d_mm = state.d * factor;
                let A_mm = 0.0;
                let Ix_mm = 0.0;
                let Iy_mm = 0.0;
                let cY_mm = 0.0;
                let cX_mm = 0.0;
                if (state.type === 'rect') {
                    A_mm = b_mm * h_mm;
                    Ix_mm = (b_mm * Math.pow(h_mm, 3)) / 12;
                    Iy_mm = (h_mm * Math.pow(b_mm, 3)) / 12;
                    cY_mm = h_mm / 2;
                    cX_mm = b_mm / 2;
                    formulaTxt.innerHTML = 'Ix = bh³ / 12 <br> Iy = hb³ / 12';
                } else if (state.type === 'hollow') {
                    const bi = b_mm - 2 * t_mm;
                    const hi = h_mm - 2 * t_mm;
                    A_mm = b_mm * h_mm - bi * hi;
                    Ix_mm = (b_mm * Math.pow(h_mm, 3) - bi * Math.pow(hi, 3)) / 12;
                    Iy_mm = (h_mm * Math.pow(b_mm, 3) - hi * Math.pow(bi, 3)) / 12;
                    cY_mm = h_mm / 2;
                    cX_mm = b_mm / 2;
                    formulaTxt.innerText = 'Ix = (bh³ - b_i h_i³) / 12 (감산 모델)';
                } else if (state.type === 'ibeam') {
                    A_mm = 2 * b_mm * tf_mm + (h_mm - 2 * tf_mm) * tw_mm;
                    Ix_mm = (b_mm * Math.pow(h_mm, 3)) / 12 - ((b_mm - tw_mm) * Math.pow(h_mm - 2 * tf_mm, 3)) / 12;
                    Iy_mm = (2 * tf_mm * Math.pow(b_mm, 3)) / 12 + ((h_mm - 2 * tf_mm) * Math.pow(tw_mm, 3)) / 12;
                    cY_mm = h_mm / 2;
                    cX_mm = b_mm / 2;
                    formulaTxt.innerText = 'Ix = [bh³ - (b-tw)(h-2tf)³] / 12';
                } else if (state.type === 'circle') {
                    A_mm = Math.PI * (Math.pow(D_mm, 2) - Math.pow(d_mm, 2)) / 4;
                    Ix_mm = Math.PI * (Math.pow(D_mm, 4) - Math.pow(d_mm, 4)) / 64;
                    Iy_mm = Ix_mm;
                    cY_mm = D_mm / 2;
                    cX_mm = D_mm / 2;
                    formulaTxt.innerText = 'Ix = Iy = π(D⁴ - d⁴) / 64';
                }
                // Centroid coordinates
                const cX_out = cX_mm / factor;
                const cY_out = cY_mm / factor;
                // Area in selected unit^2
                const A_out = A_mm / Math.pow(factor, 2);
                // Section properties
                let rx_out = 0.0;
                let ry_out = 0.0;
                if (A_mm > 0) {
                    rx_out = Math.sqrt(Ix_mm / A_mm) / factor;
                    ry_out = Math.sqrt(Iy_mm / A_mm) / factor;
                }
                const maxH_mm = state.type === 'circle' ? D_mm : h_mm;
                const Zx_mm = Ix_mm / (maxH_mm / 2);
                const Zx_out = Zx_mm / Math.pow(factor, 3);
                const ratio_out = (Ix_mm / A_mm) / Math.pow(factor, 2);
                // Display texts
                txtCentroid.innerText = `도심 중립점: X_bar = ${cX_out.toFixed(1)} ${scale.label}, Y_bar = ${cY_out.toFixed(1)} ${scale.label}`;
                txtAreaOverlay.innerText = A_out.toLocaleString(undefined, {maximumFractionDigits: scale.decimals + 1}) + ` ${scale.label2}`;
                txtArea.innerText = A_out.toLocaleString(undefined, {maximumFractionDigits: scale.decimals + 1}) + ` ${scale.label2}`;
                txtRx.innerText = rx_out.toFixed(2) + ` ${scale.label}`;
                txtRy.innerText = ry_out.toFixed(2) + ` ${scale.label}`;
                txtZx.innerText = Zx_out.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 3}) + ` ${scale.label3}`;
                txtRatio.innerText = ratio_out.toFixed(1) + ` ${scale.label2}`;
                // Update Zx formula card label dynamically
                const zxCard = txtZx.closest('.result-card');
                if (zxCard) {
                    const zxUnit = zxCard.querySelector('.card-unit');
                    if (zxUnit) {
                        zxUnit.innerText = state.type === 'circle' ? '단면 계수 (Zx = Ix / (D/2))' : '단면 계수 (Zx = Ix / (h/2))';
                    }
                }
                if (state.unit === 'mm') {
                    // Maintain standard cm4 and mm4 split representation for mm inputs
                    const Ix_cm4 = Ix_mm / 10000;
                    const Iy_cm4 = Iy_mm / 10000;
                    const ratioReadoutBox = txtIx.closest('.ratio-readout-box');
                    if (ratioReadoutBox) {
                        const ratioTitle = ratioReadoutBox.querySelector('.ratio-title');
                        if (ratioTitle) ratioTitle.innerText = '강성축 단면2차모멘트 (Ix)';
                    }
                    txtIx.innerText = Ix_cm4.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' cm⁴';
                    txtIxMm.innerText = Ix_mm.toLocaleString(undefined, {maximumFractionDigits: 0}) + ' mm⁴';
                    txtIxMm.style.display = 'block';
                    const iyCard = txtIy.closest('.result-card');
                    if (iyCard) {
                        const iyUnit = iyCard.querySelector('.card-unit');
                        if (iyUnit) iyUnit.innerText = '약축 단면2차모멘트 (Iy)';
                    }
                    txtIy.innerText = Iy_cm4.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' cm⁴';
                } else {
                    // For other scales, show outputs in selected unit^4 and hide secondary labels
                    const Ix_out = Ix_mm / Math.pow(factor, 4);
                    const Iy_out = Iy_mm / Math.pow(factor, 4);
                    const ratioReadoutBox = txtIx.closest('.ratio-readout-box');
                    if (ratioReadoutBox) {
                        const ratioTitle = ratioReadoutBox.querySelector('.ratio-title');
                        if (ratioTitle) ratioTitle.innerText = `강성축 단면2차모멘트 (Ix, ${scale.label4})`;
                    }
                    txtIx.innerText = Ix_out.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 4}) + ` ${scale.label4}`;
                    txtIxMm.style.display = 'none';
                    const iyCard = txtIy.closest('.result-card');
                    if (iyCard) {
                        const iyUnit = iyCard.querySelector('.card-unit');
                        if (iyUnit) iyUnit.innerText = `약축 단면2차모멘트 (Iy, ${scale.label4})`;
                    }
                    txtIy.innerText = Iy_out.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 4}) + ` ${scale.label4}`;
                }
            }
            // Animation Loop
            function animate() {
                requestAnimationFrame(animate);
                state.time += 0.05;
                const width = canvas.width / (window.devicePixelRatio || 1);
                const height = canvas.height / (window.devicePixelRatio || 1);
                ctx.clearRect(0, 0, width, height);
                // 1. Draw snow white blueprint grid
                ctx.save();
                ctx.strokeStyle = 'rgba(2, 132, 199, 0.05)';
                ctx.lineWidth = 1;
                for (let x = 0; x < width; x += 30) {
                    ctx.beginPath();
                    ctx.moveTo(x, 0);
                    ctx.lineTo(x, height);
                    ctx.stroke();
                }
                for (let y = 0; y < height; y += 30) {
                    ctx.beginPath();
                    ctx.moveTo(0, y);
                    ctx.lineTo(width, y);
                    ctx.stroke();
                }
                ctx.restore();
                // 2. Cross section sketch scaling
                // Scale shape so it fills ~65% of canvas area
                const canvasCX = width / 2;
                const canvasCY = height / 2;
                const b = state.b;
                const h = state.h;
                // Dynamic auto-zoom: fit shape to canvas size
                const maxDrawDim = Math.min(width, height) * 0.65;
                let scale = 1.0;
                if (state.type === 'circle') {
                    scale = maxDrawDim / state.D;
                } else {
                    scale = Math.min(maxDrawDim / b, maxDrawDim / h);
                }
                ctx.save();
                ctx.translate(canvasCX, canvasCY);
                // Shading styles
                ctx.fillStyle = 'rgba(2, 132, 199, 0.15)'; // primary transparent cyan
                ctx.strokeStyle = '#0284c7';
                ctx.lineWidth = 2.5;
                if (state.type === 'rect') {
                    const dw = b * scale;
                    const dh = h * scale;
                    ctx.beginPath();
                    ctx.rect(-dw/2, -dh/2, dw, dh);
                    ctx.fill();
                    ctx.stroke();
                } else {
                    if (state.type === 'hollow') {
                        const dw = b * scale;
                        const dh = h * scale;
                        const dwInner = (b - 2*state.t) * scale;
                        const dhInner = (h - 2*state.t) * scale;
                        // Draw outer rectangular path clockwise
                        ctx.beginPath();
                        ctx.rect(-dw/2, -dh/2, dw, dh);
                        // Draw inner rectangular path counter-clockwise to subtract
                        ctx.rect(dwInner/2, -dhInner/2, -dwInner, dhInner);
                        ctx.fill();
                        // Outer border stroke
                        ctx.beginPath();
                        ctx.rect(-dw/2, -dh/2, dw, dh);
                        ctx.stroke();
                        // Inner border stroke
                        ctx.strokeStyle = '#db2777';
                        ctx.lineWidth = 1.5;
                        ctx.beginPath();
                        ctx.rect(-dwInner/2, -dhInner/2, dwInner, dhInner);
                        ctx.stroke();
                    } else {
                        if (state.type === 'ibeam') {
                            const dw = b * scale;
                            const dh = h * scale;
                            const dtf = state.tf * scale;
                            const dtw = state.tw * scale;
                            ctx.beginPath();
                            // Trace H shape clockwise
                            ctx.moveTo(-dw/2, -dh/2); // Top flange left
                            ctx.lineTo(dw/2, -dh/2);  // Top flange right
                            ctx.lineTo(dw/2, -dh/2 + dtf);
                            ctx.lineTo(dtw/2, -dh/2 + dtf);
                            ctx.lineTo(dtw/2, dh/2 - dtf);
                            ctx.lineTo(dw/2, dh/2 - dtf);
                            ctx.lineTo(dw/2, dh/2);
                            ctx.lineTo(-dw/2, dh/2);
                            ctx.lineTo(-dw/2, dh/2 - dtf);
                            ctx.lineTo(-dtw/2, dh/2 - dtf);
                            ctx.lineTo(-dtw/2, -dh/2 + dtf);
                            ctx.lineTo(-dw/2, -dh/2 + dtf);
                            ctx.closePath();
                            ctx.fill();
                            ctx.stroke();
                        } else {
                            if (state.type === 'circle') {
                                const dOut = state.D * scale / 2;
                                const dIn = state.d * scale / 2;
                                ctx.beginPath();
                                ctx.arc(0, 0, dOut, 0, Math.PI*2, false);
                                if (dIn > 0) {
                                    ctx.arc(0, 0, dIn, 0, Math.PI*2, true); // inner cut
                                }
                                ctx.fill();
                                ctx.beginPath();
                                ctx.arc(0, 0, dOut, 0, Math.PI*2);
                                ctx.stroke();
                                if (dIn > 0) {
                                    ctx.strokeStyle = '#db2777';
                                    ctx.lineWidth = 1.5;
                                    ctx.beginPath();
                                    ctx.arc(0, 0, dIn, 0, Math.PI*2);
                                    ctx.stroke();
                                }
                            }
                        }
                    }
                }
                // 3. Draw Centroid axes
                ctx.save();
                ctx.setLineDash([4, 4]);
                // X-X Axis (horizontal)
                ctx.strokeStyle = '#0284c7';
                ctx.lineWidth = 1.2;
                ctx.beginPath();
                ctx.moveTo(-150, 0);
                ctx.lineTo(150, 0);
                ctx.stroke();
                // Y-Y Axis (vertical)
                ctx.strokeStyle = '#7c3aed';
                ctx.lineWidth = 1.2;
                ctx.beginPath();
                ctx.moveTo(0, -150);
                ctx.lineTo(0, 150);
                ctx.stroke();
                // Centroid central cross dot
                ctx.setLineDash([]);
                ctx.fillStyle = '#db2777';
                ctx.beginPath();
                ctx.arc(0, 0, 4, 0, Math.PI * 2);
                ctx.fill();
                ctx.restore();
                // 4. Labeling dimension cues
                const scaleObj = unitScales[state.unit];
                const formatVal = (val) => val.toFixed(scaleObj.decimals);
                ctx.fillStyle = '#94a3b8';
                ctx.font = '500 10px Inter, sans-serif';
                ctx.textAlign = 'center';
                if (state.type !== 'circle') {
                    // Width label
                    ctx.fillText('b = ' + formatVal(state.b) + ' ' + scaleObj.label, 0, (h*scale/2) + 20);
                    // Height label
                    ctx.save();
                    ctx.translate((-b*scale/2) - 18, 0);
                    ctx.rotate(-Math.PI/2);
                    ctx.fillText('h = ' + formatVal(state.h) + ' ' + scaleObj.label, 0, 0);
                    ctx.restore();
                } else {
                    ctx.fillText('D = ' + formatVal(state.D) + ' ' + scaleObj.label, 0, (state.D*scale/2) + 20);
                }
                ctx.restore();
            }
            // Document security
            document.addEventListener('contextmenu', function(e) {
                e.preventDefault();
                alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                return false;
            }, { capture: true });
            document.addEventListener('selectstart', function(e) {
                e.preventDefault();
                return false;
            }, { capture: true });
            document.addEventListener('keydown', function(e) {
                if (e.key === 'F12') {
                    e.preventDefault();
                    alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                    return false;
                }
                if (e.ctrlKey) {
                    if (e.key === 'u' || e.key === 'c' || e.key === 's' || e.key === 'U' || e.key === 'C' || e.key === 'S') {
                        e.preventDefault();
                        alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                        return false;
                    }
                    if (e.shiftKey) {
                        if (['i','I','j','J','c','C'].includes(e.key)) {
                            e.preventDefault();
                            alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                            return false;
                        }
                    }
                }
            }, { capture: true });
            // Initialize
            updateCalculations();
            animate();
        }
        let initAttempts = 0;
        function tryInit() {
            initAttempts++;
            initSimulator();
            if (!window.__moment_initialized) {
                if (initAttempts < 50) {
                    setTimeout(tryInit, 100);
                }
            }
        }
        if (document.readyState === 'complete' || document.readyState === 'interactive') {
            tryInit();
        } else {
            document.addEventListener('DOMContentLoaded', tryInit);
            window.addEventListener('load', tryInit);
        }
        })();
</script>


<div style="background: linear-gradient(135deg, rgba(0,242,254,0.03), rgba(138,43,226,0.03)); border: 1px solid rgba(0,242,254,0.15); border-radius: 12px; padding: 18px 24px; margin: 25px auto 35px auto; font-size: 0.95em; color: #4b5563; line-height: 1.7; font-family: sans-serif;">
    <strong style="color: #1f2937; font-size: 1.05em; display: flex; align-items: center; gap: 8px;">
        <span style="font-size: 1.2em;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> 간편 사용 설명서
    </strong>
    <ol style="margin: 10px 0 0 0; padding-left: 20px;">
        <li style="margin-bottom: 6px;"><strong>단면 형상 선택: 상단 탭에서 사각형(Rectangle), 중공 사각형(Hollow Box), I형강(I-Beam), 원형(Circle) 중 원하는 형상을 선택합니다.</strong></li>
<li style="margin-bottom: 6px;">기하학적 수치 가변: 단면 폭(b), 높이(h), 플랜지/웨브 두께(tf, tw) 혹은 원형 지름(D, d) 슬라이더를 부드럽게 이동하여 치수를 조절합니다.</li>
<li style="margin-bottom: 6px;">도심 및 관성축 실시간 변동 관찰: 단면 크기가 변할 때, 2D 도면에 투영되는 도심(Centroid) 위치 및 중립축(Neutral Axis X-X, Y-Y)이 연동해서 움직이는 모습을 실시간으로 관찰합니다.</li>
<li style="margin-bottom: 6px;">단면 강성 지표 분석: 최종 연산 영역에서 단면적(A), 중립축 기준의 단면 2차 모멘트(Ix, Iy) 및 회전반경(rx, ry) 계측치를 기반으로 휨 강성을 평가합니다.</li>
    </ol>
</div>


<details class="premium-seo-accordion" style="border: 1px solid rgba(0,0,0,0.08); border-radius: 12px; background: #fbfbfc; padding: 0; margin: 30px auto; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.01); font-family: sans-serif;">
    <summary style="display: flex; justify-content: space-between; align-items: center; padding: 20px 24px; font-size: 1.1em; font-weight: 700; color: #1f2937; cursor: pointer; user-select: none; outline: none; list-style: none;">
        <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 도형별 단면 2차 모멘트 상세 공식 및 도심축 물리적 해설 확인하기</span>
        <span class="accordion-arrow" style="font-size: 0.9em; color: #9ca3af; transition: transform 0.2s ease;">▼</span>
    </summary>
    <div style="padding: 0 24px 24px 24px; border-top: 1px solid rgba(0,0,0,0.04); background: #ffffff; border-radius: 0 0 12px 12px; font-size: 0.98em; color: #374151; line-height: 1.8;">
        <div style="margin-top: 20px;">
            <h3>1. 단면 2차 모멘트(Moment of Inertia)의 물리학적 정의와 역할</h3>
<p>구조재의 역학적 거동에서 <strong>단면 2차 모멘트(Moment of Inertia, I)</strong>는 보에 휨 모멘트(Bending Moment)가 작용할 때 부재의 단면이 변형에 대해 저항하려는 강성을 대변하는 순수 기하학적 척도입니다. 즉, 재료 고유의 강도(탄성계수)가 동일하더라도 형상을 다르게 하면 휨 저항성(강성)을 수십 배 이상 늘릴 수 있으며, 이때 단면 형상이 기여하는 핵심 상수가 바로 단면 2차 모멘트입니다.</p><p>수학적으로 단면 2차 모멘트는 미소 면적 <code>dA</code>에 도심 축으로부터의 거리의 제곱(<code>y²</code>)을 가중하여 단면 전체에 대해 적분한 값입니다:</p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">I_x = &int; y&sup2; dA &nbsp;,&nbsp; I_y = &int; x&sup2; dA &nbsp;[mm⁴]</p>
<h3>2. 엔지니어링 대표 도형별 단면 2차 모멘트 핵심 공식</h3>
<p>실무 설계에서 쓰이는 표준 단면들의 중립축 기준 관성 모멘트 공식은 다음과 같습니다.</p><p><strong>① 직사각형 단면 (Rectangle - 폭 b, 높이 h):</strong></p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">I_x = (b &times; h&sup3;) / 12 &nbsp;,&nbsp; I_y = (h &times; b&sup3;) / 12</p><p><strong>② 원형 단면 (Solid Circle - 외경 D):</strong></p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">I_x = I_y = (&pi; &times; D⁴) / 64</p><p><strong>③ I형강 단면 (I-Beam - 플랜지 폭 b, 전체 높이 h, 웨브 두께 tw, 플랜지 두께 tf):</strong></p><p>외부 큰 사각형 영역(폭 b, 높이 h)에서 좌우로 비어있는 두 직사각형 공간[폭 <code>(b - tw)</code>, 높이 <code>(h - 2tf)</code>]을 감산하는 방식으로 고정 관성을 신속하게 유도합니다.</p><p style="text-align: center; font-weight: bold; background: #e0f2fe; padding: 16px; border-radius: 8px; font-size: 1.05em; color: #0369a1;">I_x = (b &times; h&sup3;) / 12 - (b - t_w) &times; (h - 2t_f)&sup3; / 12 &nbsp;[mm⁴]</p>
<h3>3. 평행축 정리(Parallel Axis Theorem) 및 단면 성능 확보 전략</h3>
<p>임의의 복합 단면의 관성 모멘트를 구할 때는 도심 축이 일치하지 않는 구성 부재들의 영향을 환산하기 위해 <strong>평행축 정리(Parallel Axis Theorem)</strong>를 필수적으로 적용합니다.</p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">I = I_c + A &times; d&sup2;</p><p>여기서 <code>I_c</code>는 부재 자체 도심에서의 단면 2차 모멘트이며, <code>A</code>는 단면적, <code>d</code>는 부재 도심에서 전체 복합 단면 도심 축까지의 수직 거리입니다. 이 정리에 따라, 자재의 양(단면적 A)을 높이지 않더라도 중립축에서 먼 거리에 플랜지 등 질량을 의도적으로 이격시키면(<code>d</code> 극대화) H형강이나 I형강처럼 매우 가볍고도 극도의 휨 저항 강성을 구현하는 최적화 보 설계가 가능해집니다.</p>
        </div>
    </div>
</details>
<style>
details.premium-seo-accordion[open] summary .accordion-arrow { transform: rotate(180deg); color: #00f2fe; }
details.premium-seo-accordion summary::-webkit-details-marker { display: none; }
details.premium-seo-accordion:hover { border-color: rgba(0,242,254,0.3); }
</style>

]]></content:encoded>
					
					<wfw:commentRss>https://myengnote.com/moment-of-inertia-cross-sections-calculator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
