Nystrom Gear Ratio & Tire Size Calculator
| Gear | Ratio | Overall | MPH @ 2500 | RPM @ 65 |
const ratios=parseRatios();
const rear=parseFloat(rearInput.value)||3.54;
const dia=parseFloat(diaInput.value)||28;
const refRpm=parseFloat(refRpmInput.value)||2500;
const refMph=parseFloat(refMphInput.value)||65;
const redline=parseFloat(redlineInput.value)||6000;
headRpm.textContent = Math.round(refRpm);
headMph.textContent = Math.round(refMph);
body.innerHTML='';
ratios.forEach((g,i)=>{
const overall=g*rear;
const mph=mphAtRpm(refRpm,dia,overall);
const rpm=rpmAtMph(refMph,dia,overall);
const row=document.createElement('tr');
row.innerHTML = `
${i+1} | ${g.toFixed(2)} | ${overall.toFixed(3)} | ${mph.toFixed(1)} | ${Math.round(rpm)} | `;
body.appendChild(row);
});
if(!chart){ chart = new Chart(chartEl.getContext('2d'),{type:'line',data:{labels:[],datasets:[]},options:{responsive:true,maintainAspectRatio:false, scales:{ x:{title:{display:true,text:'MPH'},ticks:{color:'#d4d4d8'}, grid:{color:'#333'}}, y:{title:{display:true,text:'RPM'},ticks:{color:'#d4d4d8'}, grid:{color:'#333'}, suggestedMax:9000}}, plugins:{legend:{labels:{color:'#d4d4d8'}}, redline:{value:redline}} },plugins:[{id:'redline', afterDraw(chart,args,opts){ const y=chart.scales.y.getPixelForValue(opts.value||6000); const ctx=chart.ctx; ctx.save(); ctx.strokeStyle='#e06600'; ctx.setLineDash([5,5]); ctx.beginPath(); ctx.moveTo(chart.scales.x.left,y); ctx.lineTo(chart.scales.x.right,y); ctx.stroke(); ctx.fillStyle='#e06600'; ctx.fillText('Redline',chart.scales.x.left+4,y-4); ctx.restore(); }}] }); }
const mphs=[]; for(let m=10;m<=90;m+=10){mphs.push(m);}
const colors=['#c8a45e','#2dd4bf','#22d3ee','#a78bfa','#fb923c','#94a3b8','#f472b6','#4ade80'];
const datasets=ratios.map((g,i)=>{ const overall=g*rear; const data=mphs.map(m=>rpmAtMph(m,dia,overall)); return {label:'Gear '+(i+1),data, borderColor:colors[i%colors.length],borderWidth:2,pointRadius:0,tension:0.25}; });
chart.data.labels=mphs; chart.data.datasets=datasets; chart.options.scales.y.suggestedMax=Math.max(9000,redline+1000); chart.options.plugins.redline.value=redline; chart.update();
}
nction(){