这是我的第一次访问所以请不要讨厌我,如果这个帖子很糟糕的话。是的,我已经问了谷歌,也在这里看了看。
所以:我需要规范化3D矢量。有一个函数,它接受向量并返回一个新的规范化向量。到目前为止没有问题 - 只要他们的长度是0我得到(NaN,NaN,NaN)。 Vector规范化通常对长度为0的向量做什么?可以只检查0的长度并返回(0.0,0.0,0.0)?
THX
答案 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
编写一个特殊情况,将空向量映射到自身,但请注意,这将打破输出始终为单位向量的不变量。再说一次,也许这很好,但需要注意的事项。