Przejdź do głównej treści

Kalkulator dystansu rowerowego

Grafika SVG Rower

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.

Jak korzystać z kalkulatora?
  1. Wybierz typ roweru z listy.
  2. Określ szerokość opon.
  3. Zaznacz, czy rower ma przerzutki, czy piastę planetarną.
  4. Podaj rodzaj terenu, po którym planujesz jazdę.
  5. Wpisz czas jazdy w godzinach.
  6. 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.

Tagi

JavaScript

Dziękujemy!
()

Informacja o cookies

Moja strona internetowa wykorzystuje wyłącznie niezbędne pliki cookies, które są wymagane do jej prawidłowego działania. Nie używam ciasteczek w celach marketingowych ani analitycznych. Korzystając z mojej strony, wyrażasz zgodę na stosowanie tych plików. Możesz dowiedzieć się więcej w mojej polityce prywatności.