我正在尝试在scala中实现Boids植绒算法,以便学习和改进我的函数式编程。
我遇到了绘制鸟类可以移动的'画布'的问题。每当我们打印它们的位置时,我需要使用表示boid的“B”更新画布。
Vector2D代表我自己实现的2D矢量,它只包含x和y位置。
以下解决方案仅打印出有boid的行(即Vectors),并对其进行重复处理。例如,如果传递了3个boids的列表进行绘制,那么将创建9个向量。
需要创建矢量的画布边界量(本例中为10),其中包括有boid的行和不存在的行。
在更通用的形式中,我有一个包含特定值的boundary.x量的Vectors的IndexedSeq。我需要做的是在该向量中的某个位置更新IndexedSeq中的Vector。因此,如果我需要更新(1,1),那么我需要在它的位置1更新序列中的第二个向量。
我很有可能错过了一些明显的东西,所以对这个主题的任何帮助都会非常感激。
干杯,
大卫
object Canvas{
val boundary = Vector2D(10,10)
require(boundary.x == boundary.y)
def draw(boids: List[Boid]) = {
val lines = for{
col <- 0 until boundary.x
position <- boids.map(_.position)
} yield Vector.fill(boundary.x)("* ").updated(position.x, "B ")
"\n" + (lines mkString "\n")
}
}
case class Boid (position: Vector2D, velocity: Vector2D){
def this() = this(Vector2D.random,Vector2D.random)
}
case class Vector2D(x: Int, y: Int)