@jjlmoya/utils-chrono 1.10.0 → 1.16.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 +8 -0
- package/src/entries.ts +13 -1
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/gear-train-explorer/bibliography.astro +16 -0
- package/src/tool/gear-train-explorer/bibliography.ts +12 -0
- package/src/tool/gear-train-explorer/client.ts +146 -0
- package/src/tool/gear-train-explorer/component.astro +17 -0
- package/src/tool/gear-train-explorer/components/GearPanel.astro +102 -0
- package/src/tool/gear-train-explorer/entry.ts +53 -0
- package/src/tool/gear-train-explorer/gear-train-explorer.css +172 -0
- package/src/tool/gear-train-explorer/gears.ts +148 -0
- package/src/tool/gear-train-explorer/helpers.ts +49 -0
- package/src/tool/gear-train-explorer/i18n/de.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/en.ts +98 -0
- package/src/tool/gear-train-explorer/i18n/es.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/fr.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/id.ts +98 -0
- package/src/tool/gear-train-explorer/i18n/it.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/ja.ts +98 -0
- package/src/tool/gear-train-explorer/i18n/ko.ts +98 -0
- package/src/tool/gear-train-explorer/i18n/nl.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/pl.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/pt.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/ru.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/sv.ts +99 -0
- package/src/tool/gear-train-explorer/i18n/tr.ts +98 -0
- package/src/tool/gear-train-explorer/i18n/zh.ts +98 -0
- package/src/tool/gear-train-explorer/index.ts +11 -0
- package/src/tool/gear-train-explorer/movements.ts +61 -0
- package/src/tool/gear-train-explorer/scene.ts +120 -0
- package/src/tool/gear-train-explorer/seo.astro +16 -0
- package/src/tool/gear-train-explorer/state.ts +30 -0
- package/src/tool/gmt-world-timer/bibliography.astro +11 -0
- package/src/tool/gmt-world-timer/bibliography.ts +7 -0
- package/src/tool/gmt-world-timer/client.ts +250 -0
- package/src/tool/gmt-world-timer/component.astro +13 -0
- package/src/tool/gmt-world-timer/components/GmtPanel.astro +18 -0
- package/src/tool/gmt-world-timer/entry.ts +34 -0
- package/src/tool/gmt-world-timer/gmt-world-timer.css +239 -0
- package/src/tool/gmt-world-timer/helpers.ts +28 -0
- package/src/tool/gmt-world-timer/i18n/de.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/en.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/es.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/fr.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/id.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/it.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/ja.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/ko.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/nl.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/pl.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/pt.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/ru.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/sv.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/tr.ts +72 -0
- package/src/tool/gmt-world-timer/i18n/zh.ts +72 -0
- package/src/tool/gmt-world-timer/index.ts +11 -0
- package/src/tool/gmt-world-timer/seo.astro +11 -0
- package/src/tool/perpetual-calendar/bibliography.astro +16 -0
- package/src/tool/perpetual-calendar/bibliography.ts +16 -0
- package/src/tool/perpetual-calendar/calendar.ts +24 -0
- package/src/tool/perpetual-calendar/client.ts +98 -0
- package/src/tool/perpetual-calendar/component.astro +17 -0
- package/src/tool/perpetual-calendar/components/CalendarPanel.astro +49 -0
- package/src/tool/perpetual-calendar/dial.ts +176 -0
- package/src/tool/perpetual-calendar/entry.ts +48 -0
- package/src/tool/perpetual-calendar/helpers.ts +49 -0
- package/src/tool/perpetual-calendar/i18n/de.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/en.ts +102 -0
- package/src/tool/perpetual-calendar/i18n/es.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/fr.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/id.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/it.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/ja.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/ko.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/nl.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/pl.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/pt.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/ru.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/sv.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/tr.ts +85 -0
- package/src/tool/perpetual-calendar/i18n/zh.ts +85 -0
- package/src/tool/perpetual-calendar/index.ts +11 -0
- package/src/tool/perpetual-calendar/perpetual-calendar.css +181 -0
- package/src/tool/perpetual-calendar/seo.astro +16 -0
- package/src/tool/perpetual-calendar/state.ts +26 -0
- package/src/tool/tourbillon-visualizer/bibliography.astro +11 -0
- package/src/tool/tourbillon-visualizer/bibliography.ts +7 -0
- package/src/tool/tourbillon-visualizer/client.ts +122 -0
- package/src/tool/tourbillon-visualizer/component.astro +126 -0
- package/src/tool/tourbillon-visualizer/components/TourbillonPanel.astro +66 -0
- package/src/tool/tourbillon-visualizer/entry.ts +51 -0
- package/src/tool/tourbillon-visualizer/helpers.ts +35 -0
- package/src/tool/tourbillon-visualizer/i18n/de.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/en.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/es.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/fr.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/id.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/it.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/ja.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/ko.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/nl.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/pl.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/pt.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/ru.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/sv.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/tr.ts +96 -0
- package/src/tool/tourbillon-visualizer/i18n/zh.ts +96 -0
- package/src/tool/tourbillon-visualizer/index.ts +11 -0
- package/src/tool/tourbillon-visualizer/renderer/base.ts +78 -0
- package/src/tool/tourbillon-visualizer/renderer/cage.ts +115 -0
- package/src/tool/tourbillon-visualizer/renderer/esc.ts +160 -0
- package/src/tool/tourbillon-visualizer/seo.astro +11 -0
- package/src/tool/tourbillon-visualizer/state.ts +21 -0
- package/src/tool/tourbillon-visualizer/tourbillon.ts +9 -0
- package/src/tools.ts +8 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { TourbillonUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
import { buildSchemas } from '../helpers';
|
|
5
|
+
|
|
6
|
+
const faq = [
|
|
7
|
+
{
|
|
8
|
+
question: 'Что такое турбийон?',
|
|
9
|
+
answer: 'Турбийон — это вращающаяся клетка, которая содержит спусковой механизм (баланс, анкерную вилку и спусковое колесо) механических часов. Он непрерывно вращается — обычно один раз в минуту — чтобы усреднять позиционные ошибки, вызванные гравитацией, повышая точность.',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
question: 'В чем разница между классическим и парящим турбийоном?',
|
|
13
|
+
answer: 'Классический турбийон поддерживается верхним и нижним мостами, в то время как парящий турбийон крепится консольно снизу без видимой верхней опоры. Парящие турбийоны обеспечивают беспрепятственный обзор вращающегося спуска и считаются более эстетически сложными в изготовлении.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Действительно ли турбийон улучшает точность?',
|
|
17
|
+
answer: 'В современных наручных часах преимущество в точности минимально, поскольку позиционные ошибки уже хорошо скомпенсированы. Однако в карманных часах (для которых Бреге изобрел турбийон в 1801 году) постоянное вращение устраняло разницу хода между вертикальными положениями. Сегодня турбийоны — это прежде всего демонстрация высокого часового мастерства.',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const howTo = [
|
|
22
|
+
{
|
|
23
|
+
name: 'Изменить тип турбийона',
|
|
24
|
+
text: 'Переключайтесь между классическим и парящим турбийоном, чтобы увидеть структурную разницу. Парящий турбийон не имеет верхнего моста, открывая полную клетку.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'Настроить частоту биений',
|
|
28
|
+
text: 'Попробуйте разные частоты (18k, 28.8k, 36k VPH), чтобы увидеть, как меняются скорость баланса и вращение спускового колеса.',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Управлять скоростью',
|
|
32
|
+
text: 'Используйте регуляторы скорости, чтобы замедлить и наблюдать за сложным танцем спуска, или ускорьте, чтобы увидеть полный цикл вращения клетки.',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const title = 'Турбийон: Искусство вращающегося спуска';
|
|
37
|
+
|
|
38
|
+
export const content: ToolLocaleContent<TourbillonUI> = {
|
|
39
|
+
slug: 'tourbillon-vizualizator',
|
|
40
|
+
title,
|
|
41
|
+
description: 'Испытайте завораживающее искусство турбийона — вращающейся клетки, вмещающей спуск. Наблюдайте, как баланс колеблется, спираль дышит, а клетка вращается в элегантном механическом балете.',
|
|
42
|
+
ui: {
|
|
43
|
+
title: 'Tourbillon Visualizer',
|
|
44
|
+
typeLabel: 'Тип',
|
|
45
|
+
typeClassic: 'Классический',
|
|
46
|
+
typeFlying: 'Парящий',
|
|
47
|
+
speedLabel: 'Скорость',
|
|
48
|
+
speedNormal: '1x',
|
|
49
|
+
speedSlow: '0.5x',
|
|
50
|
+
speedPaused: 'Пауза',
|
|
51
|
+
beatRateLabel: 'Частота',
|
|
52
|
+
rate18k: '18k',
|
|
53
|
+
rate28k: '28.8k',
|
|
54
|
+
rate36k: '36k',
|
|
55
|
+
cageRotationLabel: 'Клетка',
|
|
56
|
+
showLabelsLabel: 'Метки',
|
|
57
|
+
step1: 'Переключайтесь между классическим и парящим турбийоном, чтобы сравнить их архитектуру.',
|
|
58
|
+
step2: 'Настройте частоту биений, чтобы увидеть, как она влияет на ритм спуска.',
|
|
59
|
+
step3: 'Используйте регуляторы скорости, чтобы наблюдать точный механический танец в любом темпе.',
|
|
60
|
+
tipTitle: 'Совет',
|
|
61
|
+
tipContent: 'Бреге изобрел турбийон в 1801 году. Слово "турбийон" означает "вихрь" по-французски, описывая вид вращающейся клетки в движении.',
|
|
62
|
+
balanceLabel: 'Баланс',
|
|
63
|
+
escapeLabel: 'Спуск',
|
|
64
|
+
palletLabel: 'Анкер',
|
|
65
|
+
cageLabel: 'Клетка',
|
|
66
|
+
},
|
|
67
|
+
seo: [
|
|
68
|
+
{ type: 'title', text: 'Tourbillon Visualizer: Анимированное искусство спуска', level: 2 },
|
|
69
|
+
{ type: 'paragraph', html: '<strong>Турбийон</strong> — одна из самых захватывающих осложнений в haute horlogerie. Этот интерактивный визуализатор оживляет вращающийся спуск с детальной анимированной визуализацией баланса, спирали, анкерной вилки, спускового колеса и культовой вращающейся клетки. Исследуйте механическую поэзию шедевра Бреге.' },
|
|
70
|
+
{ type: 'title', text: 'Как работает турбийон', level: 3 },
|
|
71
|
+
{ type: 'paragraph', html: 'Турбийон вмещает весь спусковой механизм — <strong>баланс, спираль, анкерную вилку и спусковое колесо</strong> — внутри вращающейся клетки. Клетка обычно совершает один оборот в минуту, постоянно меняя положение спуска относительно гравитации. Это усредняет позиционные ошибки хронометража — концепция, революционная, когда Абрахам-Луи Бреге запатентовал ее в 1801 году. <strong>Баланс</strong> колеблется с частотой биений часов (обычно 4 Гц / 28 800 п/ч), в то время как <strong>спусковое колесо</strong> продвигается на один зуб за удар, создавая характерное тикающее движение.' },
|
|
72
|
+
{ type: 'title', text: 'Классический vs Парящий Турбийон', level: 3 },
|
|
73
|
+
{
|
|
74
|
+
type: 'table', headers: ['Характеристика', 'Классический Турбийон', 'Парящий Турбийон'], rows: [
|
|
75
|
+
['Верхняя опора', 'Видимый мост', 'Нет (консольный)'],
|
|
76
|
+
['Обзор', 'Частичный (мост виден)', 'Полный (без помех)'],
|
|
77
|
+
['Сложность', 'Высокая', 'Чрезвычайно высокая'],
|
|
78
|
+
['Изобретен', '1801 (Бреге)', '1920-е (Альфред Хельвиг)'],
|
|
79
|
+
['Распространен в', 'Традиционных брендах', 'Современных независимых'],
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{ type: 'title', text: 'Сравнение частот биений', level: 3 },
|
|
83
|
+
{
|
|
84
|
+
type: 'table', headers: ['Ритм (п/ч)', 'Частота', 'Спусковое колесо об/мин', 'Ударов/с', 'Типичное использование'], rows: [
|
|
85
|
+
['18 000', '2,5 Гц', '20 об/мин', '5', 'Винтажные карманные часы'],
|
|
86
|
+
['28 800', '4 Гц', '32 об/мин', '8', 'Современный стандарт (ETA, Rolex)'],
|
|
87
|
+
['36 000', '5 Гц', '40 об/мин', '10', 'Высокая частота (Zenith)'],
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{ type: 'diagnostic', variant: 'info', title: 'Механическое искусство в движении', icon: 'mdi:rotate-orbit', badge: 'ЧАСОВОЕ ДЕЛО', html: 'Этот визуализатор является художественной интерпретацией турбийонного спуска. Вращение клетки, колебание баланса, дыхание спирали, качание анкерной вилки и шаг спускового колеса синхронизированы в соответствии с реальными механическими соотношениями. Используйте элементы управления, чтобы исследовать этот шедевр микромеханической инженерии.' },
|
|
91
|
+
],
|
|
92
|
+
faq,
|
|
93
|
+
bibliography,
|
|
94
|
+
howTo,
|
|
95
|
+
schemas: buildSchemas(title, faq, howTo),
|
|
96
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { TourbillonUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
import { buildSchemas } from '../helpers';
|
|
5
|
+
|
|
6
|
+
const faq = [
|
|
7
|
+
{
|
|
8
|
+
question: 'Vad är en tourbillon?',
|
|
9
|
+
answer: 'En tourbillon är en roterande bur som innehåller gången (balanshjulet, ankaret och gånghjulet) i en mekanisk klocka. Den roterar kontinuerligt — vanligtvis en gång per minut — för att medelvärdesutjämna positionsfel orsakade av gravitationen, vilket förbättrar noggrannheten.',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
question: 'Vad är skillnaden mellan en klassisk och en flygande tourbillon?',
|
|
13
|
+
answer: 'En klassisk tourbillon stöds av både en övre och nedre bro, medan en flygande tourbillon är fribärande underifrån utan synligt övre stöd. Flygande tourbillons erbjuder en fri sikt över den roterande gången och anses vara estetiskt mer krävande att konstruera.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Förbättrar en tourbillon verkligen noggrannheten?',
|
|
17
|
+
answer: 'I moderna armbandsur är noggrannhetsfördelen minimal eftersom positionsfel redan är väl kompenserade. I fickur (för vilka Breguet uppfann tourbillonen 1801) eliminerade den konstanta rotationen dock gångskillnader mellan vertikala positioner. Idag är tourbillons främst en demonstration av högt urmakerihantverk.',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const howTo = [
|
|
22
|
+
{
|
|
23
|
+
name: 'Ändra tourbillon-typ',
|
|
24
|
+
text: 'Växla mellan klassisk och flygande tourbillon för att se den strukturella skillnaden. Den flygande tourbillonen har ingen övre bro, vilket avslöjar hela buren.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'Justera slagfrekvens',
|
|
28
|
+
text: 'Prova olika slagfrekvenser (18k, 28.8k, 36k VPH) för att se hur balanshjulets hastighet och gånghjulets rotation förändras.',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Kontrollera hastighet',
|
|
32
|
+
text: 'Använd hastighetsreglagen för att sakta ner och observera den intrikata dansen av gången, eller snabba upp för att se hela burrotationen.',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const title = 'Tourbillon: Konsten av den Roterande Gången';
|
|
37
|
+
|
|
38
|
+
export const content: ToolLocaleContent<TourbillonUI> = {
|
|
39
|
+
slug: 'tourbillon-visualiserare',
|
|
40
|
+
title,
|
|
41
|
+
description: 'Upplev den fascinerande konsten av tourbillonen — en roterande bur som rymmer gången. Se balanshjulet oscillera, hårfjädern andas och buren rotera i en elegant mekanisk balett.',
|
|
42
|
+
ui: {
|
|
43
|
+
title: 'Tourbillon Visualizer',
|
|
44
|
+
typeLabel: 'Typ',
|
|
45
|
+
typeClassic: 'Klassisk',
|
|
46
|
+
typeFlying: 'Flygande',
|
|
47
|
+
speedLabel: 'Hastighet',
|
|
48
|
+
speedNormal: '1x',
|
|
49
|
+
speedSlow: '0.5x',
|
|
50
|
+
speedPaused: 'Pausad',
|
|
51
|
+
beatRateLabel: 'Slagfrekvens',
|
|
52
|
+
rate18k: '18k',
|
|
53
|
+
rate28k: '28.8k',
|
|
54
|
+
rate36k: '36k',
|
|
55
|
+
cageRotationLabel: 'Bur',
|
|
56
|
+
showLabelsLabel: 'Etiketter',
|
|
57
|
+
step1: 'Växla mellan klassisk och flygande tourbillon för att jämföra deras arkitektur.',
|
|
58
|
+
step2: 'Justera slagfrekvensen för att se hur den påverkar gångens rytm.',
|
|
59
|
+
step3: 'Använd hastighetsreglagen för att observera den precisa mekaniska dansen i valfri takt.',
|
|
60
|
+
tipTitle: 'Tips',
|
|
61
|
+
tipContent: 'Breguet uppfann tourbillonen 1801. Ordet "tourbillon" betyder "virvelvind" på franska och beskriver den roterande burens utseende i rörelse.',
|
|
62
|
+
balanceLabel: 'Balans',
|
|
63
|
+
escapeLabel: 'Gång',
|
|
64
|
+
palletLabel: 'Ankare',
|
|
65
|
+
cageLabel: 'Bur',
|
|
66
|
+
},
|
|
67
|
+
seo: [
|
|
68
|
+
{ type: 'title', text: 'Tourbillon Visualizer: Animerad Gångkonst', level: 2 },
|
|
69
|
+
{ type: 'paragraph', html: '<strong>Tourbillonen</strong> är en av de mest fängslande komplikationerna inom haute horlogerie. Denna interaktiva visualiserare väcker den roterande gången till liv med en detaljerad animerad återgivning av balanshjulet, hårfjädern, ankaret, gånghjulet och den ikoniska roterande buren. Utforska den mekaniska poesin i Breguets mästerverk.' },
|
|
70
|
+
{ type: 'title', text: 'Hur en tourbillon fungerar', level: 3 },
|
|
71
|
+
{ type: 'paragraph', html: 'En tourbillon rymmer hela gången — <strong>balanshjul, hårfjäder, ankare och gånghjul</strong> — inuti en roterande bur. Buren fullbordar vanligtvis en rotation per minut och ändrar kontinuerligt gångens position i förhållande till gravitationen. Detta medelvärdesutjämnar positionella tidsfel, ett koncept som var revolutionerande när Abraham-Louis Breguet patenterade det 1801. <strong>Balanshjulet</strong> oscillerar med klockans slagfrekvens (vanligtvis 4 Hz / 28 800 vph), medan <strong>gånghjulet</strong> avancerar en tand per slag och skapar den karakteristiska tickande rörelsen.' },
|
|
72
|
+
{ type: 'title', text: 'Klassisk vs Flygande Tourbillon', level: 3 },
|
|
73
|
+
{
|
|
74
|
+
type: 'table', headers: ['Egenskap', 'Klassisk Tourbillon', 'Flygande Tourbillon'], rows: [
|
|
75
|
+
['Övre stöd', 'Synlig bro', 'Ingen (fribärande)'],
|
|
76
|
+
['Siktbarhet', 'Delvis (bro i vägen)', 'Full (obstruerad)'],
|
|
77
|
+
['Svårighet', 'Hög', 'Extremt hög'],
|
|
78
|
+
['Uppfunnen', '1801 (Breguet)', '1920-talet (Alfred Helwig)'],
|
|
79
|
+
['Vanlig i', 'Traditionella märken', 'Moderna oberoende'],
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{ type: 'title', text: 'Slagfrekvensjämförelse', level: 3 },
|
|
83
|
+
{
|
|
84
|
+
type: 'table', headers: ['Frekvens (vph)', 'Frekvens', 'Gånghjul varv/min', 'Slag/s', 'Typisk användning'], rows: [
|
|
85
|
+
['18 000', '2,5 Hz', '20 varv/min', '5', 'Vintage fickur'],
|
|
86
|
+
['28 800', '4 Hz', '32 varv/min', '8', 'Modern standard (ETA, Rolex)'],
|
|
87
|
+
['36 000', '5 Hz', '40 varv/min', '10', 'Högfrekvent (Zenith)'],
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{ type: 'diagnostic', variant: 'info', title: 'Mekanisk Konst i Rörelse', icon: 'mdi:rotate-orbit', badge: 'URMAKERI', html: 'Denna visualiserare är en konstnärlig tolkning av en tourbillon-gång. Burrotationen, balansoscillationen, hårfjäderns andning, ankarrörelsen och gånghjulets steg är synkroniserade enligt verkliga mekaniska relationer. Använd kontrollerna för att utforska detta mästerverk av mikromekanisk ingenjörskonst.' },
|
|
91
|
+
],
|
|
92
|
+
faq,
|
|
93
|
+
bibliography,
|
|
94
|
+
howTo,
|
|
95
|
+
schemas: buildSchemas(title, faq, howTo),
|
|
96
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { TourbillonUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
import { buildSchemas } from '../helpers';
|
|
5
|
+
|
|
6
|
+
const faq = [
|
|
7
|
+
{
|
|
8
|
+
question: 'Tourbillon nedir?',
|
|
9
|
+
answer: 'Tourbillon, mekanik bir saatin eşapmanını (balans çarkı, palet çatalı ve eşapman çarkı) içeren dönen bir kafestir. Yerçekiminin neden olduğu konumsal hataları ortalamak ve doğruluğu artırmak için sürekli olarak — tipik olarak dakikada bir kez — döner.',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
question: 'Klasik ve uçan tourbillon arasındaki fark nedir?',
|
|
13
|
+
answer: 'Klasik bir tourbillon hem üst hem de alt köprü tarafından desteklenirken, uçan bir tourbillon görünür üst destek olmadan alttan konsol şeklindedir. Uçan tourbillonlar, dönen eşapmanın engelsiz bir görünümünü sunar ve yapımı estetik olarak daha zorlu kabul edilir.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Tourbillon gerçekten doğruluğu artırır mı?',
|
|
17
|
+
answer: 'Modern kol saatlerinde, konumsal hatalar zaten iyi bir şekilde telafi edildiğinden doğruluk avantajı minimaldir. Ancak, Breguet\'in 1801\'de tourbillonu icat ettiği cep saatlerinde, sürekli dönüş dikey konumlar arasındaki hız farklarını ortadan kaldırdı. Günümüzde tourbillonlar esas olarak yüksek saatçilik sanatının bir göstergesidir.',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const howTo = [
|
|
22
|
+
{
|
|
23
|
+
name: 'Tourbillon tipini değiştir',
|
|
24
|
+
text: 'Yapısal farkı görmek için Klasik ve Uçan tourbillon arasında geçiş yapın. Uçan tourbillonun üst köprüsü yoktur, tam kafesi ortaya çıkarır.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'Vuruş hızını ayarla',
|
|
28
|
+
text: 'Balans çarkı hızının ve eşapman çarkı dönüşünün nasıl değiştiğini görmek için farklı vuruş hızlarını (18k, 28.8k, 36k VPH) deneyin.',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Hızı kontrol et',
|
|
32
|
+
text: 'Eşapmanın karmaşık dansını gözlemlemek için yavaşlatın veya tam kafes dönüş döngüsünü görmek için hızlandırın.',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const title = 'Tourbillon: Dönen Eşapmanın Sanatı';
|
|
37
|
+
|
|
38
|
+
export const content: ToolLocaleContent<TourbillonUI> = {
|
|
39
|
+
slug: 'tourbillon-goruntuleyici',
|
|
40
|
+
title,
|
|
41
|
+
description: 'Tourbillonun büyüleyici sanatını deneyimleyin — eşapmanı barındıran dönen bir kafes. Balans çarkının salınımını, yayın nefes alışını ve kafesin zarif bir mekanik balede dönüşünü izleyin.',
|
|
42
|
+
ui: {
|
|
43
|
+
title: 'Tourbillon Visualizer',
|
|
44
|
+
typeLabel: 'Tip',
|
|
45
|
+
typeClassic: 'Klasik',
|
|
46
|
+
typeFlying: 'Uçan',
|
|
47
|
+
speedLabel: 'Hız',
|
|
48
|
+
speedNormal: '1x',
|
|
49
|
+
speedSlow: '0.5x',
|
|
50
|
+
speedPaused: 'Duraklatıldı',
|
|
51
|
+
beatRateLabel: 'Vuruş Hızı',
|
|
52
|
+
rate18k: '18k',
|
|
53
|
+
rate28k: '28.8k',
|
|
54
|
+
rate36k: '36k',
|
|
55
|
+
cageRotationLabel: 'Kafes',
|
|
56
|
+
showLabelsLabel: 'Etiketler',
|
|
57
|
+
step1: 'Mimarilerini karşılaştırmak için Klasik ve Uçan tourbillon arasında geçiş yapın.',
|
|
58
|
+
step2: 'Eşapman ritmini nasıl etkilediğini görmek için vuruş hızını ayarlayın.',
|
|
59
|
+
step3: 'Herhangi bir hızda hassas mekanik dansı gözlemlemek için hız kontrollerini kullanın.',
|
|
60
|
+
tipTitle: 'İpucu',
|
|
61
|
+
tipContent: 'Breguet, tourbillonu 1801\'de icat etti. "Tourbillon" kelimesi Fransızcada "kasırga" anlamına gelir ve dönen kafesin hareket halindeki görünümünü tanımlar.',
|
|
62
|
+
balanceLabel: 'Balans',
|
|
63
|
+
escapeLabel: 'Eşapman',
|
|
64
|
+
palletLabel: 'Palet',
|
|
65
|
+
cageLabel: 'Kafes',
|
|
66
|
+
},
|
|
67
|
+
seo: [
|
|
68
|
+
{ type: 'title', text: 'Tourbillon Visualizer: Animasyonlu Eşapman Sanatı', level: 2 },
|
|
69
|
+
{ type: 'paragraph', html: '<strong>Tourbillon</strong>, haute horlogerie\'nin en büyüleyici komplikasyonlarından biridir. Bu etkileşimli görselleştirici, balans çarkı, yay, palet çatalı, eşapman çarkı ve ikonik dönen kafesin ayrıntılı animasyonlu bir sunumuyla dönen eşapmanı hayata geçiriyor. Breguet\'in başyapıtının mekanik şiirini keşfedin.' },
|
|
70
|
+
{ type: 'title', text: 'Tourbillon nasıl çalışır', level: 3 },
|
|
71
|
+
{ type: 'paragraph', html: 'Bir tourbillon, tüm eşapmanı — <strong>balans çarkı, yay, palet çatalı ve eşapman çarkı</strong> — dönen bir kafesin içinde barındırır. Kafes tipik olarak dakikada bir dönüş yapar ve eşapmanın yerçekimine göre konumunu sürekli değiştirir. Bu, Abraham-Louis Breguet\'in 1801\'de patentlediğinde devrim niteliğinde olan bir kavram olan konumsal zamanlama hatalarını ortalar. <strong>Balans çarkı</strong> saatin vuruş hızında (tipik olarak 4 Hz / 28.800 vph) salınırken, <strong>eşapman çarkı</strong> her vuruşta bir diş ilerleyerek karakteristik tik hareketini yaratır.' },
|
|
72
|
+
{ type: 'title', text: 'Klasik vs Uçan Tourbillon', level: 3 },
|
|
73
|
+
{
|
|
74
|
+
type: 'table', headers: ['Özellik', 'Klasik Tourbillon', 'Uçan Tourbillon'], rows: [
|
|
75
|
+
['Üst destek', 'Görünür köprü', 'Yok (konsol)'],
|
|
76
|
+
['Görünürlük', 'Kısmi (köprü görünür)', 'Tam (engelsiz)'],
|
|
77
|
+
['Zorluk', 'Yüksek', 'Son derece yüksek'],
|
|
78
|
+
['İcat', '1801 (Breguet)', '1920\'ler (Alfred Helwig)'],
|
|
79
|
+
['Yaygın', 'Geleneksel markalar', 'Modern bağımsızlar'],
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{ type: 'title', text: 'Vuruş Hızı Karşılaştırması', level: 3 },
|
|
83
|
+
{
|
|
84
|
+
type: 'table', headers: ['Hız (vph)', 'Frekans', 'Eşapman Çarkı dev/dk', 'Vuruş/s', 'Tipik Kullanım'], rows: [
|
|
85
|
+
['18.000', '2,5 Hz', '20 dev/dk', '5', 'Vintage cep saatleri'],
|
|
86
|
+
['28.800', '4 Hz', '32 dev/dk', '8', 'Modern standart (ETA, Rolex)'],
|
|
87
|
+
['36.000', '5 Hz', '40 dev/dk', '10', 'Yüksek frekans (Zenith)'],
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{ type: 'diagnostic', variant: 'info', title: 'Hareket Halinde Mekanik Sanat', icon: 'mdi:rotate-orbit', badge: 'SAATÇILIK', html: 'Bu görselleştirici, bir tourbillon eşapmanının sanatsal bir yorumudur. Kafes dönüşü, balans salınımı, yay nefesi, palet sallanışı ve eşapman çarkı adımı gerçek mekanik ilişkilere göre senkronize edilmiştir. Bu mikromekanik mühendislik başyapıtını keşfetmek için kontrolleri kullanın.' },
|
|
91
|
+
],
|
|
92
|
+
faq,
|
|
93
|
+
bibliography,
|
|
94
|
+
howTo,
|
|
95
|
+
schemas: buildSchemas(title, faq, howTo),
|
|
96
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { TourbillonUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
import { buildSchemas } from '../helpers';
|
|
5
|
+
|
|
6
|
+
const faq = [
|
|
7
|
+
{
|
|
8
|
+
question: '什么是陀飞轮?',
|
|
9
|
+
answer: '陀飞轮是一个旋转的框架,包含机械手表的擒纵机构(摆轮、擒纵叉和擒纵轮)。它持续旋转——通常每分钟一圈——以平均重力造成的位置误差,提高精度。',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
question: '经典陀飞轮和飞行陀飞轮有什么区别?',
|
|
13
|
+
answer: '经典陀飞轮由上桥和下桥支撑,而飞行陀飞轮从底部悬臂支撑,没有可见的上部支撑。飞行陀飞轮提供无阻碍的旋转擒纵机构视野,制造上被认为是美学要求更高的。',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: '陀飞轮真的能提高精度吗?',
|
|
17
|
+
answer: '在现代腕表中,精度优势微乎其微,因为位置误差已经得到了很好的补偿。然而,在怀表中(宝玑于1801年为此发明了陀飞轮),持续旋转消除了垂直位置之间的速率差异。如今,陀飞轮主要是高级制表艺术的展示。',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const howTo = [
|
|
22
|
+
{
|
|
23
|
+
name: '更改陀飞轮类型',
|
|
24
|
+
text: '在经典和飞行陀飞轮之间切换,查看结构差异。飞行陀飞轮没有上桥,露出完整的框架。',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: '调整振频',
|
|
28
|
+
text: '尝试不同的振频(18k、28.8k、36k VPH),查看摆轮速度和擒纵轮旋转如何变化。',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: '控制速度',
|
|
32
|
+
text: '使用速度控制放慢速度观察擒纵机构 intricate 的舞蹈,或加快速度查看完整的框架旋转周期。',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const title = '陀飞轮:旋转擒纵机构的艺术';
|
|
37
|
+
|
|
38
|
+
export const content: ToolLocaleContent<TourbillonUI> = {
|
|
39
|
+
slug: 'tourbillon-visualizer',
|
|
40
|
+
title,
|
|
41
|
+
description: '体验陀飞轮迷人的艺术——容纳擒纵机构的旋转框架。观看摆轮摆动、游丝呼吸、框架在优雅的机械芭蕾中旋转。',
|
|
42
|
+
ui: {
|
|
43
|
+
title: '陀飞轮可视化器',
|
|
44
|
+
typeLabel: '类型',
|
|
45
|
+
typeClassic: '经典',
|
|
46
|
+
typeFlying: '飞行',
|
|
47
|
+
speedLabel: '速度',
|
|
48
|
+
speedNormal: '1x',
|
|
49
|
+
speedSlow: '0.5x',
|
|
50
|
+
speedPaused: '已暂停',
|
|
51
|
+
beatRateLabel: '振频',
|
|
52
|
+
rate18k: '18k',
|
|
53
|
+
rate28k: '28.8k',
|
|
54
|
+
rate36k: '36k',
|
|
55
|
+
cageRotationLabel: '框架',
|
|
56
|
+
showLabelsLabel: '标签',
|
|
57
|
+
step1: '在经典和飞行陀飞轮之间切换,比较它们的结构。',
|
|
58
|
+
step2: '调整振频,查看它如何影响擒纵机构的节奏。',
|
|
59
|
+
step3: '使用速度控制,以任何速度观察精确的机械之舞。',
|
|
60
|
+
tipTitle: '小贴士',
|
|
61
|
+
tipContent: '宝玑于1801年发明了陀飞轮。"陀飞轮"在法语中意为"旋风",描述了旋转框架运动时的外观。',
|
|
62
|
+
balanceLabel: '摆轮',
|
|
63
|
+
escapeLabel: '擒纵',
|
|
64
|
+
palletLabel: '擒纵叉',
|
|
65
|
+
cageLabel: '框架',
|
|
66
|
+
},
|
|
67
|
+
seo: [
|
|
68
|
+
{ type: 'title', text: '陀飞轮可视化器:动画擒纵艺术', level: 2 },
|
|
69
|
+
{ type: 'paragraph', html: '<strong>陀飞轮</strong>是高级制表中最迷人的复杂功能之一。这个交互式可视化器通过摆轮、游丝、擒纵叉、擒纵轮和标志性旋转框架的详细动画渲染,使旋转的擒纵机构栩栩如生。探索宝玑杰作的机械诗意。' },
|
|
70
|
+
{ type: 'title', text: '陀飞轮的工作原理', level: 3 },
|
|
71
|
+
{ type: 'paragraph', html: '陀飞轮将整个擒纵机构 —— <strong>摆轮、游丝、擒纵叉和擒纵轮</strong> —— 容纳在一个旋转框架内。框架通常每分钟完成一次旋转,持续改变擒纵机构相对于重力的位置。这平均了位置性的计时误差,这一概念在阿伯拉罕-路易·宝玑于1801年获得专利时是革命性的。<strong>摆轮</strong>以手表的振频(通常为4 Hz / 28,800 VPH)摆动,而<strong>擒纵轮</strong>每次摆动前进一个齿,产生特有的滴答运动。' },
|
|
72
|
+
{ type: 'title', text: '经典 vs 飞行陀飞轮', level: 3 },
|
|
73
|
+
{
|
|
74
|
+
type: 'table', headers: ['特点', '经典陀飞轮', '飞行陀飞轮'], rows: [
|
|
75
|
+
['上部支撑', '可见桥板', '无(悬臂)'],
|
|
76
|
+
['可视性', '部分(桥板可见)', '完全(无遮挡)'],
|
|
77
|
+
['难度', '高', '极高'],
|
|
78
|
+
['发明', '1801年(宝玑)', '1920年代(阿尔弗雷德·海尔维格)'],
|
|
79
|
+
['常见于', '传统品牌', '现代独立品牌'],
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{ type: 'title', text: '振频比较', level: 3 },
|
|
83
|
+
{
|
|
84
|
+
type: 'table', headers: ['频率(vph)', '频率', '擒纵轮 rpm', '振动/秒', '典型用途'], rows: [
|
|
85
|
+
['18,000', '2.5 Hz', '20 rpm', '5', '复古怀表'],
|
|
86
|
+
['28,800', '4 Hz', '32 rpm', '8', '现代标准(ETA、劳力士)'],
|
|
87
|
+
['36,000', '5 Hz', '40 rpm', '10', '高频(真力时)'],
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{ type: 'diagnostic', variant: 'info', title: '运动中的机械艺术', icon: 'mdi:rotate-orbit', badge: '钟表学', html: '此可视化器是陀飞轮擒纵机构的艺术诠释。框架旋转、摆轮摆动、游丝呼吸、擒纵叉摆动和擒纵轮步进均根据真实的机械关系同步。使用控件探索这一微机械工程的杰作。' },
|
|
91
|
+
],
|
|
92
|
+
faq,
|
|
93
|
+
bibliography,
|
|
94
|
+
howTo,
|
|
95
|
+
schemas: buildSchemas(title, faq, howTo),
|
|
96
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../../types';
|
|
2
|
+
import { tourbillonVisualizer } from './entry';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
|
|
6
|
+
export const TOURBILLON_VISUALIZER_TOOL: ToolDefinition = {
|
|
7
|
+
entry: tourbillonVisualizer,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { getC, cl, W, H, CX, CY } from '../state';
|
|
2
|
+
|
|
3
|
+
export function drawBg() {
|
|
4
|
+
const c = getC();
|
|
5
|
+
const g = c.createRadialGradient(CX, CY, 0, CX, CY, 450);
|
|
6
|
+
g.addColorStop(0, cl('#1a1a30', '#f0ebe0'));
|
|
7
|
+
g.addColorStop(0.5, cl('#12122a', '#e8e0d0'));
|
|
8
|
+
g.addColorStop(1, cl('#08081a', '#d8d0c0'));
|
|
9
|
+
c.fillStyle = g;
|
|
10
|
+
c.fillRect(0, 0, W, H);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function drawPlate() {
|
|
14
|
+
const c = getC();
|
|
15
|
+
const pr = 310;
|
|
16
|
+
c.beginPath();
|
|
17
|
+
c.arc(CX, CY, pr, 0, Math.PI * 2);
|
|
18
|
+
const g = c.createRadialGradient(CX, CY, 0, CX, CY, pr);
|
|
19
|
+
g.addColorStop(0, cl('#2a2a42', '#e0d8c8'));
|
|
20
|
+
g.addColorStop(0.7, cl('#1e1e36', '#d8d0c0'));
|
|
21
|
+
g.addColorStop(1, cl('#16162e', '#ccc0b0'));
|
|
22
|
+
c.fillStyle = g;
|
|
23
|
+
c.fill();
|
|
24
|
+
c.strokeStyle = cl('rgba(212,175,55,0.2)', 'rgba(139,105,20,0.15)');
|
|
25
|
+
c.lineWidth = 2;
|
|
26
|
+
c.stroke();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function drawSecondScale() {
|
|
30
|
+
const c = getC();
|
|
31
|
+
const r1 = 285, r2 = 275, r3 = 265;
|
|
32
|
+
c.save();
|
|
33
|
+
c.translate(CX, CY);
|
|
34
|
+
for (let i = 0; i < 60; i++) {
|
|
35
|
+
const a = (i / 60) * Math.PI * 2 - Math.PI / 2;
|
|
36
|
+
const tickLen = i % 5 === 0 ? r3 : r2;
|
|
37
|
+
c.beginPath();
|
|
38
|
+
c.moveTo(Math.cos(a) * tickLen, Math.sin(a) * tickLen);
|
|
39
|
+
c.lineTo(Math.cos(a) * r1, Math.sin(a) * r1);
|
|
40
|
+
c.strokeStyle = i % 15 === 0 ? cl('rgba(212,175,55,0.3)', 'rgba(139,105,20,0.3)')
|
|
41
|
+
: cl('rgba(180,180,200,0.15)', 'rgba(100,90,70,0.12)');
|
|
42
|
+
c.lineWidth = i % 5 === 0 ? 1.5 : 0.5;
|
|
43
|
+
c.stroke();
|
|
44
|
+
}
|
|
45
|
+
for (let i = 0; i < 4; i++) {
|
|
46
|
+
const a = (i * 15 / 60) * Math.PI * 2 - Math.PI / 2;
|
|
47
|
+
const nr = r1 + 14;
|
|
48
|
+
c.fillStyle = cl('rgba(200,200,220,0.3)', 'rgba(80,70,50,0.3)');
|
|
49
|
+
c.font = '8px ' + getComputedStyle(document.body).fontFamily;
|
|
50
|
+
c.textAlign = 'center';
|
|
51
|
+
c.textBaseline = 'middle';
|
|
52
|
+
c.fillText(String(i * 15), Math.cos(a) * nr, Math.sin(a) * nr);
|
|
53
|
+
}
|
|
54
|
+
c.restore();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function drawScrews() {
|
|
58
|
+
const c = getC();
|
|
59
|
+
for (let i = 0; i < 8; i++) {
|
|
60
|
+
const a = (i / 8) * Math.PI * 2;
|
|
61
|
+
const r = 295;
|
|
62
|
+
const x = CX + Math.cos(a) * r, y = CY + Math.sin(a) * r;
|
|
63
|
+
c.beginPath();
|
|
64
|
+
c.arc(x, y, 3.5, 0, Math.PI * 2);
|
|
65
|
+
const g = c.createRadialGradient(x - 1, y - 1, 0, x, y, 3.5);
|
|
66
|
+
g.addColorStop(0, cl('#c0c8d0', '#a09880'));
|
|
67
|
+
g.addColorStop(0.5, cl('#8090a0', '#706050'));
|
|
68
|
+
g.addColorStop(1, cl('#405060', '#504030'));
|
|
69
|
+
c.fillStyle = g;
|
|
70
|
+
c.fill();
|
|
71
|
+
c.beginPath();
|
|
72
|
+
c.moveTo(x - 2.5, y); c.lineTo(x + 2.5, y);
|
|
73
|
+
c.moveTo(x, y - 2.5); c.lineTo(x, y + 2.5);
|
|
74
|
+
c.strokeStyle = cl('rgba(50,60,80,0.4)', 'rgba(80,70,50,0.4)');
|
|
75
|
+
c.lineWidth = 0.5;
|
|
76
|
+
c.stroke();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { getC, cl, CX, CY } from '../state';
|
|
2
|
+
|
|
3
|
+
function cageOuter(cr: number) {
|
|
4
|
+
const c = getC();
|
|
5
|
+
c.save();
|
|
6
|
+
c.beginPath();
|
|
7
|
+
c.arc(0, 0, cr, 0, Math.PI * 2);
|
|
8
|
+
const g = c.createLinearGradient(-cr, -cr, cr, cr);
|
|
9
|
+
g.addColorStop(0, cl('#f0d8a0', '#c8b080'));
|
|
10
|
+
g.addColorStop(0.3, cl('#d4bf80', '#b09868'));
|
|
11
|
+
g.addColorStop(0.7, cl('#b89850', '#907848'));
|
|
12
|
+
g.addColorStop(1, cl('#8a7030', '#706030'));
|
|
13
|
+
c.fillStyle = g;
|
|
14
|
+
c.fill();
|
|
15
|
+
c.strokeStyle = cl('rgba(180,150,80,0.6)', 'rgba(120,100,60,0.5)');
|
|
16
|
+
c.lineWidth = 2.5;
|
|
17
|
+
c.stroke();
|
|
18
|
+
c.restore();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function cageScrews(cr: number) {
|
|
22
|
+
const c = getC();
|
|
23
|
+
for (let i = 0; i < 12; i++) {
|
|
24
|
+
const a = (i / 12) * Math.PI * 2;
|
|
25
|
+
const x = Math.cos(a) * cr, y = Math.sin(a) * cr;
|
|
26
|
+
c.beginPath();
|
|
27
|
+
c.arc(x, y, 2.5, 0, Math.PI * 2);
|
|
28
|
+
const sg = c.createRadialGradient(x - 0.5, y - 0.5, 0, x, y, 2.5);
|
|
29
|
+
sg.addColorStop(0, cl('#e8f0f8', '#d0c8b8'));
|
|
30
|
+
sg.addColorStop(1, cl('#8098b0', '#807868'));
|
|
31
|
+
c.fillStyle = sg;
|
|
32
|
+
c.fill();
|
|
33
|
+
}
|
|
34
|
+
c.beginPath();
|
|
35
|
+
c.arc(0, 0, cr * 0.85, 0, Math.PI * 2);
|
|
36
|
+
c.strokeStyle = cl('rgba(180,150,80,0.15)', 'rgba(120,100,60,0.12)');
|
|
37
|
+
c.lineWidth = 1;
|
|
38
|
+
c.stroke();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function bridgeScrews() {
|
|
42
|
+
const c = getC();
|
|
43
|
+
for (let i = 0; i < 3; i++) {
|
|
44
|
+
const bx = -100 + i * 100;
|
|
45
|
+
c.beginPath();
|
|
46
|
+
c.arc(bx, -158, 3, 0, Math.PI * 2);
|
|
47
|
+
c.fillStyle = cl('#a0b0c0', '#908878');
|
|
48
|
+
c.fill();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function drawCross(cr: number) {
|
|
53
|
+
const c = getC();
|
|
54
|
+
c.beginPath();
|
|
55
|
+
c.moveTo(-cr * 0.8, 0);
|
|
56
|
+
c.lineTo(cr * 0.8, 0);
|
|
57
|
+
c.moveTo(0, -cr * 0.8);
|
|
58
|
+
c.lineTo(0, cr * 0.8);
|
|
59
|
+
c.strokeStyle = cl('rgba(180,150,80,0.2)', 'rgba(120,100,60,0.15)');
|
|
60
|
+
c.lineWidth = 1;
|
|
61
|
+
c.stroke();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function drawCornerScrews(cr: number) {
|
|
65
|
+
const c = getC();
|
|
66
|
+
for (let i = 0; i < 4; i++) {
|
|
67
|
+
const a = (i / 4) * Math.PI * 2 + Math.PI / 4;
|
|
68
|
+
const x = Math.cos(a) * cr * 0.65, y = Math.sin(a) * cr * 0.65;
|
|
69
|
+
c.beginPath();
|
|
70
|
+
c.arc(x, y, 2.5, 0, Math.PI * 2);
|
|
71
|
+
c.fillStyle = cl('#d4af37', '#c8a850');
|
|
72
|
+
c.fill();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function drawBridge() {
|
|
77
|
+
const c = getC();
|
|
78
|
+
c.save();
|
|
79
|
+
const g = c.createLinearGradient(-145, -155, 145, -155);
|
|
80
|
+
g.addColorStop(0, cl('rgba(160,170,190,0.6)', 'rgba(140,130,110,0.5)'));
|
|
81
|
+
g.addColorStop(0.3, cl('rgba(200,210,230,0.7)', 'rgba(180,170,150,0.6)'));
|
|
82
|
+
g.addColorStop(0.7, cl('rgba(200,210,230,0.7)', 'rgba(180,170,150,0.6)'));
|
|
83
|
+
g.addColorStop(1, cl('rgba(160,170,190,0.6)', 'rgba(140,130,110,0.5)'));
|
|
84
|
+
c.beginPath();
|
|
85
|
+
c.roundRect(-150, -162, 300, 8, 3);
|
|
86
|
+
c.fillStyle = g;
|
|
87
|
+
c.fill();
|
|
88
|
+
c.strokeStyle = cl('rgba(120,130,150,0.3)', 'rgba(100,90,70,0.25)');
|
|
89
|
+
c.lineWidth = 0.5;
|
|
90
|
+
c.stroke();
|
|
91
|
+
bridgeScrews();
|
|
92
|
+
c.beginPath();
|
|
93
|
+
c.roundRect(-3, -160, 6, 8, 2);
|
|
94
|
+
c.fillStyle = cl('#d4af37', '#c8a850');
|
|
95
|
+
c.fill();
|
|
96
|
+
c.restore();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function drawCage(angle: number, flying: boolean, gyro: boolean, zoom: boolean) {
|
|
100
|
+
const c = getC();
|
|
101
|
+
const cr = zoom ? 60 : 140;
|
|
102
|
+
const sy = gyro ? 1 + Math.sin(angle * 2) * 0.25 : 1;
|
|
103
|
+
c.save();
|
|
104
|
+
c.translate(CX, CY);
|
|
105
|
+
c.scale(1, sy);
|
|
106
|
+
c.rotate(angle);
|
|
107
|
+
if (!flying && !gyro) drawBridge();
|
|
108
|
+
cageOuter(cr);
|
|
109
|
+
cageScrews(cr);
|
|
110
|
+
if (!flying && !gyro) {
|
|
111
|
+
drawCross(cr);
|
|
112
|
+
drawCornerScrews(cr);
|
|
113
|
+
}
|
|
114
|
+
c.restore();
|
|
115
|
+
}
|