c++ 仅使用矩阵按深度排序。可能的?

Posted

技术标签:

【中文标题】c++ 仅使用矩阵按深度排序。可能的?【英文标题】:c++ sorting by depth using only a matrix. Possible? 【发布时间】:2010-08-23 13:17:27 【问题描述】:

如果我有一个包含旋转/平移矩阵的对象的 std::vector,有没有办法可以使用该矩阵来计算 Z 位置,以便我可以按深度对对象进行排序?

【问题讨论】:

等等,向量是平移/旋转矩阵还是向量是包含 Z 信息的对象的向量? 【参考方案1】:

简答:

沿矩阵[3][2]排序,这是对象中心的 z 位置(在世界空间中)。

长答案:

在齐次坐标中,位置是 (x,y,z,1)(与方向相反的是 (x,y,z,0),我们稍后会看到)

要将您的点从一个空间转换到另一个空间,请将其乘以转换矩阵。因此,如果您想通过矩阵变换对象的中心,即 (0,0,0,1),则唯一剩下的项是矩阵的右列。 z 分量是第三个。

有了方向,w=0,所以右列(保存平移)将乘以 0。这意味着:平移方向不会改变方向,这是有道理的。

显然,如果对对象的中心进行排序,两个靠近的对象可能会重叠。

【讨论】:

【参考方案2】:

猜测你在问什么:

如果您有一个变换向量(即 4x4)矩阵,则 Z 分量位于矩阵的平移分量中。它应该是 (row,col) = 2,3 或 3,2,具体取决于您的约定。

例如:

1 0 0 0  <-- x position
0 1 0 0  <-- y position
0 0 1 0  <-- z position
0 0 0 1

【讨论】:

抱歉,我知道我的术语还有很多不足之处。所以你说如果我再次旋转、平移、旋转和平移,我可以使用矩阵的索引 2,3 来判断对象的深度? 不,我是说对象的变换矩阵定义了它的高度。【参考方案3】:

定义所需的排序,然后像this example 那样使用std::sort。

根据评论更新:

您似乎要问的核心问题是如何定义您用作排序基础的排序。如果您的对象是单点,那么您应用相应的变换(如果您没有预先计算/momoized 它)并对结果向量的 Z 分量进行排序。

如果您的对象由多个点组成,则会变得更加困难。在这种情况下,您将需要定义与每个对象关联的合适的代理单点位置,然后您可以将其用作排序的基础。由于对象本质上是多点的,因此在某些情况下,任何替代单点表示都可能提供较差的结果。但是,如果对象都是简单的平面多边形,除了沿边或顶点之外不相交,那么您可以将每个多边形的顶点位置平均到一个用作合适代理的点。该方法也很好地扩展到非相交凸多面体。如果对象变得过于复杂,那么您要么必须将它们分解为不相交的正多边形或凸多面体并对其进行排序,要么接受并不总是正确。

【讨论】:

对不起,我不是在问如何对向量进行排序,而是如何从矩阵生成深度值以对向量进行排序 @michael:根据您的评论更新。【参考方案4】:

如果我理解,您可能可以使用排序谓词来做到这一点。

Matrix transMatrix;

struct DepthSorter

    DepthSorter(const Matrix& matrix) : matrix_(matrix) 
    bool operator()(const Obj& obj1, const Obj& obj2)  return matrix_->translate(obj1) < matrix_->translate(obj2); 
;

std::vector<Obj> objs;

std::sort(objs.begin(), objs.end(), DepthSorter(transMatrix));

【讨论】:

以上是关于c++ 仅使用矩阵按深度排序。可能的?的主要内容,如果未能解决你的问题,请参考以下文章

使用vector<vector<int>> c ++按它们的总和对二维矩阵进行排序?

矩阵中要删除的最少列以使其按行按字典顺序排序

华为机试真题 C++ 实现矩阵最大值

C++ 不知图系列之基于邻接矩阵实现广度深度搜索

对矩阵按行和按列进行排序

在r中按多列排序矩阵