定义多边形的绘制顺序

问题描述

我在等距工作。我有一组形成特定身体的多边形。多边形由一些坐标为 x、y 和 z 的点组成,它们在同一平面上。多边形彼此不相交。绘制时,我想确保首先绘制最远的多边形,然后绘制靠近的多边形(这样近的多边形似乎与最远的多边形重叠)。我试图通过点坐标之和的算术平均值对多边形进行排序,通过点坐标之和最大的点,依此类推。但在某些情况下,这并没有得到预期的结果。如何确定绘制多边形的顺序,以便最后绘制最近的多边形?

enter image description here

解决方法

好消息是,您的多边形是平面的并且彼此不相交。通过这种方式,每个多边形在它们的角可以找到的最小和最大深度之间扩展。使用几乎所有的 3D 到 2D 投影方法(如描述的 here),在变换每个点之后,得到一个 3D 点。这些点的第一个和第二个坐标用于二维绘图,第三个坐标被丢弃。第三个坐标表示点的深度,可用于对多边形进行排序。

当不能使用 Z-buffer 时,要手动绘制 3D 对象,多边形必须按其最大深度和最小深度排序。但是在实现排序算法时,必须注意floating point errors。假设为每个多边形计算角的最小和最大深度。排序算法可能是这样的:

for i = 0 to n-2
  for j = i+1 to n-1
    if (p[j].MaxD < p[i].MaxD - eps) or 
       ((abs(p[j].MaxD - p[i].MaxD)<eps) and
        (p[j].MinD < p[i].MinD - eps)) then
        swap(p[i],p[j])
    end if
  end for
end for
        

,其中 eps 是一个非常小的正值,例如1e-10