フランス革命暦の時計が欲しい
はじめに
みなさんはフランス革命暦ってご存じですか?
フランス革命暦(フランスかくめいれき、仏: Calendrier révolutionnaire français)は、フランス革命期にフランスとその衛星国で使われた独自の暦法。ただし、フランス本国では共和暦(きょうわれき、仏: Calendrier républicain)と呼ばれることのほうが多い。原則として十進法を用いていて、各月を平等としたのが特徴である。[1]
色々と語弊はありますが、簡単にまとめると
フランス革命で王政を倒した民衆が「俺たちは平等だ!王の名前が付いた月だけ長いなんておかしい!」「慣例で使ってる7進, 60進法なんか科学っぽくない!全部10進法にする!」という感じで、言ってしまえば革命の勢いそのままに、勢いで制定した暦システムのことです
もうおもしろくないですか?脱絶対王政、脱教会権力のためにどうするかを考えても僕の頭の中からは絶対に出てこない発想なので興味深くて好きです
それでいて1年は12か月だったり、閏年は4年おきだったり十進法に徹しきれていないところも詰めが甘くて好きなところです
そしてフランス革命暦、十進化時間時計の存在を知った私は思いました、
ほしい
しかしまあこんな現代ではなんの役にも立たない時計誰も作ってないんですよね
当時作っていたのはブレゲ創始者のブレゲ本人とからしく博物館レベルのものしか残っていないため手に入るはずもなく
じゃあ作るか
創作のモチベーションはいつもこんな感じ
目標
あらためて今回の目標を整理するとこんな感じ
- フランス革命暦(十進化時間)の時計を作る
- とりあえずWindows PCで動くものができればいいかな?
方法
開発環境
- Windows11
- Visual Studio
- WPF(.NET Frameworkcd)
プログラム
ソースコード
WPFでアナログ時計を作っているこちらの方を参考にさせていただきましょう
こちらのコードでは以下の部分で時計の動作を実装しています<Line x:Name="hourhand" X1="0" X2="0" Y1="0" Y2="26" Stroke="#FCFCFE" StrokeThickness="5" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2 -26 0 0">
<Line.RenderTransform>
<RotateTransform CenterY="26"/>
</Line.RenderTransform>
<Line.Resources>
<Storyboard x:Key="storyboard_h">
<DoubleAnimation Storyboard.TargetProperty="(Rectangle.RenderTransform).(RotateTransform.Angle)"
From="0" To="360" Duration="12:0:0" RepeatBehavior="Forever" />
</Storyboard>
</Line.Resources>
</Line>
Lineで描画した時針hourhandをStoryboardでアニメーション化することでxamlだけで基本的な時計の動作を実現できています
Lineの角度(Rectangle.RenderTransform).(RotateTransform.Angle)
を0度~360度までFrom="0" To="360"
12時間かけてDuration="12:0:0"
変形することを、永遠に繰り返し続けるRepeatBehavior="Forever"
という動作です
十進化時間では1日が10時間で午前午後の区別がないのでDuration="1:0:0:0"
とすれば良さそうです
また
<!--#region Splits-->
<Line X1="0" Y1="0" X2="0" Y2="6" Margin="1 6 0 0" Stroke="#FCFCFE" StrokeThickness="2" HorizontalAlignment="Center">
<Line.RenderTransform>
<RotateTransform CenterY="47" Angle="0"/>
</Line.RenderTransform>
</Line>
<!--中略-->
<!--#endregion-->
の部分でメモリ(略字)を描画しています
90度ごとに大きなメモリ、30度ごとに小さなメモリが描画されています
今回は十進化時間なので1日を10時間に区切ります
メモリは36度ごと、大きなメモリは午前午後の区切りの0, 180度でいいと思います
加えて、WPFのUI部分のタイマーはそこそこの精度ですのでどんどんずれしまいます
これをC#の方で定期的に時刻を取得して修正するような機能も実装されています
private void adjustTime(DateTime now)
{
var storyboard_h = this.hourhand.Resources["storyboard_h"] as Storyboard;
// 中略
storyboard_h.Begin(this.hourhand, true);
storyboard_h.SeekAlignedToLastTick(this.hourhand, now.TimeOfDay, TimeSeekOrigin.BeginTime);
// 中略
}
時間針は通常のアナログ時計の半分の回転にしなければならないのでこの部分も修正が必要かと思いましたが、SeekAlignedToLastTick
は
//
// 概要:
// この System.Windows.Media.Animation.Storyboard を新しい位置まで即座 (同期的) にシークします。
//
// パラメーター:
// containingObject:
// System.Windows.Media.Animation.Storyboard.Begin(System.Windows.FrameworkElement,System.Boolean)
// メソッドの呼び出し時に指定されたオブジェクト。 このオブジェクトには、このストーリーボードとその子のために作成された System.Windows.Media.Animation.Clock
// オブジェクトが格納されます。
//
// offset:
// タイムラインが、指定した origin から前方または後方にどれだけ移動するかを示す正の値または負の値。
//
// origin:
// offset の適用元の位置。
public void SeekAlignedToLastTick(FrameworkElement containingObject, TimeSpan offset, TimeSeekOrigin origin);
となっているので、最初に設定したDuration="1:0:0:0"
に対してoffset
が何割にあたるかを勝手に計算してFrom="0" To="360"
のうち何度に描画するかが決まります
したがって、ロジック部分に修正は要りません。便利すぎる
結果
できました
メモリだけだと見た目の違和感が少なめなので文字盤も追加してみました
まとめ
当初思っていた通りのものができました
が、なんか思ったよりおもしろくなかったですね
Future work
- 腕時計にしたい
やはり時計といえば腕時計ですよね
しかしApple Watchのフェイスの開発、デザインは一般の開発者向けに開放されていないために現時点で腕時計の文字盤に十進化時間を表示する方法はないかも
- デジタル時計だとどうなるか
1時間が100分、1分が100秒なので、デジタル時計だと99秒、99分まで表示されることになります
ぱっと見だとデジタルの方が面白い感じになるかな?
- カレンダーも作る
フランス革命暦の一番の魅力は暦の方かもしれません
全ての月に日本の旧月名のような名前がついているどころか
全ての日に動植物や農機具などの名前が付けられています
最近ではバースデーカラー、誕生花、誕生酒などいろいろありますが、
もしかしたらこれらの先駆けだったのかも?
これを表にするのがめんどくさかったので今回は作りませんでした
閏年の明確に定義をする前に廃止されていたり、実装面で課題があり見送りました
Discussion