time
パッケージからTime
を受け取り、時、分、秒のすべての針が正しい方向を向いている時計の SVG を出力するだけの素敵な関数です。x1
およびy1
)は、時計の各針で同じです。 時計の針ごとに変更する必要がある数値(SVGを構築するためのパラメーター)は、x2
およびy2
属性です。時計の針ごとにX
とY
が必要です。text/template
パッケージのテンプレートを使用するか、単にバイトをbytes.Buffer
またはライターに入れます。しかし、これらの数値が必要になることはわかっているので、それらを作成するもののテストに焦点を合わせましょう。Point
とそれを取得する関数。HandsAt
の戻り値を入力できます。(360 / 60 ) * 37 = 222
ですが、完全なローテーションの37/60
であることを覚えているだけの方が簡単です。0, 0
。unit circle
)」と呼ばれます。半径が1単位だからです。sin
と cos
の両方に関数が必要です。math
Cosは、ラジアン引数xの余弦を返します。
clockface
パッケージ内で記述します。それらがエクスポートされることはなく、何が起こっているのかをしっかり把握すると、または移動されて削除される可能性があります。math
パッケージの最初の使用です!円の1回転が2πラジアンである場合、途中のラウンドはちょうどπラジアンになるはずです。math.Pi
はπの値を提供します。testName
は時刻をデジタル時計形式(HH:MM:SS)に変換し、simpleTime
は実際に気にする部分のみを使用してtime.Time
を構築します(再び、時間、分、秒)。float64
として)を掛けると、すべてのテストに合格するはずです...Floats
)は恐ろしいsecondsInRadians
関数のように10進数を上下に因数分解すると、10進数は不正確になり始めます。 math.Pi
を30で除算してから30を掛けることで、math.Pi
と同じではない数値になりました。math/big
パッケージの合理的なタイプRat
を使用することです。 しかし、目的が月着陸ではなくSVGを描画することであることを考えると、少しぼやけて暮らせると思います。Points
間のおおよその等価性を定義する2つの関数を定義しました。clockface
パッケージディレクトリの下に、(confusingly)、clockface
という新しいディレクトリを追加します。そこにSVGをビルドするバイナリを作成するmain
パッケージを置きます。main.go
の中os.Stdout
に SVG を書き出しています。一度に一文字ずつ。SecondHand
関数全体は、SVGであることに結びついています...SVGWriter
から吐き出される文字に、特定の時間に予想されるSVGタグのようなものが含まれていることをテストしてみることができます。例えば:zek
そのハードワークのすべてを自動化するプログラム。 さらに良いことに、https://www.onlinetool.io/xmltogo/にオンラインバージョンがあります。ファイルの上部から1つのボックスにSVGを貼り付けるだけです。SVG
に変更するなど)必要がある場合は、これを調整できますが、最初から十分です。clockface.SVGWriter
の出力をbytes.Buffer
に書き込み、次にUnmarshall
をSvg
に書き込みます。次に、Svg
内の各Line
を見て、それらのいずれかが期待されるX2
およびY2
値を持っているかどうかを確認します。 一致した場合、早期に(テストに合格)します。そうでない場合、(うまくいけば)情報メッセージで失敗します。SVGWriter
を書くほうがいいようです...%f
フォーマットディレクティブは、座標をデフォルトの精度レベル(小数点以下6桁)に出力します。座標に期待する精度のレベルを明示する必要があります。小数点第3位としましょう。main
関数を短くすることができます。x1
値はどうですか?x1
などの属性は実際には「文字列」ではないのですか?彼らはzak
によって生成された空のText
ノード?Svg
構造体とテストにいくつかの調整を加えましょう。Line
とCircle
string
ではなくfloat64
に変更しました。Style
や Text
などの未使用の属性を削除Svg
はSVG
に名前が変更されました。containsLine(line Line, lines []Line) bool
を記述して、これらのテストを本当に輝かせることができます。