检查Java对象的唯一性,在一些epsilon中

检查Java对象的唯一性,在一些epsilon中,java,hashtable,Java,Hashtable,我试图通过检查顶点的唯一性来修剪3D网格。但由于每个顶点都有某种与之相关的误差,两个“相似”的顶点实际上可能是相同的。e、 g 可以是与相同的顶点 我需要检查数以百万计的顶点,所以我要把所有的对象放到一个哈希表中并进行查询,看看它们是否唯一。覆盖等质量很容易:取两个坐标之间差值的绝对值除以1的大小。例如: if(Math.abs((x2-x2)/x1)

我试图通过检查顶点的唯一性来修剪3D网格。但由于每个顶点都有某种与之相关的误差,两个“相似”的顶点实际上可能是相同的。e、 g

可以是与相同的顶点

我需要检查数以百万计的顶点,所以我要把所有的对象放到一个哈希表中并进行查询,看看它们是否唯一。覆盖等质量很容易:取两个坐标之间差值的绝对值除以1的大小。例如:

if(Math.abs((x2-x2)/x1)<0.0000001)返回true

但是,我怎样才能得到一个哈希代码,对于两个实际上相等但并不完全相等的顶点返回相同的值呢

我考虑过量化空间,也就是说,将整个场景中的地板精确到小数点。但是,在我上面的例子中,我会转到,例如

但是,我怎样才能得到一个哈希代码,对于两个实际上相等但并不完全相等的顶点返回相同的值呢

简言之,这是不可能的

如果所有
x
hashcode(x)==hashcode(x+eps)
,那么
hashcode(x+eps)==hashcode(x+2*eps)
也是正确的

满足此要求的唯一方法是
int hashcode(){return CONSTANT;}
,它的用途有限


因此,您的
equals()
方法也有缺陷。要求它是可传递的,即如果
a.equals(b)
b.equals(c)
,那么
a.equals(c)
,对于任何
a
b
c
。你的定义并非如此


这将导致各种微妙的地狱,因为许多标准Java集合等都依赖于此。

在将顶点放入地图之前,对数字进行四舍五入可能会更稳健。