@jjlmoya/utils-motor 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/index.ts +3 -1
- package/src/entries.ts +7 -1
- package/src/index.ts +10 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/seo_translation_completeness.test.ts +69 -0
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/carMotorcycleGearRatioCalculator/bibliography.astro +6 -0
- package/src/tool/carMotorcycleGearRatioCalculator/bibliography.ts +12 -0
- package/src/tool/carMotorcycleGearRatioCalculator/car-motorcycle-gear-ratio-rpm-speed-calculator.css +668 -0
- package/src/tool/carMotorcycleGearRatioCalculator/component.astro +137 -0
- package/src/tool/carMotorcycleGearRatioCalculator/controller.ts +209 -0
- package/src/tool/carMotorcycleGearRatioCalculator/dom-views.ts +121 -0
- package/src/tool/carMotorcycleGearRatioCalculator/entry.ts +30 -0
- package/src/tool/carMotorcycleGearRatioCalculator/evaluator.ts +28 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/de.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/en.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/es.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/fr.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/id.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/it.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/ja.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/ko.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/nl.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/pl.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/pt.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/ru.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/sv.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/tr.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/i18n/zh.ts +162 -0
- package/src/tool/carMotorcycleGearRatioCalculator/index.ts +10 -0
- package/src/tool/carMotorcycleGearRatioCalculator/logic.test.ts +51 -0
- package/src/tool/carMotorcycleGearRatioCalculator/logic.ts +91 -0
- package/src/tool/carMotorcycleGearRatioCalculator/seo.astro +15 -0
- package/src/tool/carMotorcycleGearRatioCalculator/storage.ts +46 -0
- package/src/tool/carMotorcycleGearRatioCalculator/ui.ts +50 -0
- package/src/tool/tirePressureConverter/bibliography.astro +6 -0
- package/src/tool/tirePressureConverter/bibliography.ts +12 -0
- package/src/tool/tirePressureConverter/component.astro +82 -0
- package/src/tool/tirePressureConverter/controller.ts +120 -0
- package/src/tool/tirePressureConverter/dom-views.ts +31 -0
- package/src/tool/tirePressureConverter/entry.ts +30 -0
- package/src/tool/tirePressureConverter/evaluator.ts +8 -0
- package/src/tool/tirePressureConverter/i18n/de.ts +96 -0
- package/src/tool/tirePressureConverter/i18n/en.ts +96 -0
- package/src/tool/tirePressureConverter/i18n/es.ts +96 -0
- package/src/tool/tirePressureConverter/i18n/fr.ts +96 -0
- package/src/tool/tirePressureConverter/i18n/id.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/it.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/ja.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/ko.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/nl.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/pl.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/pt.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/ru.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/sv.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/tr.ts +95 -0
- package/src/tool/tirePressureConverter/i18n/zh.ts +95 -0
- package/src/tool/tirePressureConverter/index.ts +10 -0
- package/src/tool/tirePressureConverter/logic.test.ts +37 -0
- package/src/tool/tirePressureConverter/logic.ts +47 -0
- package/src/tool/tirePressureConverter/seo.astro +15 -0
- package/src/tool/tirePressureConverter/storage.ts +27 -0
- package/src/tool/tirePressureConverter/tire-pressure-converter-psi-bar-kpa-kgf-cm2.css +293 -0
- package/src/tool/tirePressureConverter/ui.ts +20 -0
- package/src/tools.ts +3 -1
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import { bibliographyEntries } from '../bibliography';
|
|
4
|
+
import type { CarMotorcycleGearRatioCalculatorUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const slug = 'utvexling-varvtal-hastighet-kalkylator-bil-motorcykel';
|
|
7
|
+
const title = 'Utväxling Varvtal och Hastighet Kalkylator för Bil och MC';
|
|
8
|
+
const description = 'Beräkna teoretisk hastighet per växel utifrån motorvarvtal, primärutväxling, slutväxel och hjuldiameter.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Hur beräknas hastighet från en utväxling?',
|
|
13
|
+
answer: 'Kalkylatorn dividerar motorvarvtalet (RPM) med primärutväxling, vald växel och slutväxel för att få hjulets varvtal. Det multipliceras sedan med hjulets omkrets och omvandlas till km/h eller mph.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Vad är skillnaden mellan en växlingsutväxling och den totala utväxlingen?',
|
|
17
|
+
answer: 'Växelns utväxling beskriver ett enskilt kugghjul i växellådan. Den totala utväxlingen (overall ratio) kombinerar primärväxel, vald växel och slutväxel.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Varför ger ett lägre siffervärde högre hastighet?',
|
|
21
|
+
answer: 'Ett lägre siffervärde kräver färre motorvarv per hjulvarv. Vid samma motorvarvtal snurrar hjulet snabbare.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Visar denna kalkylator den exakta hastigheten på vägen?',
|
|
25
|
+
answer: 'Nej. Det är en teoretisk beräkning. Däckexpansion i hög fart, kopplingsslir och luftmotstånd påverkar den verkliga hastigheten.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const howToData = [
|
|
30
|
+
{
|
|
31
|
+
name: 'Välj fordonsprofil',
|
|
32
|
+
text: 'Välj förinställningen för bil eller motorcykel och anpassa värdena efter ditt fordon.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'Ställ in drivlinans värden',
|
|
36
|
+
text: 'Ange motorvarvtal, maxvarvtal (redline), primärutväxling, slutväxel och hjuldiameter.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Mata in växellägesutväxlingar',
|
|
40
|
+
text: 'Fyll i värdena för varje växel från ettans växel upp till högsta växel.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Läs av hastighetstabellen',
|
|
44
|
+
text: 'Jämför teoretisk hastighet och motorvarvtal vid din målhastighet för varje växel.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowTo> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, index) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: index + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilitiesApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'sv',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const content: ToolLocaleContent<CarMotorcycleGearRatioCalculatorUI> = {
|
|
83
|
+
slug,
|
|
84
|
+
title,
|
|
85
|
+
description,
|
|
86
|
+
ui: {
|
|
87
|
+
unitsLabel: 'Enheter',
|
|
88
|
+
metricLabel: 'Metrisk',
|
|
89
|
+
imperialLabel: 'Imperial',
|
|
90
|
+
vehicleProfileLabel: 'Fordonsprofil',
|
|
91
|
+
carLabel: 'Bil',
|
|
92
|
+
motorcycleLabel: 'Motorcykel',
|
|
93
|
+
carPresetLabel: 'Bil profil',
|
|
94
|
+
motorcyclePresetLabel: 'MC profil',
|
|
95
|
+
engineRpmLabel: 'Motorvarvtal (RPM)',
|
|
96
|
+
redlineLabel: 'Maxvarvtal (Redline)',
|
|
97
|
+
primaryRatioLabel: 'Primärutväxling',
|
|
98
|
+
finalDriveLabel: 'Slutväxel (Slututväxling)',
|
|
99
|
+
wheelDiameterLabel: 'Hjuldiameter',
|
|
100
|
+
targetSpeedLabel: 'Målhastighet',
|
|
101
|
+
gearStackLabel: 'Växellådans utväxlingar',
|
|
102
|
+
gearRatioHint: 'Ange siffervärden som 3.20:1',
|
|
103
|
+
gearLabel: 'Växel',
|
|
104
|
+
transmissionSceneLabel: 'Drivlinans hastighetstrappa',
|
|
105
|
+
motionHintLabel: 'Dynamisk drivlinemodell',
|
|
106
|
+
motionHintText: 'Live: ändra varvtal eller utväxlingar och se reaktionen direkt.',
|
|
107
|
+
engineLabel: 'Motor',
|
|
108
|
+
gearboxLabel: 'Växellåda',
|
|
109
|
+
finalDriveShortLabel: 'Slutväxel',
|
|
110
|
+
wheelLabel: 'Hjul',
|
|
111
|
+
speedAtRpmLabel: 'Hastighet vid angivet varvtal',
|
|
112
|
+
rpmAtTargetLabel: 'vid målhastighet',
|
|
113
|
+
overallRatioLabel: 'total utväxling',
|
|
114
|
+
wheelRpmLabel: 'hjulvarvtal (RPM)',
|
|
115
|
+
targetSpeedMarkerLabel: 'mål',
|
|
116
|
+
selectedGearLabel: 'Rekommenderad växel',
|
|
117
|
+
decisionLabel: 'Tolkning av resultatet',
|
|
118
|
+
decisionSpeedLabel: 'Teoretisk hastighet vid angivet varvtal',
|
|
119
|
+
decisionCruiseLabel: 'Motorvarvtal vid målhastighet',
|
|
120
|
+
decisionHelper: 'Jämför marschvarvtalet innan du ändrar en utväxling eller slutväxel.',
|
|
121
|
+
chooseGearHint: 'Markerad rad uppnår målhastigheten utan att överskrida maxvarvtalet.',
|
|
122
|
+
editInputsHint: 'Se teoretisk hastighet på varje växel och jämför olika uppsättningar.',
|
|
123
|
+
calculationStatusLabel: 'Beräkningsstatus',
|
|
124
|
+
readyMessage: 'Lämplig utväxling',
|
|
125
|
+
highRpmMessage: 'Över maxvarvtal',
|
|
126
|
+
lowRpmMessage: 'Lågt varvtal',
|
|
127
|
+
invalidMessage: 'Kontrollera indata',
|
|
128
|
+
resetLabel: 'Återställ bil profil',
|
|
129
|
+
educationalNotice: 'Teoretisk beräkning. Jämför med tillverkarens specifikationer innan du ändrar ett riktigt fordon.',
|
|
130
|
+
ratioUnit: ':1',
|
|
131
|
+
speedUnitMetric: 'km/h',
|
|
132
|
+
speedUnitImperial: 'mph',
|
|
133
|
+
wheelUnitMetric: 'mm',
|
|
134
|
+
wheelUnitImperial: 'in',
|
|
135
|
+
},
|
|
136
|
+
faq: faqData,
|
|
137
|
+
howTo: howToData,
|
|
138
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
139
|
+
bibliography: bibliographyEntries,
|
|
140
|
+
seo: [
|
|
141
|
+
{ type: 'title', text: 'Hur drivlinan omvandlar motorvarv till faktisk körhastighet', level: 2 },
|
|
142
|
+
{ type: 'paragraph', html: 'Motorvarvtalet överförs inte direkt till vägbanan. Primärutväxling, den valda växeln i växellådan och slutväxeln (differentialen) minskar rotationshastigheten innan kraften når hjulen. Däckets effektiva rullomkrets omvandlar därefter denna rotation till teoretisk körhastighet på vägen.' },
|
|
143
|
+
{ type: 'stats', columns: 3, items: [
|
|
144
|
+
{ value: '3 utväxlingar', label: 'Primär, växel och slutväxel' },
|
|
145
|
+
{ value: '6 växlar', label: 'Redigerbar växelutväxling' },
|
|
146
|
+
{ value: '2 system', label: 'Metrisk och Imperial' },
|
|
147
|
+
] },
|
|
148
|
+
{ type: 'title', text: 'Den matematiska formeln bakom beräkningen', level: 2 },
|
|
149
|
+
{ type: 'paragraph', html: 'Den totala utväxlingen är produkten av primärutväxling, vald växelutväxling och slutväxel. Hjulvarvtalet i varv per minut beräknas genom att dividera motorvarvtalet med den totala utväxlingen. Slutligen multipliceras hjulvarvtalet med hjulets omkrets för att beräkna hastigheten i km/h.' },
|
|
150
|
+
{ type: 'table', headers: ['Indataparameter', 'Påverkan på beräkningen', 'Praktisk tolkning'], rows: [
|
|
151
|
+
['Motorvarvtal (RPM)', 'Påverkar alla växlar', 'Ett högre motorvarvtal ger en proportionellt högre teoretisk hastighet'],
|
|
152
|
+
['Växelutväxling', 'Påverkar enskild växel', 'Ett högre siffervärde innebär mer nedväxling och lägre hastighet per varvtal'],
|
|
153
|
+
['Slutväxel (Slututväxling)', 'Påverkar hela drivlinan', 'En kortare slutväxel sänker topphastigheten på samtliga växlar'],
|
|
154
|
+
['Hjuldiameter', 'Påverkar hela drivlinan', 'En större däckomkrets rullar en längre sträcka för varje hjulvarv'],
|
|
155
|
+
] },
|
|
156
|
+
{ type: 'title', text: 'Så läser och analyserar du hastighetstabellen', level: 2 },
|
|
157
|
+
{ type: 'paragraph', html: 'Kolumnen för hastighet visar den teoretiska farten i kilometer i timmen vid angivet motorvarvtal. Kolumnen för RPM visar det motorvarvtal som krävs för att hålla en specifik målhastighet. Använd båda vinklarna för att jämföra stegningen mellan växlarna.' },
|
|
158
|
+
{ type: 'tip', title: 'Använd däckets reella rullomkrets', html: 'Däckets angivna dimensionsmått är endast ungefärliga. Lufttryck, fordonsbelastning och däckets expansion i hög fart ändrar den effektiva rullradien. Mät den faktiska rullomkretsen för mest exakta beräkningar.' },
|
|
159
|
+
{ type: 'title', text: 'Samma fysikaliska principer för bilar och motorcyklar', level: 2 },
|
|
160
|
+
{ type: 'paragraph', html: 'Förhållandet mellan utväxlingsförhållanden, motorvarvtal och hjuldiameter bygger på exakt samma fysikaliska lagar för både personbilar och motorcyklar. Förinställda profiler ger en utmärkt utgångspunkt för att jämföra olika drivlinekonfigurationer.' },
|
|
161
|
+
],
|
|
162
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import { bibliographyEntries } from '../bibliography';
|
|
4
|
+
import type { CarMotorcycleGearRatioCalculatorUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const slug = 'araba-motosiklet-vites-orani-devir-hiz-hesaplayici';
|
|
7
|
+
const title = 'Araba ve Motosiklet Vites Oranı Devir ve Hız Hesaplayıcı';
|
|
8
|
+
const description = 'Motor devri, birincil oran, son dişli oranı ve tekerlek çapından vites başına teorik hızı hesaplayın.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Vites oranından hız nasıl hesaplanır?',
|
|
13
|
+
answer: 'Hesaplayıcı motor devrini (RPM) birincil orana, seçilen vites oranına ve son dişli oranına bölerek tekerlek devrini bulur. Bu değeri tekerlek çevresiyle çarparak km/saat veya mph değerine dönüştürür.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Vites oranı ile toplam oran arasındaki fark nedir?',
|
|
17
|
+
answer: 'Vites oranı şanzümandaki tek bir dişlinin oranını tanımlar. Toplam oran (overall ratio) ise birincil aktarmayı, vitesi ve son dişli oranını birleştirerek motor ile tekerlek arasındaki toplam indirgemeyi ifade eder.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Neden sayısal olarak daha küçük bir vites oranı daha fazla hız üretir?',
|
|
21
|
+
answer: 'Sayısal olarak daha küçük bir oranı, bir tekerlek turu için daha az motor turu gerektirir. Aynı motor devrinde tekerlek daha hızlı döner.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Bu hesaplayıcı yoldaki gerçek hızı tam olarak tahmin eder mi?',
|
|
25
|
+
answer: 'Hayır. Bu teorik bir kinematik tahmindir. Yüksek hızda lastik genleşmesi, debriyaj kayması, hava direnci ve gösterge sapmaları gerçek hızı etkiler.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const howToData = [
|
|
30
|
+
{
|
|
31
|
+
name: 'Araç profilini seçin',
|
|
32
|
+
text: 'Araba veya motosiklet hazır ayarını seçin ve değerleri kendi aracınıza göre düzenleyin.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'Aktarma organı girdilerini girin',
|
|
36
|
+
text: 'Motor devrini, maksimum devri (redline), birincil oranı, son dişli oranını ve tekerlek çapını girin.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Vites oranlarını girin',
|
|
40
|
+
text: 'Birinci vitesten en yüksek vitese kadar sayısal oranları yazın.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Hız tablosunu inceleyin',
|
|
44
|
+
text: 'Her vites için teorik hızı ve hedef hızdaki motor devrini karşılaştırın.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowTo> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, index) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: index + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilitiesApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'tr',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const content: ToolLocaleContent<CarMotorcycleGearRatioCalculatorUI> = {
|
|
83
|
+
slug,
|
|
84
|
+
title,
|
|
85
|
+
description,
|
|
86
|
+
ui: {
|
|
87
|
+
unitsLabel: 'Birimler',
|
|
88
|
+
metricLabel: 'Metrik',
|
|
89
|
+
imperialLabel: 'İngiliz (Imperial)',
|
|
90
|
+
vehicleProfileLabel: 'Araç profili',
|
|
91
|
+
carLabel: 'Araba',
|
|
92
|
+
motorcycleLabel: 'Motosiklet',
|
|
93
|
+
carPresetLabel: 'Araba profili',
|
|
94
|
+
motorcyclePresetLabel: 'Motosiklet profili',
|
|
95
|
+
engineRpmLabel: 'Motor devri (RPM)',
|
|
96
|
+
redlineLabel: 'Maksimum devir (Redline)',
|
|
97
|
+
primaryRatioLabel: 'Birincil oran',
|
|
98
|
+
finalDriveLabel: 'Son dişli oranı (Ayna mahruti)',
|
|
99
|
+
wheelDiameterLabel: 'Tekerlek çapı',
|
|
100
|
+
targetSpeedLabel: 'Hedef hız',
|
|
101
|
+
gearStackLabel: 'Şanzıman vites oranları',
|
|
102
|
+
gearRatioHint: '3.20 gibi sayısal oranlar girin',
|
|
103
|
+
gearLabel: 'Vites',
|
|
104
|
+
transmissionSceneLabel: 'Aktarma organı hız merdiveni',
|
|
105
|
+
motionHintLabel: 'Dinamik aktarma modeli',
|
|
106
|
+
motionHintText: 'Canlı: devri veya oranları değiştirin ve sistemin tepkisini gözlemleyin.',
|
|
107
|
+
engineLabel: 'Motor',
|
|
108
|
+
gearboxLabel: 'Şanzıman',
|
|
109
|
+
finalDriveShortLabel: 'Son dişli',
|
|
110
|
+
wheelLabel: 'Tekerlek',
|
|
111
|
+
speedAtRpmLabel: 'Girilen devirdeki hız',
|
|
112
|
+
rpmAtTargetLabel: 'hedef hızdaki devir',
|
|
113
|
+
overallRatioLabel: 'toplam oran',
|
|
114
|
+
wheelRpmLabel: 'tekerlek devri (RPM)',
|
|
115
|
+
targetSpeedMarkerLabel: 'hedef',
|
|
116
|
+
selectedGearLabel: 'Önerilen vites',
|
|
117
|
+
decisionLabel: 'Sonuçların yorumlanması',
|
|
118
|
+
decisionSpeedLabel: 'Girilen devirdeki teorik hız',
|
|
119
|
+
decisionCruiseLabel: 'Hedef hızdaki motor devri',
|
|
120
|
+
decisionHelper: 'Bir vitesi veya son dişliyi değiştirmeden önce seyir devrini karşılaştırın.',
|
|
121
|
+
chooseGearHint: 'Vurgulanan satır, maksimum devri aşmadan hedef hıza ulaşan vitesi gösterir.',
|
|
122
|
+
editInputsHint: 'Her vitesteki teorik hızı görün ve farklı ayarları karşılaştırın.',
|
|
123
|
+
calculationStatusLabel: 'Hesaplama durumu',
|
|
124
|
+
readyMessage: 'Uygun oran',
|
|
125
|
+
highRpmMessage: 'Maksimum devir üstünde',
|
|
126
|
+
lowRpmMessage: 'Düşük devir',
|
|
127
|
+
invalidMessage: 'Girdileri kontrol edin',
|
|
128
|
+
resetLabel: 'Araba profilini sıfırla',
|
|
129
|
+
educationalNotice: 'Teorik tahmindir. Gerçek bir araçta değişiklik yapmadan önce üretici verilerine başvurun.',
|
|
130
|
+
ratioUnit: ':1',
|
|
131
|
+
speedUnitMetric: 'km/saat',
|
|
132
|
+
speedUnitImperial: 'mph',
|
|
133
|
+
wheelUnitMetric: 'mm',
|
|
134
|
+
wheelUnitImperial: 'inç',
|
|
135
|
+
},
|
|
136
|
+
faq: faqData,
|
|
137
|
+
howTo: howToData,
|
|
138
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
139
|
+
bibliography: bibliographyEntries,
|
|
140
|
+
seo: [
|
|
141
|
+
{ type: 'title', text: 'Aktarma organları motor devrini yoldaki hıza nasıl dönüştürür', level: 2 },
|
|
142
|
+
{ type: 'paragraph', html: 'Aktarma organı motorun dönme devrini doğrudan yola iletmez. Birincil aktarma indirgemesi, şanzımandaki seçilen vites oranı ve son dişli oranı (ayna mahruti) dönme hızını kademeli olarak düşürür. Lastiğin etkili yuvarlanma çevresi ise bu dönme hareketini araç için teorik yol hızına dönüştürür.' },
|
|
143
|
+
{ type: 'stats', columns: 3, items: [
|
|
144
|
+
{ value: '3 aktarma', label: 'Birincil, vites ve son dişli' },
|
|
145
|
+
{ value: '6 vites', label: 'Düzenlenebilir vites merdiveni' },
|
|
146
|
+
{ value: '2 sistem', label: 'Metrik ve İngiliz (Imperial)' },
|
|
147
|
+
] },
|
|
148
|
+
{ type: 'title', text: 'Hesaplamanın arkasındaki matematiksel formül', level: 2 },
|
|
149
|
+
{ type: 'paragraph', html: 'Toplam oran (overall ratio), birincil oran, seçilen vites oranı ve son dişli oranının çarpımı ile elde edilir. Dakikadaki tekerlek devri (wheel RPM), motor devrinin toplam orana bölünmesiyle hesaplanır. Son olarak teorik hız, tekerlek devri ile lastik çevresinin çarpılmasıyla elde edilir.' },
|
|
150
|
+
{ type: 'table', headers: ['Girdi Parametresi', 'Hesaplamaya Etkisi', 'Pratik Yorumlama'], rows: [
|
|
151
|
+
['Motor devri (RPM)', 'Tüm vitesleri etkiler', 'Daha yüksek motor devri orantılı olarak daha fazla teorik hız üretir'],
|
|
152
|
+
['Vites oranı', 'Tek bir vitesi etkiler', 'Daha yüksek sayısal oran daha fazla tork ancak daha düşük hız demektir'],
|
|
153
|
+
['Son dişli oranı (Ayna mahruti)', 'Tüm şanzımanı etkiler', 'Daha kısa son dişli oranı tüm viteslerde maksimum hızı düşürür'],
|
|
154
|
+
['Tekerlek çapı', 'Tüm şanzımanı etkiler', 'Daha büyük lastik çevresi her tekerlek turunda daha fazla yol kateder'],
|
|
155
|
+
] },
|
|
156
|
+
{ type: 'title', text: 'Hız merdiveni tablosunu okuma ve analiz etme', level: 2 },
|
|
157
|
+
{ type: 'paragraph', html: 'Hız sütunu, girilen motor devrinde aracın kilometre/saat cinsinden yapacağı teorik hızı gösterir. Devir sütunu ise belirli bir hedef seyir hızını korumak için gereken motor devrini gösterir. Her iki bakış açısını da vites aralıklarını değerlendirmek için kullanabilirsiniz.' },
|
|
158
|
+
{ type: 'tip', title: 'Lastiğin gerçek yuvarlanma çevresini kullanın', html: 'Üretici tarafından belirtilen nominal lastik boyutları yalnızca bir yaklaşımdır. Lastik hava basıncı, araç yükü ve yüksek hızdaki merkezkaç genleşmesi etkili yuvarlanma yarıçapını değiştirir. En hassas hesaplama için gerçek çevreyi ölçün.' },
|
|
159
|
+
{ type: 'title', text: 'Araba ve motosiklet için aynı fizik ilkeleri', level: 2 },
|
|
160
|
+
{ type: 'paragraph', html: 'Dişli oranları, motor devri ve tekerlek çapı arasındaki matematiksel ilişki hem binek otomobiller hem de motosikletler için tamamen aynı fizik yasalarına dayanır. Hazır profiller farklı şanzıman konfigürasyonlarını karşılaştırmak için mükemmel bir başlangıç sunar.' },
|
|
161
|
+
],
|
|
162
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import { bibliographyEntries } from '../bibliography';
|
|
4
|
+
import type { CarMotorcycleGearRatioCalculatorUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const slug = 'car-motorcycle-gear-ratio-rpm-speed-calculator';
|
|
7
|
+
const title = '汽车与摩托车齿轮比转速最高车速计算器';
|
|
8
|
+
const description = '根据发动机转速、一次减速比、终传比(主减速比)、各档齿轮比及轮胎直径,精准计算汽车与摩托车的各档理论最高车速。';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '如何根据齿轮比计算车速?',
|
|
13
|
+
answer: '计算器将发动机转速 (RPM) 除以一次减速比、所选档位齿轮比和终传比,得出车轮转速,再乘以轮胎周长并换算为 km/h 或 mph。',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: '档位齿轮比与总减速比有什么区别?',
|
|
17
|
+
answer: '档位齿轮比仅指变速箱内某一档位的齿轮传动比。总减速比 (overall ratio) 则包含了初级减速、档位齿轮比及终传比,代表发动机到车轮的总减速倍数。',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: '为什么数值较小的齿轮比能产生更高的车速?',
|
|
21
|
+
answer: '数值较小的档位(高档位/小传动比)在车轮旋转一周时所需的发动机转数更少。在相同发动机转速下,车轮旋转更快,从而产生更高的理论车速。',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: '本计算器能精准预测道路实际车速吗?',
|
|
25
|
+
answer: '不能。这是理论运动学推算。高速下的轮胎离心膨胀、离合器或液力变矩器滑移、风阻、传动损耗及车速表误差都会使实际车速有所偏离。',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const howToData = [
|
|
30
|
+
{
|
|
31
|
+
name: '选择车辆预设',
|
|
32
|
+
text: '选择汽车或摩托车预设载入参考数值,然后根据您的实际车型参数进行修改。',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: '设置传动系统输入',
|
|
36
|
+
text: '输入发动机转速、红线转速 (redline)、初级减速比、终传比及轮胎直径。',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: '输入各档齿轮比',
|
|
40
|
+
text: '依次输入从一档到最高档的数值比(如 3.20)。',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: '查看车速梯形图',
|
|
44
|
+
text: '对比各档位在指定转速下的理论车速,以及在目标巡航车速下所需的发动机转速。',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowTo> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, index) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: index + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilitiesApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
79
|
+
inLanguage: 'zh',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const content: ToolLocaleContent<CarMotorcycleGearRatioCalculatorUI> = {
|
|
83
|
+
slug,
|
|
84
|
+
title,
|
|
85
|
+
description,
|
|
86
|
+
ui: {
|
|
87
|
+
unitsLabel: '单位',
|
|
88
|
+
metricLabel: '公制 (km/h)',
|
|
89
|
+
imperialLabel: '英制 (mph)',
|
|
90
|
+
vehicleProfileLabel: '车辆类型',
|
|
91
|
+
carLabel: '汽车',
|
|
92
|
+
motorcycleLabel: '摩托车',
|
|
93
|
+
carPresetLabel: '汽车预设',
|
|
94
|
+
motorcyclePresetLabel: '摩托车预设',
|
|
95
|
+
engineRpmLabel: '发动机转速 (RPM)',
|
|
96
|
+
redlineLabel: '极限转速 (Redline)',
|
|
97
|
+
primaryRatioLabel: '初级减速比',
|
|
98
|
+
finalDriveLabel: '终传比 (主减速比)',
|
|
99
|
+
wheelDiameterLabel: '轮胎外径',
|
|
100
|
+
targetSpeedLabel: '目标巡航车速',
|
|
101
|
+
gearStackLabel: '变速箱各档齿轮比',
|
|
102
|
+
gearRatioHint: '输入如 3.20 的数值比',
|
|
103
|
+
gearLabel: '档',
|
|
104
|
+
transmissionSceneLabel: '传动车速梯形图',
|
|
105
|
+
motionHintLabel: '实时动态传动模型',
|
|
106
|
+
motionHintText: '实时: 修改转速或传动比可即时观察传动模型响应。',
|
|
107
|
+
engineLabel: '发动机',
|
|
108
|
+
gearboxLabel: '变速箱',
|
|
109
|
+
finalDriveShortLabel: '主减速器',
|
|
110
|
+
wheelLabel: '车轮',
|
|
111
|
+
speedAtRpmLabel: '指定转速下的理论车速',
|
|
112
|
+
rpmAtTargetLabel: '目标车速下的发动机转速',
|
|
113
|
+
overallRatioLabel: '总减速比',
|
|
114
|
+
wheelRpmLabel: '车轮转速 (RPM)',
|
|
115
|
+
targetSpeedMarkerLabel: '目标',
|
|
116
|
+
selectedGearLabel: '推荐最佳档位',
|
|
117
|
+
decisionLabel: '计算结果要点',
|
|
118
|
+
decisionSpeedLabel: '指定转速下的理论车速',
|
|
119
|
+
decisionCruiseLabel: '目标车速下的巡航转速',
|
|
120
|
+
decisionHelper: '在更换齿轮或尾牙前对比巡航转速变化。',
|
|
121
|
+
chooseGearHint: '高亮行表示未超出红线转速且能满足目标车速的档位。',
|
|
122
|
+
editInputsHint: '一目了然查看各档位车速及巡航转速,方便对比改装方案。',
|
|
123
|
+
calculationStatusLabel: '计算状态',
|
|
124
|
+
readyMessage: '传动匹配良好',
|
|
125
|
+
highRpmMessage: '超出红线转速',
|
|
126
|
+
lowRpmMessage: '转速偏低',
|
|
127
|
+
invalidMessage: '请检查输入参数',
|
|
128
|
+
resetLabel: '重置为汽车预设',
|
|
129
|
+
educationalNotice: '理论估算结果。在改装实际车辆前,请参阅官方技术手册。',
|
|
130
|
+
ratioUnit: ':1',
|
|
131
|
+
speedUnitMetric: 'km/h',
|
|
132
|
+
speedUnitImperial: 'mph',
|
|
133
|
+
wheelUnitMetric: 'mm',
|
|
134
|
+
wheelUnitImperial: 'in',
|
|
135
|
+
},
|
|
136
|
+
faq: faqData,
|
|
137
|
+
howTo: howToData,
|
|
138
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
139
|
+
bibliography: bibliographyEntries,
|
|
140
|
+
seo: [
|
|
141
|
+
{ type: 'title', text: '传动系统如何将发动机转速转化为道路行驶车速', level: 2 },
|
|
142
|
+
{ type: 'paragraph', html: '发动机曲轴的旋转转速并不会直接传递到道路地面。动力经过初级减速机构、变速箱内所选档位的齿轮比以及终传比(主减速比/尾牙)的三重减速与扭矩放大后,才传递到车轮驱动轮。轮胎的有效滚动周长随后将车轮的旋转运动转化为车辆在道路上的理论行驶车速。' },
|
|
143
|
+
{ type: 'stats', columns: 3, items: [
|
|
144
|
+
{ value: '3级减速', label: '初级、档位及终传主减速' },
|
|
145
|
+
{ value: '6个档位', label: '可自定义档位堆叠与对比' },
|
|
146
|
+
{ value: '2种单位', label: '支持公制与英制单位切换' },
|
|
147
|
+
] },
|
|
148
|
+
{ type: 'title', text: '齿轮比与车速计算的数学推导公式', level: 2 },
|
|
149
|
+
{ type: 'paragraph', html: '总减速比 (Overall Ratio) 等于初级减速比、所选档位齿轮比与终传比三者的乘积。每分钟车轮转速 (Wheel RPM) 等于发动机转速除以总减速比。最终的理论道路车速则等于车轮转速乘以轮胎周长,并进行公制 (km/h) 或英制 (mph) 的单位换算。' },
|
|
150
|
+
{ type: 'table', headers: ['输入参数', '对计算结果的影响', '实际应用中的解析说明'], rows: [
|
|
151
|
+
['发动机转速 (RPM)', '影响所有档位', '发动机转速越高,在相同齿轮比下的理论最高车速呈正比提升'],
|
|
152
|
+
['档位齿轮比', '仅影响对应档位', '数值越大代表该档位减速倍数越大,扭矩更强但最高车速降低'],
|
|
153
|
+
['终传比 (主减速比/尾牙)', '影响所有档位', '终传比越大(密齿尾牙),全档位加速响应更敏捷但巡航转速偏高'],
|
|
154
|
+
['轮胎外径与周长', '影响所有档位', '轮胎滚动周长越大,车轮每旋转一周在地面上行进的距离越长'],
|
|
155
|
+
] },
|
|
156
|
+
{ type: 'title', text: '如何解读与分析车速梯形图', level: 2 },
|
|
157
|
+
{ type: 'paragraph', html: '车速列直观显示在设定 RPM 下各个档位所能达到的理论最高车速;RPM 列则反向推算在目标巡航车速下,发动机在各个档位所需的转速。结合两个维度的视角,能够清晰评估换档齿比衔接以及巡航经济性。' },
|
|
158
|
+
{ type: 'tip', title: '测量并使用轮胎实际滚动周长', html: '规格标注的轮胎外径与尺寸仅为理论参考值。轮胎气压、车辆实际负载以及高速行驶下的离心膨胀都会改变轮胎的实际动态滚动半径。测量地面实际滚动一周的距离能获得更精确的推算结果。' },
|
|
159
|
+
{ type: 'title', text: '汽车与摩托车通用物理传动规律', level: 2 },
|
|
160
|
+
{ type: 'paragraph', html: '无论是四轮乘用车还是两轮摩托车,传动比、发动机转速与车轮周长之间的物理计算公式完全一致。内置的预设配置文件为对比不同的变速箱与尾牙改装方案提供了可靠的基准参考。' },
|
|
161
|
+
],
|
|
162
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { carMotorcycleGearRatioCalculator } from './entry';
|
|
2
|
+
|
|
3
|
+
export * from './entry';
|
|
4
|
+
|
|
5
|
+
export const CAR_MOTORCYCLE_GEAR_RATIO_CALCULATOR_TOOL = {
|
|
6
|
+
entry: carMotorcycleGearRatioCalculator,
|
|
7
|
+
Component: () => import('./component.astro'),
|
|
8
|
+
SEOComponent: () => import('./seo.astro'),
|
|
9
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
10
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
calculateTransmission,
|
|
4
|
+
convertSpeed,
|
|
5
|
+
convertWheelDiameter,
|
|
6
|
+
rpmForSpeed,
|
|
7
|
+
speedFromRpm,
|
|
8
|
+
speedPerEngineRpm,
|
|
9
|
+
wheelDiameterInMetres,
|
|
10
|
+
type TransmissionInputs,
|
|
11
|
+
} from './logic';
|
|
12
|
+
|
|
13
|
+
const baseInputs: TransmissionInputs = {
|
|
14
|
+
engineRpm: 3000,
|
|
15
|
+
redlineRpm: 7000,
|
|
16
|
+
primaryRatio: 1,
|
|
17
|
+
finalDriveRatio: 4,
|
|
18
|
+
wheelDiameter: 600,
|
|
19
|
+
targetSpeed: 90,
|
|
20
|
+
unitSystem: 'metric',
|
|
21
|
+
gearRatios: [3, 2, 1.4, 1, 0.8],
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
describe('car and motorcycle gear ratio calculations', () => {
|
|
25
|
+
it('converts wheel diameter and speed between unit systems', () => {
|
|
26
|
+
expect(wheelDiameterInMetres(600, 'metric')).toBeCloseTo(0.6);
|
|
27
|
+
expect(convertWheelDiameter(600, 'metric', 'imperial')).toBeCloseTo(23.622);
|
|
28
|
+
expect(convertSpeed(100, 'metric', 'imperial')).toBeCloseTo(62.1371, 3);
|
|
29
|
+
expect(convertSpeed(62.1371, 'imperial', 'metric')).toBeCloseTo(100, 3);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('uses the complete primary, gear and final drive ratio', () => {
|
|
33
|
+
const perRpm = speedPerEngineRpm(baseInputs, 1);
|
|
34
|
+
expect(perRpm).toBeCloseTo(0.0282743, 6);
|
|
35
|
+
expect(speedFromRpm(baseInputs, 1)).toBeCloseTo(84.823, 2);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('inverts speed to engine RPM', () => {
|
|
39
|
+
const speed = speedFromRpm(baseInputs, 1);
|
|
40
|
+
expect(rpmForSpeed({ ...baseInputs, targetSpeed: speed }, 1)).toBeCloseTo(3000, 5);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('returns a result for every gear and selects a usable target gear', () => {
|
|
44
|
+
const result = calculateTransmission(baseInputs);
|
|
45
|
+
expect(result.gears).toHaveLength(5);
|
|
46
|
+
expect(result.gears[0]?.overallRatio).toBe(12);
|
|
47
|
+
expect(result.gears[4]?.overallRatio).toBeCloseTo(3.2);
|
|
48
|
+
expect(result.selectedGear).toBe(5);
|
|
49
|
+
expect(result.maxSpeed).toBeGreaterThan(result.gears[0]?.speed ?? 0);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export type UnitSystem = 'metric' | 'imperial';
|
|
2
|
+
|
|
3
|
+
export interface TransmissionInputs {
|
|
4
|
+
engineRpm: number;
|
|
5
|
+
redlineRpm: number;
|
|
6
|
+
primaryRatio: number;
|
|
7
|
+
finalDriveRatio: number;
|
|
8
|
+
wheelDiameter: number;
|
|
9
|
+
targetSpeed: number;
|
|
10
|
+
unitSystem: UnitSystem;
|
|
11
|
+
gearRatios: number[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface GearResult {
|
|
15
|
+
gear: number;
|
|
16
|
+
gearRatio: number;
|
|
17
|
+
overallRatio: number;
|
|
18
|
+
speed: number;
|
|
19
|
+
rpmAtTarget: number;
|
|
20
|
+
wheelRpm: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface TransmissionResult {
|
|
24
|
+
gears: GearResult[];
|
|
25
|
+
selectedGear: number;
|
|
26
|
+
maxSpeed: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const MPH_PER_METRE_PER_SECOND = 2.2369362921;
|
|
30
|
+
const KPH_PER_METRE_PER_SECOND = 3.6;
|
|
31
|
+
const MILLIMETRES_PER_INCH = 25.4;
|
|
32
|
+
|
|
33
|
+
export function wheelDiameterInMetres(value: number, unitSystem: UnitSystem): number {
|
|
34
|
+
return unitSystem === 'metric' ? value / 1000 : (value * MILLIMETRES_PER_INCH) / 1000;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function convertWheelDiameter(value: number, from: UnitSystem, to: UnitSystem): number {
|
|
38
|
+
if (from === to) return value;
|
|
39
|
+
const millimetres = from === 'metric' ? value : value * MILLIMETRES_PER_INCH;
|
|
40
|
+
return to === 'metric' ? millimetres : millimetres / MILLIMETRES_PER_INCH;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function convertSpeed(value: number, from: UnitSystem, to: UnitSystem): number {
|
|
44
|
+
if (from === to) return value;
|
|
45
|
+
return from === 'metric' ? value / 1.609344 : value * 1.609344;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function speedPerEngineRpm(
|
|
49
|
+
inputs: Pick<TransmissionInputs, 'primaryRatio' | 'finalDriveRatio' | 'wheelDiameter' | 'unitSystem'>,
|
|
50
|
+
gearRatio: number,
|
|
51
|
+
): number {
|
|
52
|
+
const totalRatio = inputs.primaryRatio * gearRatio * inputs.finalDriveRatio;
|
|
53
|
+
const circumference = Math.PI * wheelDiameterInMetres(inputs.wheelDiameter, inputs.unitSystem);
|
|
54
|
+
const metresPerSecond = circumference / totalRatio / 60;
|
|
55
|
+
return metresPerSecond * (inputs.unitSystem === 'metric' ? KPH_PER_METRE_PER_SECOND : MPH_PER_METRE_PER_SECOND);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function speedFromRpm(inputs: TransmissionInputs, gearRatio: number): number {
|
|
59
|
+
return inputs.engineRpm * speedPerEngineRpm(inputs, gearRatio);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function rpmForSpeed(inputs: TransmissionInputs, gearRatio: number): number {
|
|
63
|
+
const speedPerRpm = speedPerEngineRpm(inputs, gearRatio);
|
|
64
|
+
return speedPerRpm > 0 ? inputs.targetSpeed / speedPerRpm : 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function calculateTransmission(inputs: TransmissionInputs): TransmissionResult {
|
|
68
|
+
const gears = inputs.gearRatios.map((gearRatio, index) => {
|
|
69
|
+
const overallRatio = inputs.primaryRatio * gearRatio * inputs.finalDriveRatio;
|
|
70
|
+
const speed = speedFromRpm(inputs, gearRatio);
|
|
71
|
+
return {
|
|
72
|
+
gear: index + 1,
|
|
73
|
+
gearRatio,
|
|
74
|
+
overallRatio,
|
|
75
|
+
speed,
|
|
76
|
+
rpmAtTarget: rpmForSpeed(inputs, gearRatio),
|
|
77
|
+
wheelRpm: inputs.engineRpm / overallRatio,
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
const maxSpeed = Math.max(...gears.map((gear) => gear.speed), 0);
|
|
81
|
+
const selectedGear = findBestTargetGear(gears, inputs.targetSpeed, inputs.redlineRpm);
|
|
82
|
+
return { gears, selectedGear, maxSpeed };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function findBestTargetGear(gears: GearResult[], targetSpeed: number, redlineRpm: number): number {
|
|
86
|
+
const usable = gears.filter((gear) => gear.rpmAtTarget <= redlineRpm);
|
|
87
|
+
if (usable.length === 0) return gears.length > 0 ? (gears[gears.length - 1]?.gear ?? 0) : 0;
|
|
88
|
+
const aboveTarget = usable.filter((gear) => gear.speed >= targetSpeed);
|
|
89
|
+
const candidates = aboveTarget.length > 0 ? aboveTarget : usable;
|
|
90
|
+
return candidates[candidates.length - 1]?.gear ?? 0;
|
|
91
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { carMotorcycleGearRatioCalculator } from './entry';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props;
|
|
11
|
+
const loader = carMotorcycleGearRatioCalculator.i18n[locale] ?? carMotorcycleGearRatioCalculator.i18n.en;
|
|
12
|
+
const content = await loader?.();
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|