Rolling shapes race calculator
The rolling shapes race calculator predicts which rigid bodies reach the bottom of the same incline first when they roll without slipping.
Run — free
Enter the slope angle and each shape’s dimensionless inertia factor, k = I/(mr²). The calculator returns a physically ranked finishing order and the linear acceleration of every racer. It also identifies exact ties, making comparisons among spheres, cylinders, hoops, or custom mass distributions straightforward without requiring mass, radius, or ramp length.
Set up a fair rolling race
A useful comparison starts by placing every shape on the same straight incline and assuming pure rolling without slipping. Enter the ramp angle measured upward from the horizontal, then add one row for each racer. Each row needs a unique name and an inertia factor k, defined as the moment of inertia about the rolling axis divided by mass times radius squared: k = I/(mr²). Familiar ideal bodies have convenient factors: a solid sphere has 2/5, a solid cylinder or disc has 1/2, and a thin hoop has 1. The calculator does not need the individual masses or radii because they cancel from the ideal rolling equation. Gravity defaults to standard Earth gravity, but it can be changed for a classroom thought experiment or another world. All racers must experience the same gravity and slope. Surface losses, air resistance, deformation, axle friction, and a push at release are outside this ideal model, so use consistent experimental conditions when comparing the prediction with a physical race.
Understand acceleration and finishing order
For a body rolling without slipping, gravitational potential energy is divided between translation of the centre of mass and rotation about that centre. The calculator applies a = g sin(θ)/(1 + k), where g is gravitational acceleration, θ is the incline angle, and k is the inertia factor. A smaller k leaves a larger share of the available energy in translational motion, producing greater linear acceleration. That is why an ideal solid sphere outruns a solid cylinder, which in turn outruns a thin hoop on the same ramp. The results are sorted from greatest acceleration to least acceleration. Equal inertia factors receive the same rank and are marked as tied because the ideal equation predicts identical acceleration; input order is retained only to keep the returned JSON deterministic. At zero degrees every acceleration is zero, so differing factors cannot create motion on a flat surface. The displayed acceleration is rounded to nine decimal places, while ranking uses the original inertia factors rather than rounded output values.
Use the result responsibly
The ranked list answers an ideal mechanics question, not every detail of a laboratory race. If racers begin from rest at the same location and travel the same distance with constant acceleration, the acceleration order is also the finishing order. Ramp length is therefore unnecessary for ranking, although it would be needed to calculate arrival times. Real objects may disagree with the prediction when they slip, wobble, bounce, encounter rolling resistance, or have dimensions that make air drag important. Before applying a tabulated inertia factor, confirm that the rotation axis and mass model match the object: a thick-walled cylinder, for example, is not the same as a thin hoop. A custom factor can represent any rigid axisymmetric body when its moment of inertia, mass, and rolling radius are known. For automated work, the API costs $0.002 per request. The same deterministic solver can also be used in the browser for quick demonstrations, homework checks, experiment planning, and comparisons of theoretical mass distributions.
What you can do with it
Plan a classroom demonstration
Predict the order of a sphere, cylinder, and hoop before releasing physical models together on one ramp.
Check mechanics homework
Verify accelerations from dimensionless inertia factors and see how rotational inertia changes translational motion.
Compare custom mass distributions
Rank designed wheels or axisymmetric bodies after calculating each object’s moment-of-inertia factor.
FAQ
Which rolling shape finishes first?
Under the stated assumptions, the shape with the smallest inertia factor finishes first because it has the greatest linear acceleration.
Why are mass and radius not inputs?
They cancel after moment of inertia is expressed as I = kmr², leaving acceleration dependent on gravity, slope angle, and k.
What happens when two shapes have the same inertia factor?
They receive the same rank and are marked as tied because ideal rolling predicts the same acceleration.
Does the calculator account for slipping?
No. It assumes sufficient static friction for rolling without slipping and does not model energy loss or rolling resistance.
Can I use a custom value of gravity?
Yes. Supply any finite positive gravitational acceleration in metres per second squared; standard Earth gravity is the default.
How much does the API request cost?
Each API request costs $0.002. The browser calculator is available for interactive calculations.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/mech/rolling-race \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"angle_degrees":30,"shapes":[{"name":"Solid sphere","inertia_factor":0.4},{"name":"Solid cylinder","inertia_factor":0.5},{"name":"Thin hoop","inertia_factor":1}]}'const res = await fetch("https://api.kit.forhosting.com/mech/rolling-race", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"angle_degrees": 30,
"shapes": [
{
"name": "Solid sphere",
"inertia_factor": 0.4
},
{
"name": "Solid cylinder",
"inertia_factor": 0.5
},
{
"name": "Thin hoop",
"inertia_factor": 1
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/mech/rolling-race",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"angle_degrees": 30,
"shapes": [
{
"name": "Solid sphere",
"inertia_factor": 0.4
},
{
"name": "Solid cylinder",
"inertia_factor": 0.5
},
{
"name": "Thin hoop",
"inertia_factor": 1
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/mech/rolling-race", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"angle_degrees":30,"shapes":[{"name":"Solid sphere","inertia_factor":0.4},{"name":"Solid cylinder","inertia_factor":0.5},{"name":"Thin hoop","inertia_factor":1}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"angle_degrees":30,"shapes":[{"name":"Solid sphere","inertia_factor":0.4},{"name":"Solid cylinder","inertia_factor":0.5},{"name":"Thin hoop","inertia_factor":1}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/mech/rolling-race", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"angle_degrees": 30,
"shapes": [
{
"name": "Solid sphere",
"inertia_factor": 0.4
},
{
"name": "Solid cylinder",
"inertia_factor": 0.5
},
{
"name": "Thin hoop",
"inertia_factor": 1
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "mech.rolling_race",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_shapes | 100 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |