【发布时间】:2015-10-04 19:38:03
【问题描述】:
我正在尝试检查两个法线向量是否相等。我的法线向量表示为一个三元素列表,每个空间坐标(X、Y 和 Z)一个元素。所有坐标均四舍五入到小数点后 4 位。我想检查两个表面是否具有相同的法线,所以我有如下内容:
if (surface1.normal in [surface2.normal, self.NegatedNormal(surface2.normal)]):
# do stuff here
问题是我的法线看起来像这样:
surface1.normal: [0.9947, 0.0155, 0.1015]
surface2.normal: [0.9947, 0.0155, 0.1014]
请注意,z 坐标偏离了 0.0001。那么有没有一种方法可以覆盖等于运算符以接受彼此在 0.0001 范围内的答案,这与其他数据结构中的比较(如我的情况中的列表)兼容?我有一种感觉,我必须编写自己的 __eq__ 方法,但我不太确定该怎么做。
另外,如果这不是最好的做法,他们是比较给定公差内的两个浮动列表的更好方法吗?
【问题讨论】:
-
您可以编写一个继承自常规浮点数的自定义浮点数对象,但为其运算符编写您自己的函数(例如
__ge__() is >=) -
@SuperBiasedMan 这是一个有趣的方法。不幸的是,这需要重构大量代码,所以我犹豫是否尝试,但我不知道您可以从原始类型继承,所以这对未来有好处。
-
是的,你基本上可以创建一个原语的子类,然后只覆盖你想要表现不同的函数。
-
@SuperBiasedMan 建议的几乎是最佳选择。只需创建您的自定义
normal类并覆盖比较方法。示例here.
标签: python overriding comparison-operators