Haskell - 将坐标列表转换为ASCII图形?

3

我卡在了一道作业题上。这是作业的最后一道问题,我已经花了很长时间但进展甚微。我需要将一张图片转换成ASCII图形,其中

type Point = (Int, Int)
type Image = [Point]

我需要编写一个函数,该函数接受一张图像并返回一个字符串。输出应类似于“.|...\n.xxx.\n-+x--\n.|...\n”,在使用putStr输出时看起来如下:

.|...
.xxx.
-+x--
.|...

以“+”表示原点,“|”和“--”表示坐标轴,以“x”表示点。

图形的坐标周围应该始终有1个点的边框,因此在打印图形时,我需要了解坐标的范围。 我有一个可以获取这些信息的函数。

我还编写了一个名为split的函数,它接受一个字符串和一个整数,并在每个第n个间隔处插入“\n”。 我考虑解决这个问题的方式是创建一个带有正确轴位置的空白图形,然后将空白图形传递给新的函数以插入点。

有人可以帮助我吗?如果内容不够清楚,请告诉我需要更多的详细信息。


考虑到这是一份作业,您可能并不需要完整的解决方案。但是为了给您提供有用的提示,我们需要知道您卡在哪里了。已知坐标范围(假设您已经有了它们),您是否成功绘制出了坐标轴?首先从这个开始。 - Joachim Breitner
我会把点分成多个数组,每个数组包含相同y的所有点。这样,可以逐行单独渲染。然后您可以调用一个函数来渲染一行。该函数将必须“循环”遍历所有可能的x列表,与数组头和0进行比较,并返回相应的字符和应用于剩余数组的函数返回值。 - Alexander
@JoachimBreitner 这就是我卡住的地方。我知道我需要从坐标(minx-1,maxy+1)开始绘制,但我不知道如何检查是否碰到了轴等。 - user533507
看起来你在非常迫切地思考,试图将所有各种概念和步骤都融入一个索引计数循环中。请参考我的答案,采用一种系统性和更习惯用的方法。 - Joachim Breitner
可能是重复的问题:Haskell将点列表转换为字符串 - bheklilr
@Rothschild 你应该看一下我在标记为重复的问题中给出的答案。它应该会给你足够的线索来解决这个问题。如果你需要更多的帮助,只需询问 =) - bheklilr
2个回答

1
这里有一些需要考虑的事情:
  • 从功能上说,什么是图像?暂时忽略边界,图像是从坐标到显示在该坐标上的任何内容的函数。尝试为图像想出类型签名。如果使用type将其称为FImage则加分。将这样的函数视为您的主要对象(记住,函数是一等公民)。
  • 作为FImage实现轴线。请注意,您不需要任何边界。这不是很棒吗?
  • 实现一个函数,它接受FImagePoint并生成具有正确位置的xFImage
  • 从点列表中找出边界。像往常一样,首先要考虑的是:这个的类型签名是什么?
  • 给定FImage和边界,生成最终的String。您可能想在这里使用列表推导式。
  • 把它们全部放在一起。这里隐藏了一个折叠!其中一个参数将是点列表。其他参数是什么(基本情况和组合函数)。在Haskell专业水平上,不要太担心它是foldl还是foldr,两者都可以(如果类型匹配)。
  • 完成 :-)

愉快的学习!


0

看到有人诚实地将他们的问题标记为作业,这是很好的。

  • 如果您知道图像的尺寸,您知道如何遍历坐标吗?
  • 您知道如何按照在图像中出现的顺序对点列表进行排序吗?
  • 在此基础上,您知道如何组织每个坐标和点列表的处理以按出现顺序排序吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接