Scala编程:规范化长度为0的3D矢量

时间:2014-05-04 18:47:29

标签: scala vector normalization

这是我的第一次访问所以请不要讨厌我,如果这个帖子很糟糕的话。是的,我已经问了谷歌,也在这里看了看。

所以:我需要规范化3D矢量。有一个函数,它接受向量并返回一个新的规范化向量。到目前为止没有问题 - 只要他们的长度是0我得到(NaN,NaN,NaN)。 Vector规范化通常对长度为0的向量做什么?可以只检查0的长度并返回(0.0,0.0,0.0)?

THX

1 个答案:

答案 0 :(得分:1)

向量归一化是一个部分函数 - 它只是没有在空向量上定义。你想如何模拟这种不确定性是一个设计决定,你在Scala中有很多选择。最明显的是只使用Double进行数学运算并使用结果NaN,以便(NaN, NaN, NaN)表示未定义。另一种方法是使用适当的部分函数:

val normalize: PartialFunction[Point, Point] = {
  case p if p.magnitude > 0 => ...
}

如果您尝试规范化空矢量,现在您将获得MatchError异常。

如果将null向量作为输入给出,您还可以使用抛出异常的普通方法(或函数)。这使您可以更好地控制异常消息等,但也意味着您失去了Scala中PartialFunction提供的一些额外便利。

您还可以使用返回Option[Point]的方法:

def normalize(p: Point): Option[Point] = if (p.magnitude == 0.0) None else Some(
  ...
)

依此类推,有很多方法可以模拟未定义,为程序选择最好的方法将是平衡性能,正确性,用例的便利等问题。

最后 - 如你所说,你可以为normalize编写一个特殊情况,将空向量映射到自身,但请注意,这将打破输出始终为单位向量的不变量。再说一次,也许这很好,但需要注意的事项。