<?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>회전속도 계산 &#8211; MyEngNote</title>
	<atom:link href="https://myengnote.com/tag/%ed%9a%8c%ec%a0%84%ec%86%8d%eb%8f%84-%ea%b3%84%ec%82%b0/feed/" rel="self" type="application/rss+xml" />
	<link>https://myengnote.com</link>
	<description></description>
	<lastBuildDate>Wed, 08 Jul 2026 04:42:56 +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>선끝속도 계산기 &#038; 시뮬레이터</title>
		<link>https://myengnote.com/linear-tip-speed-simulator-calculator/</link>
					<comments>https://myengnote.com/linear-tip-speed-simulator-calculator/#respond</comments>
		
		<dc:creator><![CDATA[동동]]></dc:creator>
		<pubDate>Wed, 27 May 2026 05:12:57 +0000</pubDate>
				<category><![CDATA[공학계산기]]></category>
		<category><![CDATA[기계설계]]></category>
		<category><![CDATA[물리시뮬레이터]]></category>
		<category><![CDATA[선끝속도]]></category>
		<category><![CDATA[원심력 가속도]]></category>
		<category><![CDATA[접선속도]]></category>
		<category><![CDATA[회전속도 계산]]></category>
		<guid isPermaLink="false">https://myengnote.com/linear-tip-speed-simulator-calculator/</guid>

					<description><![CDATA[지름과 회전수(RPM)를 입력하여 선끝속도(접선 속도)를 실시간으로 계산하고 시각화하는 초정밀 2D 물리 시뮬레이터입니다.]]></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;" /> 선끝속도 계산기 &#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 rotaspeed-calculator-wrapper */
        .rotaspeed-calculator-wrapper *, .rotaspeed-calculator-wrapper *::before, .rotaspeed-calculator-wrapper *::after {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        .rotaspeed-calculator-wrapper {
            --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;
            --color-cyan-glow: rgba(2, 132, 199, 0.15);
            --color-magenta: #db2777;
            --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);
        }
        .rotaspeed-calculator-wrapper {
            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.15;
        }
        .app-background-glow::before {
            background: var(--color-cyan);
            top: -10%;
            right: -5%;
            animation: pulse-slow 15s infinite alternate;
        }
        .app-background-glow::after {
            background: var(--color-magenta);
            bottom: -10%;
            left: -5%;
            animation: pulse-slow 20s infinite alternate-reverse;
        }
        @keyframes pulse-slow {
            0% { transform: scale(1) translate(0, 0); opacity: 0.12; }
            100% { transform: scale(1.2) translate(50px, 50px); opacity: 0.22; }
        }
        .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-dark));
            -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;
        }
        .fa-spin-slow {
            animation: fa-spin 12s linear infinite;
        }
        .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;
        }
        .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;
            transition: border-color 0.3s ease, box-shadow 0.3s ease;
        }
        .panel:hover {
            border-color: var(--color-border-hover);
        }
        .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: #0284c7; }
        .text-magenta { color: #db2777; }
        .control-panel {
            grid-column: 1;
        }
        .input-group {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }
        .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;
        }
        .unit-selector-wrapper {
            position: relative;
        }
        .custom-select {
            background: rgba(0, 0, 0, 0.02);
            border: 1px solid var(--color-border);
            color: var(--color-text-main);
            padding: 4px 10px;
            border-radius: 6px;
            font-size: 11px;
            font-weight: 600;
            cursor: pointer;
            outline: none;
            transition: all 0.2s ease;
        }
        .custom-select:hover, .custom-select:focus {
            background: rgba(0, 0, 0, 0.03);
            border-color: var(--color-border);
        }
        .input-control-row {
            display: flex;
            flex-direction: column;
            gap: 10px;
        }
        .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;
            transition: background 0.2s ease;
        }
        .custom-slider::-webkit-slider-thumb {
            -webkit-appearance: none;
            appearance: none;
            width: 18px;
            height: 18px;
            border-radius: 50%;
            cursor: pointer;
            transition: transform 0.1s ease, box-shadow 0.2s ease;
        }
        .custom-slider::-moz-range-thumb {
            width: 18px;
            height: 18px;
            border: none;
            border-radius: 50%;
            cursor: pointer;
            transition: transform 0.1s ease, box-shadow 0.2s ease;
        }
        #slider-diameter::-webkit-slider-thumb {
            background: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan);
        }
        #slider-diameter::-moz-range-thumb {
            background: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan);
        }
        #slider-diameter::-webkit-slider-thumb:hover {
            transform: scale(1.2);
            box-shadow: 0 0 15px var(--color-cyan), 0 0 5px #fff;
        }
        #slider-diameter::-moz-range-thumb:hover {
            transform: scale(1.2);
            box-shadow: 0 0 15px var(--color-cyan), 0 0 5px #fff;
        }
        #slider-rpm::-webkit-slider-thumb {
            background: var(--color-magenta);
            box-shadow: 0 0 10px var(--color-magenta);
        }
        #slider-rpm::-moz-range-thumb {
            background: var(--color-magenta);
            box-shadow: 0 0 10px var(--color-magenta);
        }
        #slider-rpm::-webkit-slider-thumb:hover {
            transform: scale(1.2);
            box-shadow: 0 0 15px var(--color-magenta), 0 0 5px #fff;
        }
        #slider-rpm::-moz-range-thumb:hover {
            transform: scale(1.2);
            box-shadow: 0 0 15px var(--color-magenta), 0 0 5px #fff;
        }
        .control-actions {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 10px;
            margin-top: 10px;
        }
        #btn-particles {
            grid-column: span 2;
        }
        .action-btn {
            background: rgba(0, 0, 0, 0.02);
            border: 1px solid var(--color-border);
            color: var(--color-text-main);
            padding: 10px;
            border-radius: 10px;
            font-size: 12px;
            font-weight: 600;
            cursor: pointer;
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
        }
        .action-btn:hover {
            background: rgba(0, 0, 0, 0.03);
            border-color: var(--color-border);
        }
        .action-btn.active#btn-particles {
            background: var(--color-magenta-glow);
            border-color: #db2777;
            color: #db2777;
            box-shadow: 0 0 12px var(--color-magenta-glow);
        }
        .presets-section {
            display: flex;
            flex-direction: column;
            gap: 12px;
            border-top: 1px solid var(--color-border);
            padding-top: 18px;
        }
        .presets-section h3 {
            font-size: 13px;
            font-weight: 700;
            color: var(--color-text-main);
            display: flex;
            align-items: center;
            gap: 8px;
        }
        .presets-grid {
            display: grid;
            grid-template-columns: 1fr;
            gap: 8px;
        }
        .preset-btn {
            background: rgba(0, 0, 0, 0.015);
            border: 1px solid var(--color-border);
            border-radius: 10px;
            padding: 8px 12px;
            cursor: pointer;
            color: var(--color-text-main);
            display: flex;
            align-items: center;
            gap: 12px;
            text-align: left;
            transition: all 0.2s ease;
        }
        .preset-btn:hover {
            background: rgba(0, 0, 0, 0.05);
            border-color: var(--color-border);
            transform: translateX(4px);
        }
        .preset-btn.active {
            background: linear-gradient(90deg, var(--color-cyan-glow), var(--color-purple-glow));
            border-color: #0284c7;
            box-shadow: 0 0 10px var(--color-cyan-glow);
        }
        .preset-icon {
            width: 28px;
            height: 28px;
            background: rgba(0, 0, 0, 0.02);
            border-radius: 8px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 12px;
            color: #0284c7;
            transition: all 0.2s ease;
        }
        .preset-btn:hover .preset-icon {
            background: var(--gradient-primary);
            color: #fff;
            box-shadow: var(--shadow-neon-cyan);
        }
        .preset-btn.active .preset-icon {
            background: var(--gradient-primary);
            color: #fff;
        }
        .preset-name {
            font-size: 12px;
            font-weight: 600;
            letter-spacing: 0.25px;
        }
        .simulation-panel {
            grid-column: 2;
            align-self: start;
        }
        .simulation-panel .panel-header {
            justify-content: space-between;
        }
        .canvas-scale-indicator {
            font-size: 11px;
            color: var(--color-text-muted);
            background: rgba(0, 0, 0, 0.02);
            padding: 4px 10px;
            border-radius: 6px;
            border: 1px solid var(--color-border);
        }
        .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;
        }
        #physics-canvas {
            display: block;
            width: 100%;
            height: auto;
            aspect-ratio: 1 / 1;
        }
        .canvas-overlay-data {
            position: absolute;
            top: 16px;
            left: 16px;
            pointer-events: none;
        }
        .overlay-item {
            background: rgba(255, 255, 255, 0.85);
            backdrop-filter: blur(4px);
            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-family: var(--font-body);
            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;
            text-align: center;
        }
        .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(219, 39, 119, 0.08) 0%, rgba(124, 58, 237, 0.03) 100%);
            border: 1px solid rgba(219, 39, 119, 0.25);
            border-radius: 16px;
            padding: 20px;
            text-align: center;
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 6px;
            box-shadow: 0 0 15px rgba(219, 39, 119, 0.05);
            margin: 10px 0;
        }
        .ratio-title {
            font-size: 11px;
            font-weight: 700;
            color: #db2777;
            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-magenta));
            -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);
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03);
            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);
            border-color: rgba(219, 39, 119, 0.2);
            background: rgba(219, 39, 119, 0.03);
        }
        .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);
            transition: all 0.2s ease;
        }
        .result-card:hover .card-icon {
            color: #db2777;
            border-color: rgba(219, 39, 119, 0.3);
            background: rgba(219, 39, 119, 0.1);
        }
        .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: #db2777;
            font-size: 13px;
            background: #f8fafc;
            border-color: var(--color-border);
            padding: 6px 10px;
            border-radius: 6px;
            border: 1px solid var(--color-border);
            text-align: center;
        }
        /* Container Query for Responsiveness inside WP */
        @container rotaspeed-container (max-width: 1024px) {
            .app-main-grid {
                grid-template-columns: 1fr;
            }
            .control-panel, .simulation-panel, .results-panel {
                grid-column: 1;
            }
            .simulation-panel {
                order: -1;
            }
            .app-header {
                flex-direction: column;
                gap: 16px;
                text-align: center;
            }
            .logo-area {
                flex-direction: column;
                gap: 8px;
            }
        }
        .preset-details {
            display: flex;
            flex-direction: column;
            gap: 2px;
            align-items: flex-start;
            text-align: left;
        }
        .preset-spec {
            font-size: 11px;
            color: var(--color-text-muted);
            font-weight: 500;
        }
        .preset-name {
            font-size: 13px !important;
        }
/* ━━ WordPress 레이아웃 Override: 디자인 1 (2열 컴팩트 대칭 레이아웃) ━━ */
.rotaspeed-calculator-wrapper .app-main-grid,
.rotaspeed-calculator-wrapper .main-grid,
.rotaspeed-calculator-wrapper .sim-grid {
    display: grid !important;
    grid-template-columns: 340px 1fr !important;
    gap: 24px !important;
    align-items: start !important;
}
/* 3열 레이아웃을 2열 레이아웃으로 변경하는 특화 스타일 */
.rotaspeed-calculator-wrapper .right-column {
    display: flex !important;
    flex-direction: column !important;
    gap: 24px !important;
    min-width: 0 !important;
    grid-column: 2 !important;
}
.rotaspeed-calculator-wrapper .simulation-panel,
.rotaspeed-calculator-wrapper .canvas-panel,
.rotaspeed-calculator-wrapper .sim-panel {
    grid-column: auto !important;
    order: 1 !important;
    align-self: stretch !important;
}
.rotaspeed-calculator-wrapper .control-panel {
    grid-column: 1 !important;
}
/* 2열 통합 결과 분석 영역 레이아웃 */
.rotaspeed-calculator-wrapper .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 스타일 */
.rotaspeed-calculator-wrapper .simulation-results-section .ratio-readout-box,
.rotaspeed-calculator-wrapper .simulation-results-section .re-readout-box,
.rotaspeed-calculator-wrapper .simulation-results-section .status-readout-box,
.rotaspeed-calculator-wrapper .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;
}
.rotaspeed-calculator-wrapper .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;
}
.rotaspeed-calculator-wrapper .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;
}
.rotaspeed-calculator-wrapper .simulation-results-section .formula-card {
    grid-column: 1 !important;
    grid-row: 2 !important;
}
/* 모바일/반응형 (800px 이하) ── 항상 세로형(1열) 정렬 및 시뮬레이터 캔버스 최상단 배치 */
@media (max-width: 800px) {
    .rotaspeed-calculator-wrapper .app-main-grid,
    .rotaspeed-calculator-wrapper .main-grid,
    .rotaspeed-calculator-wrapper .sim-grid {
        grid-template-columns: 1fr !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .rotaspeed-calculator-wrapper .control-panel {
        order: 2 !important;
        width: 100% !important;
    }
    .rotaspeed-calculator-wrapper .right-column {
        order: 1 !important;
        width: 100% !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .rotaspeed-calculator-wrapper .simulation-panel,
    .rotaspeed-calculator-wrapper .canvas-panel,
    .rotaspeed-calculator-wrapper .sim-panel,
    .rotaspeed-calculator-wrapper .canvas-section {
        order: -1 !important;
    }
    .rotaspeed-calculator-wrapper .simulation-results-section {
        grid-template-columns: 1fr !important;
    }
    .rotaspeed-calculator-wrapper .simulation-results-section .ratio-readout-box,
    .rotaspeed-calculator-wrapper .simulation-results-section .re-readout-box,
    .rotaspeed-calculator-wrapper .simulation-results-section .status-readout-box,
    .rotaspeed-calculator-wrapper .simulation-results-section .gauge-container {
        grid-column: 1 !important;
        grid-row: auto !important;
        height: auto !important;
    }
    .rotaspeed-calculator-wrapper .simulation-results-section .results-grid {
        grid-column: 1 !important;
        grid-row: auto !important;
    }
    .rotaspeed-calculator-wrapper .simulation-results-section .formula-card {
        grid-column: 1 !important;
        grid-row: auto !important;
    }
}
.rotaspeed-calculator-wrapper .app-container,
.rotaspeed-calculator-wrapper .main-container {
    max-width: 100% !important;
    padding: 12px !important;
}
/* Premium Advice/Formula Card & Typography Overrides */
.rotaspeed-calculator-wrapper .simulation-results-section .formula-card,
.rotaspeed-calculator-wrapper .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;
}
.rotaspeed-calculator-wrapper .simulation-results-section .formula-card h4,
.rotaspeed-calculator-wrapper .results-panel .formula-card h4 {
    font-weight: 700 !important;
    color: var(--color-text-main) !important;
}
.rotaspeed-calculator-wrapper #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="rotaspeed-calculator-wrapper" 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-circle-notch fa-spin-slow"></i></div>
                <div>
                    <h1>ROTASPEED</h1>
                    <p class="subtitle">Linear Tip Speed Simulator &#038; Calculator</p>
                </div>
            </div>
            <div class="header-badge">
                <span class="pulse-dot"></span>
                <span class="badge-text">실시간 물리 엔진 구동 중</span>
            </div>
        </header>
        <!-- MAIN GRID LAYOUT -->
        <main class="app-main-grid">
            <!-- LEFT PANEL: CONTROLS & PRESETS -->
            <section class="panel control-panel" aria-label="입력 제어판">
                <div class="panel-header">
                    <i class="fa-solid fa-sliders text-cyan"></i>
                    <h2>시뮬레이터 제어</h2>
                </div>
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="input-diameter"><i class="fa-solid fa-arrows-left-right"></i> 회전체 지름 (Diameter)</label>
                        <div class="unit-selector-wrapper">
                            <select id="select-diameter-unit" class="custom-select" aria-label="지름 단위 선택">
                                <option value="mm" selected>mm</option>
                                <option value="cm">cm</option>
                                <option value="m">m</option>
                                <option value="inch">inch</option>
                            </select>
                        </div>
                    </div>
                    <div class="input-control-row">
                        <input type="range" id="slider-diameter" min="1" max="2000" step="1" value="500" class="custom-slider" aria-label="지름 슬라이더">
                        <div class="number-input-wrapper">
                            <input type="number" id="input-diameter" value="500" min="0.001" step="any" class="custom-number-input" style="background: #f8fafc !important; color: #0f172a !important;">
                            <span class="unit-badge" id="diameter-unit-label">mm</span>
                        </div>
                    </div>
                </div>
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="input-rpm"><i class="fa-solid fa-gauge-high"></i> 회전수 (Rotational Speed)</label>
                        <span class="helper-text">RPM (Revolutions Per Minute)</span>
                    </div>
                    <div class="input-control-row">
                        <input type="range" id="slider-rpm" min="0" max="8000" step="1" value="1500" class="custom-slider" aria-label="회전수 슬라이더">
                        <div class="number-input-wrapper">
                            <input type="number" id="input-rpm" value="1500" min="0" step="any" class="custom-number-input" style="background: #f8fafc !important; color: #0f172a !important;">
                            <span class="unit-badge">RPM</span>
                        </div>
                    </div>
                </div>
                <div class="control-actions">
                    <button id="btn-play-pause" class="action-btn" title="일시정지/재생" aria-label="일시정지 및 재생">
                        <i class="fa-solid fa-pause"></i> <span>일시정지</span>
                    </button>
                    <button id="btn-reverse" class="action-btn" title="회전 방향 전환" aria-label="회전 방향 전환">
                        <i class="fa-solid fa-rotate-left"></i> <span>방향 전환</span>
                    </button>
                    <button id="btn-particles" class="action-btn active" title="스파크 시각 효과 토글" aria-label="스파크 효과 토글">
                        <i class="fa-solid fa-wand-magic-sparkles"></i> <span>스파크 이펙트</span>
                    </button>
                </div>
                <div class="presets-section">
                    <h3><i class="fa-solid fa-list-check text-magenta"></i> 사전 정의 프리셋 (Presets)</h3>
                    <div class="presets-grid">
                        <button class="preset-btn" data-preset="bicycle" aria-label="자전거 바퀴 프리셋">
                            <span class="preset-icon"><i class="fa-solid fa-bicycle"></i></span>
                            <div class="preset-details">
                                <span class="preset-name">자전거 바퀴</span>
                                <span class="preset-spec">27.5인치, 270 RPM</span>
                            </div>
                        </button>
                        <button class="preset-btn" data-preset="grinder" aria-label="고속 그라인더 프리셋">
                            <span class="preset-icon"><i class="fa-solid fa-compact-disc"></i></span>
                            <div class="preset-details">
                                <span class="preset-name">앵글 그라인더</span>
                                <span class="preset-spec">125mm, 11000 RPM</span>
                            </div>
                        </button>
                        <button class="preset-btn" data-preset="turbine" aria-label="풍력 발전기 프리셋">
                            <span class="preset-icon"><i class="fa-solid fa-wind"></i></span>
                            <div class="preset-details">
                                <span class="preset-name">풍력 터빈</span>
                                <span class="preset-spec">120m, 15 RPM</span>
                            </div>
                        </button>
                        <button class="preset-btn" data-preset="hdd" aria-label="HDD 디스크 프리셋">
                            <span class="preset-icon"><i class="fa-solid fa-hdd"></i></span>
                            <div class="preset-details">
                                <span class="preset-name">HDD 플래터</span>
                                <span class="preset-spec">3.5인치, 7200 RPM</span>
                            </div>
                        </button>
                        <button class="preset-btn" data-preset="earth" aria-label="지구 자전 프리셋">
                            <span class="preset-icon"><i class="fa-solid fa-earth-asia"></i></span>
                            <div class="preset-details">
                                <span class="preset-name">지구 자전</span>
                                <span class="preset-spec">적도 (12,742km)</span>
                            </div>
                        </button>
                    </div>
                </div>
            </section>
            <!-- Auto Injected Right Column wrapper for Design 1 -->
            <div class="right-column">
                <section class="panel simulation-panel" aria-label="물리 애니메이션 시뮬레이션">
                                <div class="panel-header">
                                    <i class="fa-solid fa-dharmachakra text-magenta"></i>
                                    <h2>실시간 회전 시뮬레이션</h2>
                                    <span class="canvas-scale-indicator" id="canvas-scale-text">화면 스케일: 자동</span>
                                </div>
                                <div class="canvas-wrapper">
                                    <canvas id="physics-canvas" width="600" height="480"></canvas>
                                    <div class="canvas-overlay-data">
                                        <div class="overlay-item">
                                            <span class="label">선속도 벡터 길이:</span>
                                            <span class="value text-cyan" id="overlay-vector-val">0.00 m/s</span>
                                        </div>
                                    </div>
                                </div>
                                <div class="simulation-metrics-strip">
                                    <div class="mini-metric">
                                        <span class="label">주파수 (Frequency)</span>
                                        <span class="value" id="val-frequency">25.0 Hz</span>
                                    </div>
                                    <div class="mini-divider"></div>
                                    <div class="mini-metric">
                                        <span class="label">각속도 (Angular Velocity)</span>
                                        <span class="value" id="val-angular-speed">157.1 rad/s</span>
                                    </div>
                                    <div class="mini-divider"></div>
                                    <div class="mini-metric">
                                        <span class="label">향심가속도 (Centripetal Accel.)</span>
                                        <span class="value" id="val-centripetal-g">64.2 G</span>
                                    </div>
                                </div>
                            <div class="simulation-results-section">
                                <div class="ratio-readout-box">
                                    <div class="ratio-title">접선 선끝속도 (Tangential Tip Speed)</div>
                                    <div id="gauge-primary-value" class="ratio-value">39.27</div>
                                    <div class="ratio-type">m/s (초속)</div>
                                </div>
                                <div class="results-grid">
                                    <div class="result-card" id="card-ms">
                                        <div class="card-icon"><i class="fa-solid fa-gauge-simple-high text-magenta"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">접선 속도 (v)</span>
                                            <span class="card-value" id="val-ms">0.00 m/s</span>
                                        </div>
                                    </div>
                                    <div class="result-card" id="card-kmh">
                                        <div class="card-icon"><i class="fa-solid fa-gauge"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">접선 시속 (v)</span>
                                            <span class="card-value" id="val-kmh">0.0 km/h</span>
                                        </div>
                                    </div>
                                    <div class="result-card" id="card-mmin">
                                        <div class="card-icon"><i class="fa-solid fa-stopwatch"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">분당 속도 (v)</span>
                                            <span class="card-value" id="val-mmin">0 m/min</span>
                                        </div>
                                    </div>
                                    <div class="result-card" id="card-mph">
                                        <div class="card-icon"><i class="fa-solid fa-wind text-cyan"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">시속 (mph)</span>
                                            <span class="card-value" id="val-mph">87.8</span>
                                        </div>
                                    </div>
                                </div>
                                <div class="formula-card">
                                    <h4><i class="fa-solid fa-circle-info text-cyan"></i> 선끝속도 물리 공식</h4>
                                    <div class="formula-equation">
                                        v = π × D × (N / 60)
                                    </div>
                                    <div class="formula-desc">
                                        <div>• <strong>v</strong> : 선끝속도 (m/s)</div>
                                        <div>• <strong>D</strong> : 지름 (m)</div>
                                        <div>• <strong>N</strong> : 회전수 (RPM)</div>
                                    </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>
    <!-- MathJax for rendering gorgeous equations -->
    <!-- CORE SIMULATION LOGIC -->
    </div>
</div>
<script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$', '$$'], ['\\[', '\\]']]
},
svg: {
fontCache: 'global'
}
};
</script>
<script type="text/javascript" id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
<script>
(function() {
if (window.__rotaspeed_initialized) return;
function initRotaspeed() {
if (window.__rotaspeed_initialized) return;
const selectUnit = document.getElementById('select-diameter-unit');
const sliderDiameter = document.getElementById('slider-diameter');
const inputDiameter = document.getElementById('input-diameter');
const canvas = document.getElementById('physics-canvas');
if (!selectUnit || !sliderDiameter || !inputDiameter || !canvas) {
return;
}
window.__rotaspeed_initialized = true;
const labelDiameterUnit = document.getElementById('diameter-unit-label');
const sliderRpm = document.getElementById('slider-rpm');
const inputRpm = document.getElementById('input-rpm');
const btnPlayPause = document.getElementById('btn-play-pause');
const btnReverse = document.getElementById('btn-reverse');
const btnParticles = document.getElementById('btn-particles');
const presetButtons = document.querySelectorAll('.preset-btn');
const txtFrequency = document.getElementById('val-frequency');
const txtAngularSpeed = document.getElementById('val-angular-speed');
const txtCentripetalG = document.getElementById('val-centripetal-g');
const txtCanvasScale = document.getElementById('canvas-scale-text');
const gaugeProgress = document.getElementById('gauge-progress');
const txtGaugePrimaryValue = document.getElementById('gauge-primary-value');
const txtMs = document.getElementById('val-ms');
const txtKmh = document.getElementById('val-kmh');
const txtMmin = document.getElementById('val-mmin');
const txtMph = document.getElementById('val-mph');
const txtOverlayVectorVal = document.getElementById('overlay-vector-val');
const ctx = canvas.getContext('2d');
function resizeCanvas() {
const dpr = window.devicePixelRatio || 1;
const wrapper = canvas.parentElement;
if (!wrapper) return;
let targetWidth = wrapper.clientWidth;
let targetHeight = targetWidth;
if (targetWidth < 50) {
targetWidth = 500;
targetHeight = 500;
}
canvas.width = targetWidth * dpr;
canvas.height = targetHeight * dpr;
ctx.scale(dpr, dpr);
}
resizeCanvas();
window.addEventListener('resize', resizeCanvas);
window.addEventListener('load', resizeCanvas);
setTimeout(resizeCanvas, 100);
setTimeout(resizeCanvas, 400);
setTimeout(resizeCanvas, 1000);
let state = {
diameterMeters: 0.5,
rpm: 1500,
isPlaying: true,
direction: 1,
showParticles: true,
currentUnit: 'mm',
angle: 0,
lastTime: performance.now(),
particles: []
};
const unitConfigs = {
mm: {
label: 'mm',
toMeters: (val) => val / 1000,
fromMeters: (m) => m * 1000,
slider: { min: 1, max: 2000, step: 1 }
},
cm: {
label: 'cm',
toMeters: (val) => val / 100,
fromMeters: (m) => m * 100,
slider: { min: 0.1, max: 200, step: 0.1 }
},
m: {
label: 'm',
toMeters: (val) => val,
fromMeters: (m) => m,
slider: { min: 0.001, max: 25, step: 0.001 }
},
inch: {
label: 'inch',
toMeters: (val) => val * 0.0254,
fromMeters: (m) => m / 0.0254,
slider: { min: 0.1, max: 80, step: 0.1 }
}
};
const presets = {
bicycle: {
name: '자전거 바퀴 (27.5인치)',
diameter: 0.7,
rpm: 270,
unit: 'mm'
},
grinder: {
name: '초고속 앵글 그라인더',
diameter: 0.125,
rpm: 11000,
unit: 'mm'
},
turbine: {
name: '초대형 풍력 터빈',
diameter: 120,
rpm: 15,
unit: 'm'
},
hdd: {
name: '컴퓨터 하드디스크 Platter',
diameter: 0.0889,
rpm: 7200,
unit: 'inch'
},
earth: {
name: '지구 자전 (적도 둘레)',
diameter: 12742000,
rpm: 0.0006944,
unit: 'm'
}
};
function calculatePhysics() {
const D = state.diameterMeters;
const RPM = state.rpm;
const freqHz = RPM / 60;
const omega = 2 * Math.PI * freqHz;
const speedMs = Math.PI * D * freqHz;
const speedKmh = speedMs * 3.6;
const speedMmin = speedMs * 60;
const speedMph = speedMs * 2.23694;
const R = D / 2;
let centripetalAccel = 0;
if (R > 0) {
centripetalAccel = (speedMs * speedMs) / R;
}
const centripetalG = centripetalAccel / 9.80665;
return {
freqHz,
omega,
speedMs,
speedKmh,
speedMmin,
speedMph,
centripetalG
};
}
function updateOutputs() {
const physics = calculatePhysics();
txtFrequency.innerText = physics.freqHz.toFixed(2) + ' Hz';
txtAngularSpeed.innerText = physics.omega.toFixed(1) + ' rad/s';
if (physics.centripetalG > 100000) {
txtCentripetalG.innerText = physics.centripetalG.toExponential(3) + ' G';
} else {
txtCentripetalG.innerText = physics.centripetalG.toLocaleString('ko-KR', { maximumFractionDigits: 1 }) + ' G';
}
txtGaugePrimaryValue.innerText = physics.speedMs.toLocaleString('ko-KR', { maximumFractionDigits: 2 });
txtOverlayVectorVal.innerText = physics.speedMs.toFixed(2) + ' m/s';
if (txtMs) txtMs.innerText = physics.speedMs.toLocaleString('ko-KR', { maximumFractionDigits: 2 }) + ' m/s';
txtKmh.innerText = physics.speedKmh.toLocaleString('ko-KR', { maximumFractionDigits: 1 }) + ' km/h';
txtMmin.innerText = physics.speedMmin.toLocaleString('ko-KR', { maximumFractionDigits: 0 }) + ' m/min';
txtMph.innerText = physics.speedMph.toLocaleString('ko-KR', { maximumFractionDigits: 1 }) + ' mph';
const cardMs = document.getElementById('card-ms');
if (cardMs) {
if (physics.speedMs > 100) {
cardMs.style.boxShadow = '0 0 20px rgba(219, 39, 119, 0.2)';
cardMs.style.borderColor = 'rgba(219, 39, 119, 0.4)';
} else {
cardMs.style.boxShadow = '';
cardMs.style.borderColor = '';
}
}
const maxGaugeSpeed = 100;
const percentage = Math.min(physics.speedMs / maxGaugeSpeed, 1);
const dashoffset = 251.2 * (1 - percentage);
if (gaugeProgress) {
gaugeProgress.style.strokeDashoffset = dashoffset;
if (physics.speedMs > 80) {
gaugeProgress.style.stroke = '#db2777';
gaugeProgress.style.filter = 'drop-shadow(0px 0px 8px rgba(255, 0, 127, 0.7))';
} else {
gaugeProgress.style.stroke = '#0284c7';
gaugeProgress.style.filter = 'drop-shadow(0px 0px 6px rgba(0, 242, 254, 0.6))';
}
}
}
function syncDiameterInputFromSlider() {
const val = parseFloat(sliderDiameter.value);
inputDiameter.value = val;
const config = unitConfigs[state.currentUnit];
state.diameterMeters = config.toMeters(val);
clearActivePresets();
updateOutputs();
}
function syncDiameterSliderFromInput() {
let val = parseFloat(inputDiameter.value);
if (isNaN(val) || val <= 0) val = 0.001;
const config = unitConfigs[state.currentUnit];
const sliderConfig = config.slider;
sliderDiameter.min = sliderConfig.min;
sliderDiameter.max = sliderConfig.max;
sliderDiameter.step = sliderConfig.step;
sliderDiameter.value = Math.min(Math.max(val, sliderConfig.min), sliderConfig.max);
state.diameterMeters = config.toMeters(val);
clearActivePresets();
updateOutputs();
}
function syncRpmInputFromSlider() {
const val = parseInt(sliderRpm.value);
inputRpm.value = val;
state.rpm = val;
clearActivePresets();
updateOutputs();
}
function syncRpmSliderFromInput() {
let val = parseFloat(inputRpm.value);
if (isNaN(val) || val < 0) val = 0;
if (val > sliderRpm.max) {
sliderRpm.max = Math.ceil(val * 1.2);
} else if (val < 8000) {
if (sliderRpm.max > 8000) {
sliderRpm.max = 8000;
}
}
sliderRpm.value = val;
state.rpm = val;
clearActivePresets();
updateOutputs();
}
function handleUnitChange() {
const oldUnit = state.currentUnit;
const newUnit = selectUnit.value;
state.currentUnit = newUnit;
const configNew = unitConfigs[newUnit];
labelDiameterUnit.innerText = configNew.label;
sliderDiameter.min = configNew.slider.min;
sliderDiameter.max = configNew.slider.max;
sliderDiameter.step = configNew.slider.step;
const convertedVal = configNew.fromMeters(state.diameterMeters);
inputDiameter.value = Number(convertedVal.toFixed(3));
sliderDiameter.value = Math.min(Math.max(convertedVal, configNew.slider.min), configNew.slider.max);
updateOutputs();
}
function loadPreset(presetKey) {
const preset = presets[presetKey];
if (!preset) return;
presetButtons.forEach(btn => {
if (btn.dataset.preset === presetKey) {
btn.classList.add('active');
} else {
btn.classList.remove('active');
}
});
state.diameterMeters = preset.diameter;
state.rpm = preset.rpm;
state.currentUnit = preset.unit;
selectUnit.value = preset.unit;
labelDiameterUnit.innerText = preset.unit;
const config = unitConfigs[preset.unit];
sliderDiameter.min = config.slider.min;
sliderDiameter.max = config.slider.max;
sliderDiameter.step = config.slider.step;
const uiDiameterVal = config.fromMeters(preset.diameter);
inputDiameter.value = Number(uiDiameterVal.toFixed(4));
sliderDiameter.value = uiDiameterVal;
if (preset.rpm > sliderRpm.max) {
sliderRpm.max = Math.ceil(preset.rpm * 1.1);
}
inputRpm.value = preset.rpm;
sliderRpm.value = preset.rpm;
updateOutputs();
}
function clearActivePresets() {
presetButtons.forEach(btn => btn.classList.remove('active'));
}
class SparkParticle {
constructor(x, y, angle, linearSpeed) {
this.x = x;
this.y = y;
const speedFactor = Math.min(linearSpeed * 0.08, 4) + Math.random() * 1.5;
const directionAngle = angle + (Math.random() - 0.5) * 0.25;
this.vx = Math.cos(directionAngle) * speedFactor;
this.vy = Math.sin(directionAngle) * speedFactor;
this.size = Math.random() * 1.5 + 0.5;
this.maxLife = Math.random() * 15 + 15;
this.life = this.maxLife;
const colors = ['#ffe600', '#ff8400', '#ff007f', '#ffffff'];
this.color = colors[Math.floor(Math.random() * colors.length)];
}
update() {
this.vx *= 0.95;
this.vy *= 0.95;
this.vy += 0.08;
this.x += this.vx;
this.y += this.vy;
this.life--;
}
draw(c) {
const alpha = this.life / this.maxLife;
c.save();
c.globalAlpha = alpha;
c.beginPath();
c.arc(this.x, this.y, this.size, 0, Math.PI * 2);
c.fillStyle = this.color;
c.shadowBlur = 4;
c.shadowColor = this.color;
c.fill();
c.restore();
}
}
function animate(currentTime) {
requestAnimationFrame(animate);
let dt = (currentTime - state.lastTime) / 1000;
if (isNaN(dt) || dt < 0 || dt > 1.0) {
dt = 0.016;
}
state.lastTime = currentTime;
const width = canvas.width / (window.devicePixelRatio || 1);
const height = canvas.height / (window.devicePixelRatio || 1);
const cx = width / 2;
const cy = height / 2;
ctx.clearRect(0, 0, width, height);
ctx.save();
ctx.strokeStyle = 'rgba(2, 132, 199, 0.06)';
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();
const physics = calculatePhysics();
if (isNaN(physics.omega)) physics.omega = 0;
if (isNaN(physics.speedMs)) physics.speedMs = 0;
if (state.isPlaying) {
if (state.rpm > 0) {
let clampedDt = Math.min(dt, 0.1);
if (isNaN(clampedDt) || clampedDt < 0) clampedDt = 0.016;
const maxVisualOmega = 12;
const visualOmega = maxVisualOmega * (1 - Math.exp(-physics.omega / maxVisualOmega));
state.angle += state.direction * (isNaN(visualOmega) ? 0 : visualOmega) * clampedDt;
}
}
if (state.showParticles) {
if (state.isPlaying) {
if (state.rpm > 0) {
const emissionRate = Math.min(Math.floor(physics.speedMs / 12) + 1, 4);
const visualRadius = getVisualRadius();
for (let i = 0; i < emissionRate; i++) {
if (Math.random() > 0.6) {
let emitAngle = Math.random() * Math.PI * 2;
if (physics.speedMs > 150) {
emitAngle = Math.PI / 4 + (Math.random() - 0.5) * 0.15;
}
const ex = cx + Math.cos(emitAngle) * visualRadius;
const ey = cy + Math.sin(emitAngle) * visualRadius;
const tangAngle = emitAngle + (state.direction * Math.PI / 2);
state.particles.push(new SparkParticle(ex, ey, tangAngle, physics.speedMs));
}
}
}
}
}
state.particles = state.particles.filter(p => p.life > 0);
state.particles.forEach(p => {
p.update();
p.draw(ctx);
});
ctx.save();
ctx.translate(cx, cy);
const drawRadius = getVisualRadius();
displayVisualScaleText(physics.speedMs);
if (isNaN(state.angle)) {
state.angle = 0;
}
ctx.rotate(state.angle);
ctx.shadowBlur = 10;
ctx.shadowColor = 'rgba(0, 242, 254, 0.4)';
ctx.beginPath();
ctx.arc(0, 0, drawRadius, 0, Math.PI * 2);
ctx.strokeStyle = 'rgba(0, 0, 0, 0.05)';
ctx.lineWidth = 6;
ctx.stroke();
ctx.beginPath();
ctx.arc(0, 0, drawRadius - 3, 0, Math.PI * 2);
ctx.strokeStyle = 'rgba(0, 242, 254, 0.55)';
ctx.lineWidth = 2;
ctx.stroke();
ctx.shadowBlur = 0;
const spokesCount = 8;
for (let i = 0; i < spokesCount; i++) {
const spokeAngle = (i * Math.PI * 2) / spokesCount;
ctx.save();
ctx.rotate(spokeAngle);
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(0, drawRadius - 10);
ctx.strokeStyle = i % 2 === 0 ? 'rgba(0, 242, 254, 0.4)' : 'rgba(138, 43, 226, 0.4)';
ctx.lineWidth = i % 2 === 0 ? 4 : 2;
ctx.stroke();
ctx.beginPath();
ctx.moveTo(-4, drawRadius - 12);
ctx.lineTo(4, drawRadius - 12);
ctx.strokeStyle = 'rgba(15, 23, 42, 0.15)';
ctx.lineWidth = 2;
ctx.stroke();
ctx.restore();
}
ctx.beginPath();
ctx.arc(0, 0, drawRadius * 0.45, 0, Math.PI * 2);
ctx.strokeStyle = 'rgba(138, 43, 226, 0.25)';
ctx.lineWidth = 1;
ctx.stroke();
ctx.beginPath();
ctx.arc(0, 0, 16, 0, Math.PI * 2);
ctx.fillStyle = '#ffffff';
ctx.strokeStyle = '#0284c7';
ctx.lineWidth = 3;
ctx.shadowBlur = 8;
ctx.shadowColor = '#0284c7';
ctx.fill();
ctx.stroke();
ctx.shadowBlur = 0;
ctx.beginPath();
ctx.arc(0, 0, 6, 0, Math.PI * 2);
ctx.fillStyle = '#ffffff';
ctx.fill();
ctx.restore();
ctx.save();
ctx.translate(cx, cy);
const config = unitConfigs[state.currentUnit];
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(0, -drawRadius);
ctx.strokeStyle = 'rgba(16, 185, 129, 0.5)';
ctx.lineWidth = 1.5;
ctx.setLineDash([4, 4]);
ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = '#10b981';
ctx.font = 'bold 10px Inter';
ctx.textAlign = 'right';
const uiRadVal = config.fromMeters(state.diameterMeters / 2);
ctx.fillText(`반경 r = ${uiRadVal.toLocaleString('ko-KR', { maximumFractionDigits: 2 })} ${state.currentUnit}`, -8, -drawRadius / 2);
const dimAngle = -45 * Math.PI / 180;
const dx = Math.cos(dimAngle) * drawRadius;
const dy = Math.sin(dimAngle) * drawRadius;
ctx.beginPath();
ctx.moveTo(-dx, -dy);
ctx.lineTo(dx, dy);
ctx.strokeStyle = 'rgba(0, 242, 254, 0.45)';
ctx.lineWidth = 1.2;
ctx.stroke();
function drawArrowhead(c, x, y, angle) {
c.save();
c.translate(x, y);
c.rotate(angle);
c.beginPath();
c.moveTo(0, 0);
c.lineTo(-8, -3.5);
c.lineTo(-8, 3.5);
c.closePath();
c.fillStyle = 'rgba(0, 242, 254, 0.7)';
c.fill();
c.restore();
}
drawArrowhead(ctx, dx, dy, dimAngle);
drawArrowhead(ctx, -dx, -dy, dimAngle + Math.PI);
const uiDiamVal = config.fromMeters(state.diameterMeters);
const diamText = `지름 D = ${uiDiamVal.toLocaleString('ko-KR', { maximumFractionDigits: 2 })} ${state.currentUnit}`;
ctx.save();
ctx.translate(dx * 0.35, dy * 0.35);
ctx.rotate(dimAngle);
ctx.fillStyle = '#0284c7';
ctx.font = 'bold 10px Inter';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(diamText, 0, 0);
ctx.restore();
if (state.rpm > 0) {
const arcRadius = 34;
ctx.beginPath();
const startAngle = state.direction > 0 ? -Math.PI * 0.75 : -Math.PI * 0.25;
const endAngle = state.direction > 0 ? -Math.PI * 0.25 : -Math.PI * 0.75;
ctx.arc(0, 0, arcRadius, startAngle, endAngle, state.direction < 0);
ctx.strokeStyle = '#7c3aed';
ctx.lineWidth = 2.5;
ctx.shadowBlur = 6;
ctx.shadowColor = '#7c3aed';
ctx.stroke();
ctx.shadowBlur = 0;
const tipAngle = state.direction > 0 ? endAngle : endAngle;
ctx.save();
ctx.translate(Math.cos(tipAngle) * arcRadius, Math.sin(tipAngle) * arcRadius);
ctx.rotate(tipAngle + (state.direction > 0 ? Math.PI / 2 : -Math.PI / 2));
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(-6, -3);
ctx.lineTo(-6, 3);
ctx.closePath();
ctx.fillStyle = '#7c3aed';
ctx.fill();
ctx.restore();
ctx.fillStyle = '#1e293b';
ctx.font = '900 10px Outfit';
ctx.textAlign = state.direction > 0 ? 'left' : 'right';
const rpmX = state.direction > 0 ? arcRadius + 8 : -(arcRadius + 8);
ctx.fillText(`${state.direction > 0 ? '↻' : '↺'} ${state.rpm.toLocaleString()} RPM`, rpmX, 4);
}
ctx.restore();
if (state.rpm > 0) {
ctx.save();
ctx.translate(cx, cy);
const arrowDir = state.direction;
const arrowStartY = -drawRadius;
ctx.beginPath();
ctx.moveTo(-120, arrowStartY);
ctx.lineTo(120, arrowStartY);
ctx.strokeStyle = 'rgba(15, 23, 42, 0.12)';
ctx.lineWidth = 1;
ctx.setLineDash([3, 3]);
ctx.stroke();
ctx.setLineDash([]);
const arrowLength = Math.min(physics.speedMs * 1.3 + 25, 170);
ctx.shadowBlur = 12;
ctx.shadowColor = '#db2777';
ctx.strokeStyle = '#db2777';
ctx.fillStyle = '#db2777';
ctx.lineWidth = 4.5;
ctx.lineCap = 'round';
ctx.beginPath();
ctx.moveTo(0, arrowStartY);
ctx.lineTo(arrowDir * arrowLength, arrowStartY);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(arrowDir * arrowLength, arrowStartY);
ctx.lineTo(arrowDir * (arrowLength - 10), arrowStartY - 6);
ctx.lineTo(arrowDir * (arrowLength - 10), arrowStartY + 6);
ctx.closePath();
ctx.fill();
ctx.shadowBlur = 4;
ctx.shadowColor = '#db2777';
ctx.fillStyle = '#db2777';
ctx.beginPath();
ctx.arc(0, arrowStartY, 5, 0, Math.PI * 2);
ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = '#0f172a';
ctx.font = 'bold 11px Inter';
ctx.textAlign = arrowDir > 0 ? 'left' : 'right';
const vectorLabel = `선속도 v = ${physics.speedMs.toFixed(2)} m/s`;
ctx.fillText(
vectorLabel,
arrowDir * (arrowLength / 2),
arrowStartY - 12
);
ctx.restore();
}
ctx.save();
const scaleMeters = getNiceScaleStep(state.diameterMeters / 3.5);
if (scaleMeters > 0) {
const scaleBarPx = scaleMeters / (state.diameterMeters / (drawRadius * 2));
const startX = 20;
const startY = height - 20;
ctx.strokeStyle = 'rgba(15, 23, 42, 0.35)';
ctx.lineWidth = 1.5;
ctx.beginPath();
ctx.moveTo(startX, startY - 4);
ctx.lineTo(startX, startY);
ctx.lineTo(startX + scaleBarPx, startY);
ctx.lineTo(startX + scaleBarPx, startY - 4);
ctx.stroke();
const uiScaleVal = config.fromMeters(scaleMeters);
let displayScaleText = `${uiScaleVal.toLocaleString('ko-KR', { maximumFractionDigits: 2 })} ${state.currentUnit}`;
ctx.fillStyle = 'rgba(15, 23, 42, 0.6)';
ctx.font = 'bold 9px Inter';
ctx.textAlign = 'left';
ctx.fillText(displayScaleText, startX + 4, startY - 6);
ctx.fillStyle = 'rgba(15, 23, 42, 0.6)'; ctx.fillStyle = 'rgba(15, 23, 42, 0.6)'; ctx.fillText("SCALE", startX + scaleBarPx + 8, startY + 3);
}
ctx.restore();
}
function getVisualRadius() {
const D = state.diameterMeters;
const minVal = 0.01;
const maxVal = 2.0;
const dpr = window.devicePixelRatio || 1;
const height = canvas.height / dpr;
const maxRadius = height / 2 - 60;
const minRadius = Math.max(50, height / 6);
if (D <= minVal) return minRadius;
if (D >= maxVal) return maxRadius;
const pct = (D - minVal) / (maxVal - minVal);
return minRadius + pct * (maxRadius - minRadius);
}
function displayVisualScaleText(speedMs) {
const D = state.diameterMeters;
let text = '화면 스케일: ';
if (D < 0.01) {
text += `마이크로 (1:${(0.1 / D).toFixed(0)} 비율)`;
} else if (D < 1) {
text += `밀리미터급`;
} else if (D < 10) {
text += `인체/자전거급 (1:1 실제 비율)`;
} else if (D < 1000) {
text += `항공기/터빈급 (축소 출력)`;
} else {
text += `행성 스케일 (초고도 축소)`;
}
txtCanvasScale.innerText = text;
}
function getNiceScaleStep(approxVal) {
if (approxVal <= 0) return 0;
const exponent = Math.floor(Math.log10(approxVal));
const fraction = approxVal / Math.pow(10, exponent);
let step;
if (fraction < 1.5) step = 1;
else if (fraction < 3.5) step = 2;
else if (fraction < 7.5) step = 5;
else step = 10;
return step * Math.pow(10, exponent);
}
sliderDiameter.addEventListener('input', syncDiameterInputFromSlider);
inputDiameter.addEventListener('change', syncDiameterSliderFromInput);
inputDiameter.addEventListener('input', syncDiameterSliderFromInput);
sliderRpm.addEventListener('input', syncRpmInputFromSlider);
inputRpm.addEventListener('change', syncRpmSliderFromInput);
inputRpm.addEventListener('input', syncRpmSliderFromInput);
selectUnit.addEventListener('change', handleUnitChange);
btnPlayPause.addEventListener('click', () => {
state.isPlaying = !state.isPlaying;
if (state.isPlaying) {
btnPlayPause.innerHTML = '<i class="fa-solid fa-pause"></i> <span>일시정지</span>';
btnPlayPause.classList.remove('active');
} else {
btnPlayPause.innerHTML = '<i class="fa-solid fa-play"></i> <span>재생</span>';
btnPlayPause.classList.add('active');
}
});
btnReverse.addEventListener('click', () => {
state.direction *= -1;
btnReverse.classList.add('press-glow');
setTimeout(() => btnReverse.classList.remove('press-glow'), 300);
});
btnParticles.addEventListener('click', () => {
state.showParticles = !state.showParticles;
if (state.showParticles) {
btnParticles.classList.add('active');
} else {
btnParticles.classList.remove('active');
}
});
presetButtons.forEach(btn => {
btn.addEventListener('click', () => {
const key = btn.dataset.preset;
loadPreset(key);
});
});
loadPreset('bicycle');
requestAnimationFrame(animate);
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 });
}
let initAttempts = 0;
function tryInit() {
initAttempts++;
initRotaspeed();
if (!window.__rotaspeed_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>회전체 지름 입력: 슬라이더를 조절하거나 우측 숫자 입력 칸에 회전체의 실제 지름을 입력합니다. (기본 mm단위, cm/m/inch로 단위 변환 지원)</strong></li>
<li style="margin-bottom: 6px;">회전수(RPM) 입력: 아래 슬라이더 또는 숫자 칸에 분당 회전 속도를 직접 타이핑하여 설정합니다.</li>
<li style="margin-bottom: 6px;">실시간 수치 판독: 지름과 RPM을 변경하면 실시간으로 계산된 선속도 파티클 효과와 물리 벡터 화살표가 바뀌며, 실시간 수치(m/s, km/h, m/min) 및 원심 가속도를 확인합니다.</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;" /> 상세 기계공학 해설 및 설계 규격 (KS/ISO) 확인하기</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. 선끝속도(Linear Tip Speed)의 정의 및 공학적 중요성</h3>
<p>선끝속도(접선 속도, Tangential Speed)는 회전하는 강체의 가장 바깥쪽 표면상 한 점이 가지는 순간적인 선형 속도를 의미합니다. 기계공학 및 기계설계 분야에서 선끝속도는 부품의 내구성, 소음, 마찰열, 그리고 가공 정밀도를 결정짓는 극한의 핵심 설계 인자입니다. 대표적으로 원주속도(Peripheral Speed) 혹은 주속이라고도 불리며, 다음과 같은 시스템에서 임계 설계 기준으로 작용합니다.</p><ul><li><strong>절삭가공 (선삭 및 밀링):</strong> 공구 끝단의 절삭 속도(Cutting Speed)가 최적의 범위를 벗어나면 공구 마모가 급격히 촉진되거나 조도가 저하됩니다.</li><li><strong>회전체 역학 (플라이휠, 터빈 플래터):</strong> 고속 회전 시 원심력에 의한 인장 응력이 선끝속도의 제곱에 비례하여 증가하므로 파손 방지를 위한 강도학적 한계 검토가 반드시 필요합니다.</li><li><strong>동력 전달 (풀리, 체인):</strong> 마찰전동 및 물림전동에서 슬립(Slip) 방지 및 소음 임계치 설계를 위해 적정 속도 제어가 요구됩니다.</li></ul>
<h3>2. 핵심 수학적 기초 및 계산 공식 유도</h3>
<p>원운동을 하는 입자의 각속도를 <code>&omega;</code> (rad/s), 회전 반경을 <code>R</code> (m)이라고 하면 접선 방향의 선속도 <code>v</code> (m/s)는 다음과 같이 각속도와 반경의 곱으로 표현됩니다:</p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">v = R &times; &omega;</p><p>실무 설계 및 현장 계산에서는 각속도 대신 초당 회전수 또는 분당 회전수(RPM, N)와 지름(D, mm)을 주로 사용하므로 공식 변환이 이루어집니다. 각속도 <code>&omega;</code>는 1회전이 <code>2&pi;</code> 라디안이므로 다음과 같이 유도됩니다:</p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">&omega; = (2&pi; &times; N) / 60</p><p>이를 반경 <code>R = D / 2</code>와 미터 단위 변환(1m = 1000mm)을 적용하여 종합하면 최종적인 선끝속도 공학 계산 공식이 도출됩니다:</p><p style="text-align: center; font-weight: bold; background: #e0f2fe; padding: 16px; border-radius: 8px; font-size: 1.1em; color: #0369a1;">v = (&pi; &times; D &times; N) / (60 &times; 1000) = (&pi; &times; D &times; N) / 60,000 &nbsp;[m/s]</p>
<h3>3. 연관 물리량: 원심가속도 및 원심력</h3>
<p>선끝속도가 증가할 때 회전하는 부품 내부에 발생하는 응력을 분석하기 위해서는 원심가속도(Centripetal Acceleration) <code>a_c</code>를 반드시 고려해야 합니다:</p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">a_c = v^2 / R = R &times; &omega;^2 &nbsp;[m/s^2]</p><p>원심가속도는 속도의 제곱에 비례하기 때문에 회전 지름보다 회전 속도(RPM)가 미치는 영향이 지배적입니다. 이는 회전체의 질량이 <code>m</code>일 때 관성력인 원심력(Centrifugal Force) <code>F_c = m &times; a_c</code>로 이어지며, 고속 스핀들이나 연삭 숫돌의 파손(Bursting) 설계에 있어 안전계수 결정의 결정적인 척도가 됩니다.</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/linear-tip-speed-simulator-calculator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
