这种挑战的目标是产生一个的动画链驱动系统中,由一组中的链轮的齿轮通过一个连接在一起的链。
一般要求
您的程序将获得链轮的列表,指定为(x, y, radius)
三重轮。将所得的链驱动系统由这些链轮,由连接在一起的闭合绷紧链越过它们各自,为了。您的目标是制作无限循环的动画,以显示运动中的系统。例如,给定输入
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
,输出应类似于
。
的坐标系统应该是这样的x轴右点,和y轴指向上。您可以假定半径是大于或等于8的偶数(我们稍后将说明为什么如此)。您还可以假定至少有两个链轮,并且链轮彼此不相交。该单位的输入不是太关键。这篇文章中的所有示例和测试用例都使用像素作为输入单位(例如,上图中的中间链轮的半径为24像素;)请尽量不要与这些单位偏离太多。在其余的挑战中,空间量应理解为与输入相同的单位-请确保比例正确!输出的尺寸应略大于所有链轮的边界框,并应足够大以使整个系统可见。尤其是,链轮的绝对位置不应影响输出。仅它们的相对位置应该如此(例如,如果我们将上述示例中的所有链轮偏移相同的量,则输出将保持不变。)
链条应在所有接触点处都与链轮相切,并在其他任何地方笔直。链条应越过链轮,以使相邻的链段(即,两个链轮之间的链的一部分,在同一链轮上相遇)不会相交。
。
例如,虽然上面的左系统有效,但中间的系统无效,因为经过左下链轮的两个相邻链节相交。但是,请注意,正确的系统是有效的,因为两个相交的链段不相邻(不过,该系统由与其他两个不同的输入产生)。
为了使事情简单化,您可以假定没有链轮与其两个相邻链轮的凸包或每个邻居和另一个邻居的凸包相交。换句话说,下图中的上链轮不得与任何阴影区域相交。
链段可能与链轮相交,而不是与链轮相交(例如,在最后一个测试案例中)。在这种情况下,链条应始终出现在链轮的前面。
视觉要求
链条应包括一系列宽度互不相同的链节。窄链接的宽度应约为2,宽链接的宽度应约为5。两种类型的链接的长度应大致相等。该期链的宽/窄对的总长度应该是最接近4π的数字,该整数适合链长度的整数倍。例如,如果链的长度为1,000,则其周期应为12.5,这是最接近4π(12.566 ...)的数字,该整数适合1,000中的整数倍(80)。重要的是,该时间段必须在链长中适合整数倍,以便在链缠绕的点处没有伪影。
半径为R的链轮应包括三个同心部分:中心轴,其半径应为3左右;的链轮的身体,围绕轮轴,这应该是大约半径的圆- [R - 4.5; 和链轮的轮辋,在车身周围,半径应为
R -1.5。轮辋还应包含链轮齿,其宽度应约为4;齿的大小和间距应与链节的大小匹配,以使它们整齐地啮合。
链轮齿的周期,即沿链轮圆周的两个连续齿之间的距离,应与链条的周期匹配。由于周期大约为4π,并且由于链轮的半径保证是均匀的,因此该周期应适合链轮圆周的次数几乎为整数,因此在链轮的牙齿缠绕。
您可以对链条,链轮的不同部分和背景使用任何颜色组合,只要可以轻松区分即可。背景可能是透明的。本文中的示例 #202020
用于链条, #868481
链轮的轴和轮辋以及 #646361
链轮的主体。
动画要求
输入列表中的第一个链轮应该顺时针旋转 ; 其余链轮应相应旋转。链条应以每秒约16π(约50个)单位的速度运动;帧速率取决于您,但是动画应该看起来足够平滑。
动画应无缝循环。
符合标准
某些视觉属性和比例是有意仅粗略指定的-您不必完全匹配它们。程序的输出不必是此处给出的示例的像素到像素的副本,但是它看起来应该相似。特别是,链条和链轮的确切比例以及链节和链轮齿的确切形状都是灵活的。
以下是最重要的几点:
- 链条应按输入顺序从正确的方向经过链轮。
- 链条在所有接触点均应与链轮相切。
- 链条的链节和链轮的齿应整齐地啮合,至少要保持正确的间距和相位。
- 链节和链轮齿之间的间距应确保在它们缠绕的点处没有明显的伪影。
- 链轮应沿正确的方向旋转。
- 动画应无缝循环。
最后要说明的是,从技术上讲,此挑战的目标是编写最短的代码,如果您想发挥创造力并产生更精致的输出,请务必尝试!
挑战
如上所述,编写程序或函数,获取链轮的列表,并生成相应的链传动系统动画。
输入输出
你可以采取输入通过命令行,通过STDIN,作为函数参数,或使用等效方法。您可以使用任何方便的格式进行输入,但是请确保在您的帖子中指定该格式。
作为输出,您可以直接显示动画,生成动画文件(例如,动画GIF),或生成一系列帧文件(但是,在这种情况下要付出很小的代价;请参阅下文。)如果您使用文件输出,确保帧数合理(本文中的示例使用的帧数很少;)帧数不必一定要最小,但是您不应产生太多多余的帧。如果输出一系列帧,请确保在帖子中指定帧速率。
得分
这是代码高尔夫球。在简短的回答,以字节为单位,胜。
+ 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)