この課題の目標は、チェーンで接続されたスプロケットギアのセットで構成されるチェーンドライブシステムのアニメーションを作成することです。
一般的な要件
プログラムには、トリプレットとして指定されたスプロケットのリストが与えられ(x, y, radius)
ます。得られたチェーン駆動システムによって互いに接続され、これらのスプロケット、から構成されている閉鎖ピンと張っ鎖、それらの各々を通過するために。あなたの目標は、無限ループのアニメーションを生成し、システムが動いていることを示すことです。例えば、与えられた入力
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
、出力は次のようになります
。
座標系は、右のX軸点、及びy軸はアップポイントようなものであるべきです。半径が 8以上の偶数であると仮定することもできます(これが後で問題になる理由がわかります)。また、スプロケットが少なくとも2つあり、スプロケットが互いに交差しないと仮定することもできます。ユニット入力の重要性はあまり高くありません。この投稿のすべての例とテストケースでは、入力単位としてピクセルを使用しています(たとえば、前の図の中央のスプロケットの半径は24ピクセルです)。これらの単位から大きく逸脱しないようにしてください。課題の残りの部分では、空間量は入力と同じ単位で与えられると理解されます-比率を正しく保つようにしてください!出力の寸法は、すべてのスプロケットの境界ボックスよりわずかに大きく、システム全体が見えるように十分大きくする必要があります。特に、スプロケットの絶対位置は出力に影響しないはずです。相対的な位置のみが必要です(たとえば、上記の例ですべてのスプロケットを同じ量だけシフトした場合、出力は同じままになります)。
チェーンは、あるべき接線それは接触のすべての点で上を通過し、スプロケットにまっすぐ他のどこでも。チェーンは、隣接するチェーンセグメント(つまり、同じスプロケットで出会う2つのスプロケット間のチェーンの部分)が互いに交差しないようにスプロケットを通過する必要があります。
。
たとえば、左上のスプロケットを通過する2つの隣接するチェーンセグメントは交差するため、上の左のシステムは有効ですが、中央のシステムは無効です。ただし、2つの交差するチェーンセグメントは隣接していないため、正しいシステムが有効であることに注意してください(ただし、このシステムは他の2つとは異なる入力によって生成されます)。
物事を単純(r)に保つために、スプロケットがその2つの隣接するスプロケットの凸包、またはその隣人と他の隣人のそれぞれの凸包と交差しないと仮定することができます。言い換えれば、下の図の上部のスプロケットは、影付きの領域と交差しない場合があります。
チェーンセグメントは、通過するスプロケット以外のスプロケットと交差する場合があります(最後のテストケースなど)。この場合、チェーンは常にスプロケットの前に表示されます。
視覚的要件
チェーンは、交互の幅の一連のリンクで構成する必要があります。幅の狭いリンクの幅は約2、幅の広いリンクの幅は約5である必要があります。両方のタイプのリンクの長さはほぼ等しいはずです。期間チェーンの長さ、つまり、リンクの幅の広いペアと狭いペアの合計の長さは、チェーンの長さの整数倍に適合する4πに最も近い数でなければなりません。たとえば、チェーンの長さが1,000の場合、その周期は12.5である必要があります。これは、1,000の整数回(80)に適合する4π(12.566 ...)に最も近い数値です。チェーンが折り返されるポイントにアーティファクトがないように、期間がチェーンの長さに整数回適合することが重要です。
半径Rのスプロケットは、3つの同心円状の部分で構成される必要があります。中心軸、半径約3の円である必要があります。車軸の周りのスプロケットのボディ、R -4.5の半径の円である必要があります。そして、スプロケットのリム約半径の円であるべき本体の周りに、
R - 1.5。また、リムにはスプロケットの歯が含まれている必要があります。歯の幅は約4です。歯のサイズと間隔は、チェーンリンクのサイズと一致している必要があります。
スプロケットの歯の周期、つまりスプロケットの円周に沿った2つの連続する歯の間の距離は、チェーンの周期と一致する必要があります。周期は約4πであり、スプロケットの半径は均一であることが保証されているため、周期はスプロケットの円周にほぼ整数回収まる必要があり、その結果、顕著なアーティファクトが発生しないはずです。スプロケットの歯が回ります。
簡単に区別できる限り、チェーン、スプロケットのさまざまな部分、および背景に任意の色の組み合わせを使用できます。背景は透明かもしれません。この投稿の例では、チェーン、スプロケットの車軸とリム、スプロケットのボディに使用しています。 #202020
#868481
#646361
アニメーションの要件
入力リストの最初のスプロケットは時計回りに回転するはずです。残りのスプロケットはそれに応じて回転するはずです。チェーンは、毎秒約16π(約50)ユニットの速度で移動する必要があります。フレームレートはあなた次第ですが、アニメーションは十分に滑らかに見えるはずです。
アニメーションはシームレスにループする必要があります。
適合性
視覚的な属性と比率の一部は、大まかにのみ意図的に指定されています。正確に一致させる必要はありません。プログラムの出力は、ここに示した例のピクセルごとの複製である必要はありませんが、似ているはずです。特に、チェーンとスプロケットの正確な比率、およびチェーンのリンクとスプロケットの歯の正確な形状は柔軟です。
従うべき最も重要な点は次のとおりです。
- チェーンは、正しい方向から入力順にスプロケットを通過する必要があります。
- チェーンは、すべての接触点でスプロケットに接する必要があります。
- チェーンとスプロケットの歯のリンクは、少なくとも正しい間隔と位相まできれいに噛み合う必要があります。
- チェーンのリンクとスプロケットの歯の間の間隔は、それらが巻き付く点で顕著なアーティファクトがないようにすべきです。
- スプロケットは正しい方向に回転するはずです。
- アニメーションはシームレスにループする必要があります。
最後の注意点として、技術的には、このチャレンジの目標は最短のコードを書くことです。もしあなたが創造的になり、より精巧な出力を生成したいと思うなら、ぜひやってください!
チャレンジ
上記のように、スプロケットのリストを取得し、対応するチェーンドライブシステムアニメーションを生成するプログラムまたは関数を作成します。
入出力
入力は、コマンドライン、STDIN、関数の引数、または同等の方法を使用して取得できます。入力には便利な形式を使用できますが、投稿で必ず指定してください。
出力、あなたは可能直接アニメーションを表示、生成アニメーションファイル(例えば、アニメーションGIF)を、または生成フレームファイルのシーケンスを(ただし、この場合は小さなペナルティがあります。下記参照。)ファイル出力を使用する場合は、フレーム数が適切であることを確認してください(この投稿の例ではごく少数のフレームを使用しています)。フレーム数は最小限である必要はありませんが、余計なフレームを多く作成しないでください。フレームのシーケンスを出力する場合は、投稿でフレームレートを指定してください。
スコア
これはcode-golfです。バイト単位の最短回答が勝ちです。
+ 10%ペナルティ プログラムが出力としてフレームのシーケンスを生成する場合、アニメーションを直接表示したり、単一のアニメーションファイルを生成したりする代わりに、スコアに10%を追加します。
テストケース
テスト1
(0, 0, 26), (120, 0, 26)
テスト2
(100, 100, 60), (220, 100, 14)
テスト3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
テスト4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
テスト5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
テスト6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)