Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是否可以比较<;对象>;最大/最小交叉比较失败?_Java_Algorithm_Graphics_3d - Fatal编程技术网

Java是否可以比较<;对象>;最大/最小交叉比较失败?

Java是否可以比较<;对象>;最大/最小交叉比较失败?,java,algorithm,graphics,3d,Java,Algorithm,Graphics,3d,我正在研究一个深度排序问题,下面是我构建的一个示例 有两个平面,一个在另一个上方悬停,它们被分割成矩形多边形。每个多边形由其“真实世界”坐标定义,并通过摄影机和视图投影定义,以生成透视图,如图所示。生成示例多边形的跟踪打印输出 Zn = -0.225, Zf = -0.432 v0 (13, 33, 32.7) (-0.358, -0.065, -0.295, 180.737) v1 (29, 33, 32.7) (-0.192, -0.142, -0.225, 173.247) v2 (29

我正在研究一个深度排序问题,下面是我构建的一个示例

有两个平面,一个在另一个上方悬停,它们被分割成矩形多边形。每个多边形由其“真实世界”坐标定义,并通过摄影机和视图投影定义,以生成透视图,如图所示。生成示例多边形的跟踪打印输出

Zn = -0.225, Zf = -0.432
v0 (13, 33, 32.7) (-0.358, -0.065, -0.295, 180.737)
v1 (29, 33, 32.7) (-0.192, -0.142, -0.225, 173.247)
v2 (29, 33,  7.2) ( 0.011,  0.023, -0.375, 190.239)
v3 (13, 33,  7.2) (-0.148,  0.087, -0.432, 197.730)
该样本属于绿色平面
y=33
,非投影顶点为
v0到v4=(13,33,32.7)、(29,33,32,7)、(29,33,7.2)和(13,33,7.2)

使用标准相机和视图模型的投影坐标如下所示。如果投影坐标为
p(i)
,则
-1
。第四个值是准备渲染时的同质W坐标,分为每个
p(i)(x,y,z)
,它保留为参考值,因为它给出了从“相机”到给定顶点垂直平面的距离

第二系列括号中的第三列是投影的Z值,对于这个问题,重要的是值
Zn=最近顶点的深度
,和
Zf=最远顶点的深度

问题
这个问题的动机是上述所有内容,但也与图形渲染的任何知识无关。我的动机是主要根据四边形的Z值对其进行深度排序

根据对两个多边形之间渲染顺序的第一次检查,如果Z-near和Z-far是分离的,则应意味着明确的空间分离

比较的简化摘录

类范围实现可比较{
双锌;
双Zf;
@凌驾
公共int比较(扩展区ext2){
如果(Zn
我的问题
当我对一大组多边形进行比较时,有时会得到一个
java.lang.IllegalArgumentException:比较方法违反了其一般约定
exception。虽然渲染效果通常与上面一样好,但有时会失败。但为什么,我一直无法找到一个失败的案例,而且用这种方式比较两个最大值和最小值不应该总是暂时的吗


有人知道这样一个比较会失败的例子吗?也许,你能在我的方法中发现一个逻辑错误吗?(虽然比较方法内部的洞察是主要查询,但如果您熟悉3d深度排序,请随时发表评论)

由于传递性失败,您的算法将无法满足要求;您没有定义总的顺序。考虑三<代码>扩展< <代码>

p1(0,3)p2(0,1)p3(2,3)

实施者必须确保
p1.compareTo(p2)==0
意味着
sgn(p1.compareTo(p3))==sgn(p2.compareTo(p3))
用于所有其他点

p1。与(p2)
相比为0。
p1.compareTo(p3)
为0,但
p2.compareTo(p3)
为-1


对范围进行排序的“最佳”方式将取决于您对已排序列表的具体操作,但您很可能最终会选择“近”或“远”进行排序,或中心值。

您应该使用外部的
比较器进行比较,而不是尝试实现
可比较的
,这对于复杂对象几乎总是错误的方法

Comparable
适用于具有单个或极少数属性的对象,这些属性在所有情况下都需要相同。就像一个复杂的对象,它的ID是唯一的,这是唯一可以比较的东西

它不适用于复杂的情况,即并非所有情况下都考虑所有属性。在这些情况下,您可以使用
比较器
或更好的比较器,以便进行优雅的链接和合成


此外,对三角形进行排序使此练习变得微不足道,因为它们永远不会是非平面的,并且可以少比较一点。

我发现你的答案很有用,最后给了你一个加号,appreciated@Andreas为了澄清,所描述的异常是对
Collections.sort(polygons)的调用
其中
列表的多边形实例
。界面范围的含义是几何体与观察者之间的距离。关于问题陈述的减少,事后来看,问题的减少(如下面的答案)主要是解决方案——如果我发现了,建议是你的功劳。标记为
algorithmic/graphics/3d
,这个问题也许应该被命名为
为什么给定的排序方案是非传递的
之前标记了(+),表示了迟到的感谢,OpenGL抢占了您的lib推荐,并提醒您注意其他用途!