{"id":439,"date":"2025-08-25T19:41:58","date_gmt":"2025-08-25T19:41:58","guid":{"rendered":"https:\/\/airsoftformula.com\/?page_id=439"},"modified":"2025-08-26T00:50:01","modified_gmt":"2025-08-26T00:50:01","slug":"fps-joule-spring-power-calculator","status":"publish","type":"page","link":"https:\/\/airsoftformula.com\/?page_id=439","title":{"rendered":"FPS &amp; Joule \/ Spring Power Calculator"},"content":{"rendered":"\n<!-- FPS \/ Joule \/ m\/s Calculator -->\n<div class=\"section\" style=\"background-color:black; color:#00b630; padding:15px; border-radius:10px;\">\n  <h3 style=\"color:#00b630;\">FPS \/ Joule \/ m\/s Calculator<\/h3>\n\n  <label for=\"fj_w\" style=\"color:#00b630;\">BB Weight (g):<\/label>\n  <select id=\"fj_w\" style=\"background:black; color:#00b630; border:1px solid #00b630; padding:5px; border-radius:5px;\">\n    <option value=\"0.20\">0.20g<\/option>\n    <option value=\"0.23\">0.23g<\/option>\n    <option value=\"0.25\">0.25g<\/option>\n    <option value=\"0.28\">0.28g<\/option>\n    <option value=\"0.30\">0.30g<\/option>\n    <option value=\"0.32\">0.32g<\/option>\n    <option value=\"0.36\">0.36g<\/option>\n    <option value=\"0.40\">0.40g<\/option>\n    <option value=\"0.43\">0.43g<\/option>\n    <option value=\"0.45\">0.45g<\/option>\n    <option value=\"0.48\">0.48g<\/option>\n    <option value=\"0.50\">0.50g<\/option>\n    <option value=\"custom\">Custom<\/option>\n  <\/select>\n  <input type=\"number\" id=\"fj_w_custom\" placeholder=\"Custom Weight (g)\" style=\"display:none; background:black; color:#00b630; border:1px solid #00b630; padding:5px; border-radius:5px;\">\n\n  <label for=\"fj_input\" style=\"color:#00b630;\">Enter Known Value:<\/label>\n  <select id=\"fj_type\" style=\"background:black; color:#00b630; border:1px solid #00b630; padding:5px; border-radius:5px;\">\n    <option value=\"fps\">FPS (feet\/sec)<\/option>\n    <option value=\"ms\">m\/s (meters\/sec)<\/option>\n    <option value=\"joule\">Joule<\/option>\n  <\/select>\n  <input type=\"number\" id=\"fj_input\" placeholder=\"Enter value\" style=\"background:black; color:#00b630; border:1px solid #00b630; padding:5px; border-radius:5px;\">\n\n  <button onclick=\"calculateFPSJoule()\" style=\"background:black; color:#00b630; border:1px solid #00b630; padding:6px 12px; border-radius:5px; margin-top:10px; cursor:pointer;\">\n    Calculate\n  <\/button>\n\n  <div id=\"fjResult\" style=\"margin-top:10px; color:#00b630;\"><\/div>\n<\/div>\n\n<script>\n  \/\/ Show custom weight box if selected\n  document.getElementById(\"fj_w\").addEventListener(\"change\", function(){\n    document.getElementById(\"fj_w_custom\").style.display = this.value===\"custom\" ? \"block\" : \"none\";\n  });\n\n  function calculateFPSJoule(){\n    let W = parseFloat(document.getElementById(\"fj_w\").value);\n    if(document.getElementById(\"fj_w\").value===\"custom\") W = parseFloat(document.getElementById(\"fj_w_custom\").value);\n    let inputVal = parseFloat(document.getElementById(\"fj_input\").value);\n    let type = document.getElementById(\"fj_type\").value;\n\n    if(!W || !inputVal){ document.getElementById(\"fjResult\").innerHTML = \"\u26a0\ufe0f Please fill all fields.\"; return; }\n\n    \/\/ Convert grams \u2192 kg\n    const mass = W \/ 1000;\n    let fps=0, ms=0, joule=0;\n\n    if(type===\"fps\"){\n      fps = inputVal;\n      ms = fps * 0.3048;\n      joule = 0.5 * mass * (ms*ms);\n    } else if(type===\"ms\"){\n      ms = inputVal;\n      fps = ms \/ 0.3048;\n      joule = 0.5 * mass * (ms*ms);\n    } else if(type===\"joule\"){\n      joule = inputVal;\n      ms = Math.sqrt((2*joule)\/mass);\n      fps = ms \/ 0.3048;\n    }\n\n    document.getElementById(\"fjResult\").innerHTML = `\n      FPS = ${fps.toFixed(2)}<br>\n      m\/s = ${ms.toFixed(2)}<br>\n      Joules = ${joule.toFixed(3)} J\n    `;\n  }\n<\/script>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Spring Power Calculator<\/title>\n<style>\nbody { background-color: #000000 !important; color: #00B630 !important; font-family: Arial, sans-serif; padding: 20px; }\nlabel, select, input, button { color: #00B630 !important; background-color: #000000 !important; border: 1px solid #00B630 !important; padding: 5px; margin: 5px 0; }\nh2 { color: #00B630; }\nbutton { cursor: pointer; }\n#spResult { background-color: black !important; color: #00B630 !important; padding: 10px; border-radius: 5px; margin-top: 20px; font-weight: bold; white-space: pre-wrap; }\nselect, input { width: 200px; }\n<\/style>\n<\/head>\n<body>\n<h2>Spring Power Calculator<\/h2>\n<label for=\"springType\">Select Spring Type:<\/label>\n<select id=\"springType\" onchange=\"populateSpringOptions()\">\n    <option value=\"M\">M-rated Spring<\/option>\n    <option value=\"SP\">SP-rated Spring<\/option>\n    <option value=\"%\">Percentage-rated Spring<\/option>\n<\/select>\n\n<label for=\"springSelect\">Select Spring:<\/label>\n<select id=\"springSelect\" onchange=\"toggleCustomSpring()\"><\/select>\n<input type=\"number\" id=\"springCustom\" placeholder=\"Enter custom M rating\" style=\"display:none;\">\n<input type=\"number\" id=\"springSPCustom\" placeholder=\"Enter custom SP rating\" style=\"display:none;\">\n\n<label for=\"sp_w\">Select BB Weight (g):<\/label>\n<select id=\"sp_w\" onchange=\"toggleCustomBB()\">\n    <option value=\"0.20\">0.20g<\/option>\n    <option value=\"0.23\">0.23g<\/option>\n    <option value=\"0.25\">0.25g<\/option>\n    <option value=\"0.28\">0.28g<\/option>\n    <option value=\"0.30\">0.30g<\/option>\n    <option value=\"0.32\">0.32g<\/option>\n    <option value=\"0.36\">0.36g<\/option>\n    <option value=\"0.40\">0.40g<\/option>\n    <option value=\"custom\">Custom<\/option>\n<\/select>\n<input type=\"number\" id=\"sp_w_custom\" placeholder=\"Enter custom BB weight\" style=\"display:none;\">\n\n<button onclick=\"calculateSpringPower()\">Calculate<\/button>\n<div id=\"spResult\"><\/div>\n\n<script>\nconst MOptions = [\"M80\",\"M90\",\"M95\",\"M100\",\"M110\",\"M113\",\"M115\",\"M120\",\"M125\",\"M130\",\"M140\",\"M150\",\"M160\",\"M170\",\"custom\"];\nconst SPOptions = [\"SP80\",\"SP90\",\"SP100\",\"SP110\",\"SP120\",\"SP130\",\"SP140\",\"SP150\",\"SP160\",\"SP170\",\"SPcustom\"];\nconst PercentOptions = [\"120%\",\"130%\",\"140%\",\"150%\",\"160%\",\"170%\",\"190%\",\"210%\",\"235%\",\"260%\",\"300%\"];\n\n\/\/ Pre-calculated SP energies (J) with 0.25g BB as reference\nconst SP_base_energy = {80:0.80, 90:1.01, 100:1.25, 110:1.51, 120:1.80, 130:2.11, 140:2.45, 150:2.81, 160:3.20, 170:3.61};\n\nfunction populateSpringOptions() {\n    const type = document.getElementById(\"springType\").value;\n    const select = document.getElementById(\"springSelect\");\n    select.innerHTML = \"\";\n    let options = [];\n    if(type === \"M\") options = MOptions;\n    else if(type === \"SP\") options = SPOptions;\n    else if(type === \"%\") options = PercentOptions;\n    options.forEach(opt => {\n        const el = document.createElement(\"option\");\n        el.value = opt;\n        el.textContent = opt;\n        select.appendChild(el);\n    });\n    toggleCustomSpring();\n}\n\nfunction toggleCustomSpring() {\n    const select = document.getElementById(\"springSelect\");\n    document.getElementById(\"springCustom\").style.display = select.value === \"custom\" ? \"inline\" : \"none\";\n    document.getElementById(\"springSPCustom\").style.display = select.value === \"SPcustom\" ? \"inline\" : \"none\";\n}\n\nfunction toggleCustomBB() {\n    const select = document.getElementById(\"sp_w\");\n    const input = document.getElementById(\"sp_w_custom\");\n    input.style.display = select.value === \"custom\" ? \"inline\" : \"none\";\n}\n\nfunction percentToM(Pval) {\n    const mapping = [\n        {p:120, m:90}, {p:130, m:95}, {p:140, m:100}, {p:150, m:110},\n        {p:160, m:113}, {p:170, m:115}, {p:190, m:120}, {p:210, m:125},\n        {p:235, m:130}, {p:260, m:140}, {p:300, m:150}\n    ];\n    if(Pval <= 120) return 90;\n    if(Pval >= 300) return 150;\n    for(let i=0;i<mapping.length-1;i++){\n        let cur = mapping[i], next = mapping[i+1];\n        if(Pval >= cur.p && Pval <= next.p){\n            return cur.m + (Pval - cur.p) * (next.m - cur.m) \/ (next.p - cur.p);\n        }\n    }\n    return 90;\n}\n\nfunction calculateSpringPower(){\n    let spring = document.getElementById(\"springSelect\").value;\n    let W = parseFloat(document.getElementById(\"sp_w\").value);\n    if(document.getElementById(\"sp_w\").value===\"custom\") W = parseFloat(document.getElementById(\"sp_w_custom\").value);\n    if(!W){ document.getElementById(\"spResult\").innerHTML = \"\u26a0\ufe0f Fill BB weight\"; return;}\n    let mass = W \/ 1000; \/\/ g -> kg\n    let E_spring, ms, fps, joule;\n\n    \/\/ SP-rated springs\n    if(spring.startsWith(\"SP\")) {\n        let SPval = parseInt(spring.replace(\/[^0-9]\/g,''));\n        E_spring = SP_base_energy[SPval] || 0.8;\n    }\n    \/\/ M-rated springs (chrono formula with M80 = 80 m\/s at 0.2g BB)\n    else if(spring.startsWith(\"M\") || spring === \"custom\") {\n        let Mval;\n        if(spring === \"custom\"){\n            Mval = parseFloat(document.getElementById(\"springCustom\").value);\n            if(isNaN(Mval)){ document.getElementById(\"spResult\").innerHTML=\"\u26a0\ufe0f Enter custom M rating\"; return; }\n        } else {\n            Mval = parseInt(spring.replace(\/[^0-9]\/g,''));\n        }\n        \/\/ Baseline: M80 -> 80 m\/s with 0.2g\n        let v_base = 80 * (Mval \/ 80); \/\/ scale velocity linearly by M rating\n        let mass_base = 0.2 \/ 1000; \/\/ kg\n        E_spring = 0.5 * mass_base * v_base * v_base; \/\/ Joules at 0.2g\n    }\n    \/\/ Percentage-rated springs\n    else if(spring.endsWith(\"%\")){\n        let Pval = parseFloat(spring.replace(\/[^0-9]\/g,''));\n        let Mval = percentToM(Pval);\n        let v_base = 80 * (Mval \/ 80);\n        let mass_base = 0.2 \/ 1000;\n        E_spring = 0.5 * mass_base * v_base * v_base;\n    }\n    else { E_spring = 0.5 * 0.2\/1000 * 80*80; }\n\n    ms = Math.sqrt(2 * E_spring \/ mass);\n    fps = ms * 3.28084;\n    joule = 0.5 * mass * ms * ms;\n\n    document.getElementById(\"spResult\").innerHTML = \n        `Spring: ${spring}\\nFPS = ${fps.toFixed(2)}\\nm\/s = ${ms.toFixed(2)}\\nJoules (with ${W}g BB) = ${joule.toFixed(3)} J`;\n}\n\n\/\/ Initialize default options\npopulateSpringOptions();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>FPS \/ Joule \/ m\/s Calculator BB Weight (g): 0.20g0.23g0.25g0.28g0.30g0.32g0.36g0.40g0.43g0.45g0.48g0.50gCustom Enter Known Value: FPS (feet\/sec)m\/s (meters\/sec)Joule Calculate Spring Power Calculator [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-439","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/airsoftformula.com\/index.php?rest_route=\/wp\/v2\/pages\/439","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/airsoftformula.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/airsoftformula.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/airsoftformula.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/airsoftformula.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=439"}],"version-history":[{"count":7,"href":"https:\/\/airsoftformula.com\/index.php?rest_route=\/wp\/v2\/pages\/439\/revisions"}],"predecessor-version":[{"id":452,"href":"https:\/\/airsoftformula.com\/index.php?rest_route=\/wp\/v2\/pages\/439\/revisions\/452"}],"wp:attachment":[{"href":"https:\/\/airsoftformula.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}