在更具标志性的xkcd片段之一中,Randall Munroe在叙述图表中可视化了几部电影的时间表:
资料来源:xkcd 657号。
给定电影时间线的规格(或其他一些叙述),您将生成这样的图表。这是一次人气竞赛,因此(净)票数最多的答案将获胜。
最低要求
为了进一步规范,这是每个答案必须实现的最少功能集:
输入一个字符名称列表,然后是一个事件列表。每个事件要么是垂死的字符列表,要么是字符组列表(表示当前在一起的字符)。这是侏罗纪公园叙述如何编码的一个示例:
["T-Rex", "Raptor", "Raptor", "Raptor", "Malcolm", "Grant", "Sattler", "Gennaro", "Hammond", "Kids", "Muldoon", "Arnold", "Nedry", "Dilophosaurus"] [ [[0],[1,2,3],[4],[5,6],[7,8,10,11,12],[9],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10,11,12],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10],[11,12],[13]], [[0],[1,2,3],[4,7,5,6,9],[8,10,11,12],[13]], [[0,4,7],[1,2,3],[5,9],[6,8,10,11],[12],[13]], [7], [[5,9],[0],[4,6,10],[1,2,3],[8,11],[12,13]], [12], [[0, 5, 9], [1, 2, 3], [4, 6, 10, 8, 11], [13]], [[0], [5, 9], [1, 2], [3, 11], [4, 6, 10, 8], [13]], [11], [[0], [5, 9], [1, 2, 10], [3, 6], [4, 8], [13]], [10], [[0], [1, 2, 9], [5, 6], [3], [4, 8], [13]], [[0], [1], [9, 5, 6], [3], [4, 8], [2], [13]], [[0, 1, 9, 5, 6, 3], [4, 8], [2], [13]], [1, 3], [[0], [9, 5, 6, 3, 4, 8], [2], [13]] ]
例如,第一行表示在图表的开头,T-Rex是一个孤独者,三个猛龙队在一起,马尔科姆一个人,格兰特和萨特勒在一起,依此类推。倒数第二个事件意味着其中两个猛龙队死亡。
只要可以指定此类信息,您将如何精确地期望输入取决于您。例如,您可以使用任何方便的列表格式。您还可以期望事件中的字符再次成为完整的字符名称,等等。
您可以(但不必)假设每个组列表在一个组中都包含每个活动角色。但是,你应该不会假设组或角色中一个事件是特别方便的顺序。
渲染到屏幕或文件(作为矢量或光栅图形)的图表,每个字符有一行。每行必须在行的开头标记一个字符名称。
- 对于每个正常事件,必须按顺序排列图表的某些横截面,在其中,各组字符通过其各自线条的接近度而清晰地相似。
- 对于每个死亡事件,相关字符的行必须以可见的斑点结尾。
- 你不会有繁殖Randall的地块的其他任何功能,也不必重现他的绘画风格。带有急转弯的直线全部为黑色,没有进一步的标签,而且标题非常适合参加比赛。也不需要有效利用空间-例如,只要有明确的时间方向,就可以只向下移动行以与其他字符会合,从而有可能简化算法。
我添加了一个参考解决方案,它完全满足了这些最低要求。
使它漂亮
不过,这是一场人气竞赛,因此,最重要的是,您可以实现自己想要的任何幻想。最重要的增加是一种体面的布局算法,该算法使图表更清晰易读-例如,使线条的弯曲更易于跟踪,并减少了必要的线交叉数量。这是此挑战的核心算法问题!投票将决定您的算法在保持图表整洁方面的性能。
但是,这里还有其他一些想法,其中大多数是根据Randall的图表得出的:
装饰物:
- 彩色的线条。
- 地块的标题。
- 标签线末端。
- 自动重新标记经过繁忙部分的线路。
- 线条和字体的手绘样式(或其他样式?如我所说,如果您有更好的主意,则无需复制Randall的样式)。
- 时间轴的可自定义方向。
附加表现力:
- 命名的事件/组/死亡。
- 线条消失和重新出现。
- 字符进入较晚。
- 突出显示字符的属性(可转让?)(例如,请参阅LotR图表中的戒指持有者)。
- 在分组轴上编码其他信息(例如,类似于LotR图表中的地理信息)。
- 时间旅行?
- 替代现实?
- 一个角色变成另一个角色?
- 两个字符合并?(字符拆分?)
- 3D?(如果您确实走了那么远,请确保您实际上是在使用附加尺寸来可视化东西!)
- 任何其他相关特征,可能对可视化电影(或书籍等)的叙事有用。
当然,其中许多将需要额外的输入,您可以根据需要随意扩展输入格式,但是请记录如何输入数据。
请提供一个或两个示例来展示您实现的功能。
您的解决方案应该能够处理任何有效的输入,但是如果它比其他叙事更适合某些叙事,那绝对没问题。
投票标准
我没有幻想可以告诉人们他们应该如何投票,但是按照重要性顺序,以下是一些建议的准则:
- 使用漏洞,标准漏洞或其他漏洞或对一个或多个结果进行硬编码的否决答案。
- 不要对未达到最低要求的答案进行投票(无论其余答案多么奇特)。
- 首先,赞成好的布局算法。这包括不使用大量垂直空间,同时使线的交叉最小化以保持图形清晰的答案,或者设法将其他信息编码到垂直轴中的答案。可视化分组而不会造成很大的混乱,应该是这一挑战的主要重点,因此,这仍然是一场编程竞赛,其核心是一个有趣的算法问题。
- 支持可增加表达力的可选功能(即不仅仅是纯粹的装饰)。
- 最后,支持不错的演示文稿。
[[x,y,z]]
这意味着所有角色目前都在一起。但是,如果事件不包含列表,而仅包含字符,则甚至是死亡,因此在相同情况下[x,y,z]
,这三个字符将死亡。随意使用另一种格式,如果有帮助,它会明确指出某事物是死亡事件还是分组事件。以上格式仅是建议。只要您的输入格式至少具有表现力,就可以使用其他格式。