Kalkulator dystansu rowerowego
Ten prosty kalkulator pomoże Ci oszacować, jaki dystans jesteś w stanie przejechać na różnych typach rowerów w określonym czasie jazdy. Wystarczy, że wybierzesz typ roweru, koła, szerokość opon, rodzaj napędu i teren – resztę obliczymy automatycznie.
Dzięki temu szybko sprawdzisz, jak różne konfiguracje (np. szosa, trekking czy miejski) wpływają na średnią prędkość i możliwy dystans. Dodatkowo możesz skorzystać z gotowych scenariuszy, aby porównać różne rowery względem dystansu osiągniętego na szosie.
- Wybierz typ roweru z listy.
- Określ szerokość opon.
- Zaznacz, czy rower ma przerzutki, czy piastę planetarną.
- Podaj rodzaj terenu, po którym planujesz jazdę.
- Wpisz czas jazdy w godzinach.
- Kliknij „Oblicz”, aby zobaczyć przewidywaną średnią prędkość i dystans.
Możesz też skorzystać z gotowych scenariuszy poniżej, aby łatwo porównać różne rowery przy tym samym dystansie szosowym.
Parametry trasy i roweru
Przykładowe scenariusze
Kliknij, aby zobaczyć porównanie dystansów różnych rowerów względem szosy.
Wyniki
Średnia prędkość (km/h) | – |
---|---|
Dystans (km) | – |
Model uproszczony: wartości orientacyjne, zakładające moc referencyjną ~180 W.
Porównanie różnych rowerów
Typ roweru | Dystans (km) |
---|---|
Brak danych – wybierz preset. |
FAQ – najczęstsze pytania
- Czy wyniki są dokładne? – To model orientacyjny; rzeczywisty dystans może różnić się w zależności od wiatru, kondycji czy nawierzchni.
- Dlaczego dystans różni się od realnego? – Kalkulator uwzględnia typ roweru, opony i teren, ale nie wszystkie czynniki środowiskowe.
- Czy mogę użyć tego dla roweru elektrycznego? – Nie, wyniki zakładają rower tradycyjny i stałą moc ludzką.
Kod po stronie przeglądarki
<style>
[data-bs-theme=golden] .btn-outline-secondary {
--bs-btn-color: #5b636a;
--bs-btn-border-color: #5b636a ;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #5b636a ;
--bs-btn-hover-border-color: #5b636a ;
--bs-btn-focus-shadow-rgb: 108, 117, 125;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #5b636a ;
--bs-btn-active-border-color: #5b636a ;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #5b636a ;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #5b636a;
--bs-gradient: none;
}
[data-bs-theme=twilight] .btn-outline-secondary {
--bs-btn-color: #9ba9b4;
--bs-btn-border-color: #9ba9b4 ;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #9ba9b4 ;
--bs-btn-hover-border-color: #9ba9b4;
--bs-btn-focus-shadow-rgb: 108, 117, 125;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #9ba9b4 ;
--bs-btn-active-border-color: #9ba9b4;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #9ba9b4;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #9ba9b4;
--bs-gradient: none;
}
[data-bs-theme=dark] .btn-outline-secondary {
--bs-btn-color: #9ba9b4;
--bs-btn-border-color: #9ba9b4;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #9ba9b4;
--bs-btn-hover-border-color: #9ba9b4;
--bs-btn-focus-shadow-rgb: 108, 117, 125;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #9ba9b4 ;
--bs-btn-active-border-color: #9ba9b4;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #9ba9b4;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #9ba9b4;
--bs-gradient: none;
}
</style>
<div id="app">
<div class="row g-4">
<!-- Formularz -->
<div class="col-md-5">
<div class="card shadow-sm mb-4">
<div class="card-body">
<h2 class="h5 card-title">Parametry trasy i roweru</h2>
<form id="bikeForm">
<div class="mb-3">
<label class="form-label" for="bikeType">Typ roweru</label>
<select class="form-select" id="bikeType">
<option value="szosa">Szosa</option>
<option value="trekking">Trekking</option>
<option value="miejski">Miejski</option>
<option value="mtb">MTB</option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="tyreWidth">Szerokość opon</label>
<select class="form-select" id="tyreWidth">
<option value="23">23 mm</option>
<option value="28">28 mm</option>
<option value="38">38 mm</option>
<option value="50">50 mm</option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="drivetrain">Typ przekładni</label>
<select class="form-select" id="drivetrain">
<option value="przerzutki">Przerzutki</option>
<option value="piasta">Piasta planetarna</option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="terrain">Rodzaj terenu</label>
<select class="form-select" id="terrain">
<option value="plaski">Płaski</option>
<option value="pagorki">Pagórkowaty</option>
<option value="gory">Górzysty</option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="time">Czas jazdy (h)</label>
<input type="number" class="form-control" id="time" value="20">
</div>
<button type="button" class="btn btn-primary w-100 mb-2" onclick="calculate()">Oblicz</button>
</form>
</div>
</div>
<!-- Presety -->
<div class="card shadow-sm">
<div class="card-body">
<h2 class="h5 card-title">Przykładowe scenariusze</h2>
<p class="small text-muted">Kliknij, aby zobaczyć porównanie dystansów różnych rowerów względem szosy.</p>
<button type="button" class="btn btn-outline-secondary w-100 mb-2" onclick="presetCompare(700)">Porównaj dystans 700 km (szosa)</button>
<button type="button" class="btn btn-outline-secondary w-100 mb-2" onclick="presetCompare(500)">Porównaj dystans 500 km (szosa)</button>
</div>
</div>
</div>
<!-- Wyniki -->
<div class="col-md-7">
<div class="card shadow-sm mb-4">
<div class="card-body">
<h2 class="h5 card-title">Wyniki</h2>
<table class="table table-striped">
<tbody>
<tr>
<th>Średnia prędkość (km/h)</th>
<td id="speed">–</td>
</tr>
<tr>
<th>Dystans (km)</th>
<td id="distance">–</td>
</tr>
</tbody>
</table>
<p class="text-muted"><small>Model uproszczony: wartości orientacyjne, zakładające moc referencyjną ~180 W.</small></p>
</div>
</div>
<!-- Porównanie presetów -->
<div class="card shadow-sm mb-4">
<div class="card-body">
<h2 class="h5 card-title">Porównanie różnych rowerów</h2>
<table class="table table-bordered">
<thead>
<tr>
<th>Typ roweru</th>
<th>Dystans (km)</th>
</tr>
</thead>
<tbody id="presetResults">
<tr><td colspan="2">Brak danych – wybierz preset.</td></tr>
</tbody>
</table>
</div>
</div>
<!-- FAQ -->
<div class="card shadow-sm">
<div class="card-body">
<h2 class="h5 card-title">FAQ – najczęstsze pytania</h2>
<ul class="mb-0">
<li><strong>Czy wyniki są dokładne?</strong> – To model orientacyjny; rzeczywisty dystans może różnić się w zależności od wiatru, kondycji czy nawierzchni.</li>
<li><strong>Dlaczego dystans różni się od realnego?</strong> – Kalkulator uwzględnia typ roweru, opony i teren, ale nie wszystkie czynniki środowiskowe.</li>
<li><strong>Czy mogę użyć tego dla roweru elektrycznego?</strong> – Nie, wyniki zakładają rower tradycyjny i stałą moc ludzką.</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<script>
const profiles = {
szosa: { CdA: 0.28, Crr: 0.0045, eff: 0.96 },
trekking: { CdA: 0.38, Crr: 0.006, eff: 0.95 },
miejski: { CdA: 0.50, Crr: 0.008, eff: 0.92 },
mtb: { CdA: 0.60, Crr: 0.010, eff: 0.95 }
};
function calcSpeedDistance(bikeType, tyreWidth, drivetrain, terrain, time) {
let P = 180;
let {CdA, Crr, eff} = profiles[bikeType];
if (tyreWidth >= 38) Crr *= 1.2;
if (tyreWidth >= 50) Crr *= 1.4;
if (drivetrain === "piasta") eff *= 0.95;
if (terrain === "pagorki") P *= 0.9;
if (terrain === "gory") P *= 0.75;
const m = 80;
const rho = 1.225;
const g = 9.81;
let v = 5;
for (let i = 0; i < 100; i++) {
const Paero = 0.5 * rho * CdA * v * v * v;
const Proll = Crr * m * g * v;
const Ptotal = (Paero + Proll) / eff;
v = v * Math.pow(P / Ptotal, 0.3);
}
const speed = v * 3.6;
const distance = speed * time;
return {speed, distance};
}
function calculate() {
const bikeType = document.getElementById('bikeType').value;
const tyreWidth = parseFloat(document.getElementById('tyreWidth').value);
const drivetrain = document.getElementById('drivetrain').value;
const terrain = document.getElementById('terrain').value;
const t = parseFloat(document.getElementById('time').value);
const {speed, distance} = calcSpeedDistance(bikeType, tyreWidth, drivetrain, terrain, t);
document.getElementById('speed').textContent = speed.toFixed(1);
document.getElementById('distance').textContent = distance.toFixed(0);
}
function presetCompare(referenceDistance) {
const resultsBody = document.getElementById('presetResults');
resultsBody.innerHTML = '';
const terrains = "plaski";
const drivetrain = "przerzutki";
const widths = { szosa: 28, trekking: 38, miejski: 38, mtb: 50 };
const t = 20;
const szosa = calcSpeedDistance("szosa", widths.szosa, drivetrain, terrains, t);
const scale = referenceDistance / szosa.distance;
for (let type in profiles) {
const r = calcSpeedDistance(type, widths[type], drivetrain, terrains, t);
const adjusted = r.distance * scale;
const row = `<tr><td>${type.toUpperCase()}</td><td>${adjusted.toFixed(0)}</td></tr>`;
resultsBody.innerHTML += row;
}
}
</script>
Kod po stronie serwera
Informacja
Aplikacja nie korzysta z kodu po stronie serwera.